Re: [問題] 關於Teamwork上的問題

看板OOAD作者 (null)時間14年前 (2010/08/17 23:59), 編輯推噓2(203)
留言5則, 2人參與, 最新討論串2/2 (看更多)
很開心你有注意到這個問題, 以我個人來說,我是到了正式進入工作後, 才漸漸意識到我寫的東西很難跟別人放在一起用。 因為過去學習程式語言的書本, 一開始都著重在語法的學習, 還有寫一些 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
public String[] getAllPages(String albumUrl);
08/18 00:31, 1F

08/18 00:32, , 2F
也可以丟出一個 iterator, 這又是一個 pattern XD
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
文章代碼(AID): #1CQh79ak (OOAD)
文章代碼(AID): #1CQh79ak (OOAD)