java 板


LINE

※ 引述《H45 (!H45)》之铭言: : 使用装饰者的角度来看更显得怪异 : 因为Decorator Pattern是动态地将责任加诸於物件上 : 但是Square似乎没什麽更多的责任可以加诸在Rectangle上 : Square只是一种长和宽相等的Rectangle罢了 : 提不上是Rectangle的什麽装饰者 : 所以我认为用装饰者的角度来看,只是让事情更复杂化而已 其实我也觉得用 decorator 会让问题变得更加模糊难懂 回头来看 Square 和 Rectangle, 这两个东东会想怎麽操作他们? 令 Rectangle 有 setWidth 和 setHeight, 那 Square 呢?同样都有这两个操作吗? 那麽为了防止失去 Square 的特性,是否要这样实作 setWidth? public void setWidth(int num){ this.do_set_width_height(num); } public void setHeight(int num){ this.do_set_width_height(num); } private void do_set_width_height(int num){ this.width_ = this.height_ = num; } 不知道这样做有没有意义?如果 setWidth 和 setHeight 实际上做的事 根本就完全一样。假使增加这两个 method 纯粹只是为了和 Rectangle 有相似的介面,那试问,当你呼叫 setWidth 时,你会想得到 height 其实也变了? 假若让 setWidth 就单纯只是 setWidth, 那是否又违反了 Square 的前提? 丢 exception 不成?其实这同样违反了 LSP, 因为原本并不会有 exception. 个人认为,Square 和 Rectangle 之间不应存在太多关系 令 abstract class Shape{...} 则 class Rectangle extends Shape{...} 与 class Square extends Shape{...} 觉得这样比较合理一些 Rectangle 提供 setWidth 与 setHeight, 甚至 setWidthHeight(int, int); Square 仅提供 setWidthHegiht(int) 或 setSize or whatever you like 总之他们的操作介面是不一样的,因为他们的特徵会影响到其操作介面 硬要让他们有共通介面的话,就很容易出现预期外的行为 那如果 Rectangle 和 Square 之间其实有共用的程式码怎麽办? 提供一个类似 pimpl 的东西给他们共同使用即可 http://en.wikipedia.org/wiki/Opaque_pointer 这边就不针对名词做解释了,我不知道 Java 怎麽形容这种做法 写成程式码大概是这样: class Rectangle_Stuff_Implement{ // 加底线看起来比较清楚,字型关系 protected Rectangle_Stuff_Implement(){...} // 只给 Rect 和 Square 用 protected void draw(int width, int height){...} ... } class Rectangle extends Shape{ private Rectangle_Stuff_Implement imp_ = new Rectangle_Stuff_Implement(); public void draw(){ imp_.draw(this.width_, this.height_); } ... } class Square extends Shape{ private Rectangle_Stuff_Implement imp_ = new Rectangle_Stuff_Implement(); public void draw(){ imp_.draw(this.length_, this.length_); } ... } 诸如此类 不过理所当然,考虑实作前,先要想的是问题到底是什麽(problem domain) 在这个 thread 中,有人提到不是所有的车都有雨刷, 雨刷怎麽可以当汽车与机车的共同属性? 呃,我想说除非我们是在做模拟现实世界的程式, 不然,说不定他想解决的问题里,所有的汽车机车都有雨刷呢? 在游戏程式中,确实很可能会有这种事情发生,毕竟本来就不是在模拟现实 这也是为什麽我说为什麽物件导向可以被违反,更别提现实世界了 重点是问题是什麽,是不是会有这个状况出现 一股脑把现实世界放进来考虑,常常只会造成不必要的复杂性 就好像上面的例子里,也许我们根本就不在乎 Rectangle 的长宽到底是什麽 反正他就只是一种形状嘛,说不定根本没有外界可以操作的 setWidth 与 setHeight 那麽让这两者之间有着继承关系,也不见得是那麽坏的事 或是直到我们有一天发现,确实是需要 setWidth 与 setHeight 的介面 那麽这时候,就很有可能得改变设计,把 Square 与 Rectangle 的继承关系解除 我觉得有些话说得很好,需求会慢慢压迫你寻求好的设计,此时好的设计就会慢慢浮现。 design pattern 也不是忽然出现的,他们是长时间在程式设计领域慢慢累积下来的, 不是谁忽然发明这麽伟大的设计,而是自然而然,我们就会想到这些解决办法可以解决 某个很复杂的问题。但是当问题本身并没有那麽复杂时,过度的设计也只是找自己麻烦 而已。 可以参考一下 Martin Fowler 的文章,Is Design Dead? http://www.martinfowler.com/articles/designDead.html Martin Fowler 是不少知名书籍的作者, 如 Refactoring, UML Distilled, Analysis Patterns 等 --   『风车』が廻り続ける度に 『美しき』幻想が静かに纺がれ    『焔』の揺らめきの外に 『腕』を伸ばす愚かな者达 -《Roman》5th Story  『宝石』をより多く掴もうと 『朝と夜』の狭间を彷徨い続ける Track 10   『星屑』の砂の煌めきにも 『葡萄酒』の仄甘い陶酔を魅せ 黄昏の贤者 『贤者』が忌避する槛の中から 『伝言』の真意を彼等に问うだろう   『天使』が别れを告げし时 『地平线』は第五の物语を识る --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18







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

请输入看板名称,例如:WOW站内搜寻

TOP