Re: [問題] 關於Teamwork上的問題
很開心你有注意到這個問題,
以我個人來說,我是到了正式進入工作後,
才漸漸意識到我寫的東西很難跟別人放在一起用。
因為過去學習程式語言的書本,
一開始都著重在語法的學習,
還有寫一些 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)
推
08/18 00:31, , 1F
08/18 00:31, 1F
→
08/18 00:32, , 2F
08/18 00:32, 2F
推
08/19 07:22, , 3F
08/19 07:22, 3F
→
08/19 07:23, , 4F
08/19 07:23, 4F
→
08/19 07:23, , 5F
08/19 07:23, 5F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
OOAD 近期熱門文章
PTT數位生活區 即時熱門文章