Re: [问题] 关于Teamwork上的问题

楼主: qrtt1 (有些事,有时候。。。)   2010-08-17 23:59:02
很开心你有注意到这个问题,
以我个人来说,我是到了正式进入工作后,
才渐渐意识到我写的东西很难跟别人放在一起用。
因为过去学习程式语言的书本,
一开始都着重在语法的学习,
还有写一些 class 跟继承的结构。
渐渐熟悉了之后,误以为自己就是会 OO 了。
这是个美丽的错误,
实际上,整个系统是动态的。
一个 class 产生的实体(instance),在不同的系统时间点,拥有不同的状态。
所谓不同的状态,具体来说就是物件内含的资料不同。
把状态(资料)“封装”在物件里,只是初学阶段最熟知的 OO 特性。
但是,能被封装的不只是有状态。
只要你不要把封装只想成把资料藏起来,
那么在对 OO 的想法上,
就会相当地海阔天空。
由 Design Pattern 得来的启示:
你也可以封装一套流程或演算规则。
在带入了 Design Pattern 这个主题后,
书上对每个 Pattern 的介绍,都会说明 client 如何使用产出。
而 client 就是使用 class 或 library 甚至 framework 的那一个 invoke。
如果状态会改变,client 也会时不同的时机乎叫它使用的物件方法。
以 Builder Pattern 来说
http://en.wikipedia.org/wiki/Builder_pattern
图中的 Director 就是 client,它使用别人写好的 Builder。
首先,你可以确认一下,你的东西应该是要给 client 呼叫的。
也就是抓图的主程式。
我这里做个假设,假设你们的程式是要抓网络相本用的。
(这听起来跟 diggirl.net 很像不是吗?)
那你写的东西,例如是专门抓取无名相本的类别 WretchStrategy。
我们先不说他应该有什么方法,
因为这只要想清楚 client 需要什么,
那些方法就自然能够浮现了。
client 是一个相片汇入(汇入到 diggirl)的程式。
class PhotoImporter {
WretchStrategy strategy;
public void doImport(String url) { /*该做什么呢?*/ }
}
当 client 想清楚他该做些什么事时,
才能明确且完整订下 callee 的所有功能。
而 client 到该作些什么,就关系到最后要留下什么资料?
虽然,很明确地所有相片必需被存下来。
那再上一步呢?
就是所有相片的网址必需被找到。
那再上一步呢?
使用者也许给你的是任何一个单张相片的连结,
我们该把他转换成相本的主要连结。
也许是第一页或是相本特有的首页。
思考到这里,我们似乎能由一个相片的网址输入,
回推至整个流程需要做什么事了。
class PhotoImporter {
WretchStrategy strategy;
public void doImport(String url) {
String album = strategy.getAlbumPage(url);
String[] pages = strategy.getAllPages(album);
for (String page: pages) {
downloader.queue(strategy.getThumbs(page));
downloader.queue(strategy.getPhotos(page));
}
}
}
这样写完后,你会新发现。似乎还差一个 Downloader 需要实作。
还有 WretchStrategy 该加上什么功能。
如果要增加不同的相本抓取,那就是该将 WretchStrategy 抽象化的时机了。
而且要判断该用何种 Strategy 来抓取相本:
class PhotoImporter {
public void doImport(String url) {
// 判断该用那一个 Strategy 来抓取相本
IStrategy strategy = Strategy.getInstance(url);
String album = strategy.getAlbumPage(url);
String[] pages = strategy.getAllPages(album);
for (String page: pages) {
downloader.queue(strategy.getThumbs(page));
downloader.queue(strategy.getPhotos(page));
}
}
}
而一个 IStrategy 应该就像:
interface IStrategy {
public String getAlbumPage(String url);
public String[] getAllPages(String albumUrl);
public String[] getThumbs(String pageUrl);
public String[] getPhotos(String pageUrl);
}
故事说到这,其实该点出 PhotoImporter 是 Template Method Pattern。
而 IStrategy 是它的 Hook Method。
IStrategy 负责封装抓取特定相本的规则,为一个 Strategy Pattern。
如果您觉得,你写的东西没办法跟别人合起来,
那表示,制定流程的人,大概有什么少跟你说了。
试着用不同的观点去看待,把问题找出来呗 :D

Links booklink

Contact Us: admin [ a t ] ucptt.com