作者qrtt1 (null)
看板OOAD
标题Re: [问题] 关於Teamwork上的问题
时间Tue Aug 17 23:59:02 2010
很开心你有注意到这个问题,
以我个人来说,我是到了正式进入工作後,
才渐渐意识到我写的东西很难跟别人放在一起用。
因为过去学习程式语言的书本,
一开始都着重在语法的学习,
还有写一些 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
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.49.42
※ 编辑: qrtt1 来自: 61.231.49.42 (08/18 00:24)
1F:推 goodGG :public String[] getAllPages(String albumUrl); 08/18 00:31
2F:→ goodGG :也可以丢出一个 iterator, 这又是一个 pattern XD 08/18 00:32
3F:推 aecho :我觉得一起合作比较麻烦,但很重要的,是要一直沟通 08/19 07:22
4F:→ aecho :写作过程中,双方对原有问题的理解,会逐渐加深 08/19 07:23
5F:→ aecho :频繁的沟通,哪怕只是闲聊,也是很重要的。 08/19 07:23