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

请输入看板名称,例如:e-shopping站内搜寻

TOP