OOAD 板


LINE

____________________ AVOID PREMATURE INHERITANCE Inheritance needs time to evolve. ﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉ ※ 節錄自 Prefactoring 第 63 頁 沒事不要繼承,繼承需要很長的時間才會演化。 (此為不負責任翻譯......) 在設計 Applet 的時候,為了切割圖形、控制、模組會採用 MVC Pattern 這邊的 MVC Pattern 是單純指圖形類別、控制類別、模組類別。 我下面所要描述的重點在控制類別,有很多人會把控制器寫成下面這個樣子: if (第一個按鈕被按下) { 做第一種事情(); } else if (第二個按鈕被按下) { 做第二種事情(); } /* ... */ else if (第 n 個按鈕被按下) { 做第 n 種事情(); } 如果有 n 個按鈕,就有 n 個 if-else 要寫。 更慘的是,如果有新的按鈕或是新的事件要加入這段程式碼又要被改寫一次 這完全違背開閉原則 (Open-Close Principle)! 一個類別設計完之後,除了繼承它或是使用它之外 不應該再度修改它內部的程式碼! 當程式設計師發現一大串的 if-else 或是 switch-case 就應該聯想到 Class Inheritance 利用類別的多型來取代難以閱讀的 if-else 或 switch-case 可以讓原來的程式碼不會被修改的情況下,新增按鈕或是事件到一個新的類別 開發需求所述的新功能! 舉例而言 (JAVA): public class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent actionEvent) { final String command = actionEvent.getActionCommand(); if ("Load Image".equals(command)) { this.loadImage(); } else if ("Histogram Equalization".equals(command)){ this.histogramEqualization(); } else if ("Mean Filter".equals(command)) { this.meanFilter(); } } } 這三個 if-else 區塊分別處理三種不同的按鈕事件 分別是讀影像、做直方圖等化、以及做平均過濾。 還好只有三個 if-else 區塊,一開始還沒什麼大不了的 但是隨著需求的改變,按鈕愈來愈多,程式碼會開始大量地成長 public class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent actionEvent) { final String command = actionEvent.getActionCommand(); if ("Load Image".equals(command)) { this.loadImage(); } else if ("Histogram Equalization".equals(command)){ this.histogramEqualization(); } else if ("Mean Filter".equals(command)) { this.meanFilter(); } /* 想像這邊以後有一大串 if-else 區塊 */ } } 這可不是開玩笑的,每次加一個按鈕就要修改原來的程式碼並不是一個好現象! 倒不如切割整個類別為多個小類別,實作同一個介面 ActionListener public class LoadImageHandler implements ActionListener { // ...... } public class HistogramEqualization implements ActionListener { // ...... } public class MeanFilter implements ActionListener { // ...... } 這樣的話,每次要新增一個按鈕或事件處理,就只要新增一個類別實作 ActionListener 不需要再修改原來的程式碼了!符合開閉原則 (Open-Close Principle) 有人會問:「那原來的 if-else 到哪裡去了?消失了嗎?」 我會回答:「可以說它消失,也可以說它還存在。 if-else 確實不見了,它原本的功能散落在不同的 ActionListener 子類別 裡。判斷的機制仍然存在,只是現在改由設定按鈕的控制器實體,而不再由 控制器自己判斷要做哪一種動作了!」 有人續問:「判斷的機制仍然存在?那有比較好嗎?」 我會回答:「加入新按鈕的時候,設定新按鈕的控制器為新的控制器, 我們加入全新的類別不會更動原類別的任何程式碼, 在物件設計的角度來看是比較好的。」 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.247.13 ※ 編輯: H45 來自: 140.116.247.13 (12/04 19:56) ※ 編輯: H45 來自: 140.116.247.13 (12/04 19:56)
1F:推 PsMonkey:總覺得標題跟後半部文章沒啥關係耶... 12/04 20:44
2F:推 godfat:btw, 這本書我想賣... 12/04 21:11
3F:推 H45:後半部文章是說明什麼是成熟的繼承。 12/04 22:21
4F:推 H45:回二樓,我覺得這本書很難讀,是有一點點想賣 XD 12/04 22:22
5F:→ godfat:我是覺得這本書有點囉唆,也沒太多新穎之處,相較refactoring 12/05 00:28
6F:→ godfat:看到一半就懶得繼續看下去了,以後大概也不會看 12/05 00:29
7F:推 H45:我和你的看法相反,覺得 Refactoring 有點囉唆,看到一半就懶 12/05 07:53
8F:推 H45:得讀下去,倒是 Prefactoring 有很多令我玩味的點子... 12/05 07:54
9F:→ godfat:那真是太有趣了 XDXD 不過我覺得有個可能原因是, 12/05 16:32
10F:→ godfat:我看 ref.. 比 pref.. 早很多,時空上有不小的差異... 12/05 16:33
11F:推 H45:真有趣 XDXD 我也讀 ref.. 比 pref.. 早很多,我覺得原因是, 12/05 16:35
12F:推 H45:我讀的 ref.. 是中文版,而 pref.. 是英文版,讀感差很多 12/05 16:37







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燈, 水草

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

TOP