OOAD 板


LINE

很開心你有注意到這個問題, 以我個人來說,我是到了正式進入工作後, 才漸漸意識到我寫的東西很難跟別人放在一起用。 因為過去學習程式語言的書本, 一開始都著重在語法的學習, 還有寫一些 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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP