OOAD 板


LINE

我不懂C++ 也看不太懂你的问题 但是如果一个庞大的class内部有许多需求需要改变的时候 一般会用下面作法: 原本状态:有一个物件叫做Computer 他有9种方法(method1-method9)以及5种实体变数(ivar1-ivar5) 用pseudo-code表示: class Computer: @attribute(public) ivar1 //为public的attribute @attribute(public) ivar2 @attribute(public) ivar3 @attribute(private) ivar4 //为private的attribute @attribute(private) ivar5 -method1 #public > block1 //表示method1内部使用block1的演算法逻辑 以下类推 -method2 #public > block2 -method3 #public > block3 -method4 #public > block4 -method5 #public > block5 -method6 #public > block6 -method7 #public > block7 -method8 #public > block8 -method9 #public > block9 end 通常我遇到这麽大的class我第一步都是在class前方先写注解 来叙述这个物件的responsiblity 现在你希望你维持同样的public interface给使用这个类别的人使用 又有改变的需求 假设method4-method6和method7-method9都有改变需求但改变动机和时机不同 作法会变成宣告两个新的Helper物件: class HelperA: -method4 #public > block4 -method5 #public > block5 -method6 #public > block6 end class HelperB: -method7 #public > block7 -method8 #public > block8 -method9 #public > block9 end class Computer: @attribute(public) ivar1 @attribute(public) ivar2 @attribute(public) ivar3 @attribute(priavte) ivar4 @attribute(private) ivar5 @attribute(private) HelperA instanceOfHelperA @attribute(private) HelperB instanceOfHelperB -method1 #public > block1 -method2 #public > block2 -method3 #public > block3 -method4 #public > instanceOfHelperA.method4 -method5 #public > instanceOfHelperA.method5 -method6 #public > instanceOfHelperA.method6 -method7 #public > instanceOfHelperB.method7 -method8 #public > instanceOfHelperB.method8 -method9 #public > instanceOfHelperB.method9 end 但是因为HelperA和HelperB都需要Computer的ivar3-ivar5的资料 於是必须多一个wrapper来当物件之间的传递: class DataWrapper: @attribute(public) ivar3 @attribute(public) ivar4 @attribute(public) ivar5 end clas @attribute(public) ivar1 @attribute(public) ivar2 @attribute(public) ivar3 > instanceOfDataWrapper.ivar3 @attribute(private) ivar4 > instanceOfDataWrapper.ivar4 @attribute(private) ivar5 > instanceOfDataWrapper.ivar5 @attribute(private) DataWrapper instanceOfDataWrapper @attribute(private) HelperA instanceOfHelperA @attribute(private) HelperB instanceOfHelperB -method1 #public > block1 -method2 #public > block2 -method3 #public > block3 -method4 #public > instanceOfHelperA.method4(instanceOfDataWrapper) -method5 #public > instanceOfHelperA.method5(instanceOfDataWrapper) -method6 #public > instanceOfHelperA.method6(instanceOfDataWrapper) -method7 #public > instanceOfHelperB.method7(instanceOfDataWrapper) -method8 #public > instanceOfHelperB.method8(instanceOfDataWrapper) -method9 #public > instanceOfHelperB.method9(instanceOfDataWrapper) end 当然HelperA和HelperB的method所吃的参数也要改变 class HelperA -method4(DataWrapper) #public > block4 -method5(DataWrapper) #public > block5 -method6(DataWrapper) #public > block6 end class HelperB -method7(DataWrapper) #public > block7 -method8(DataWrapper) #public > block8 -method9(DataWrapper) #public > block9 end 现在你就可以subclass HelperA和HelperB来解决庞大Computer要改变的问题 不知道有没有解决你的问题 -- 看一下你的问题 你应该只需要一个private的data wrapper当参数传送就可以解决 (如果你只需要知道原本物件的data的话) 不然我上面的例子HelperA和HelperB就必须知道Computer的存在 而且那些会用到的attribute必须是public --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.80.73.25
1F:推 iamstudent :就是不希望都写成public呀 04/23 17:50
2F:→ leondemon :所以 我这篇讲的不是你要的吗? 04/23 17:55
※ 编辑: leondemon 来自: 111.80.73.25 (04/23 17:57)
3F:推 iamstudent :的确不是,这样那个大class的内容整个都暴露出来了 04/23 17:57
4F:→ leondemon :抽出来之後的public介面还是跟原本的一样 04/23 17:57
5F:→ iamstudent :你例子里面的Computer,我希望他所有attr都是private 04/23 17:58
6F:→ iamstudent :然後只有你的Helper或是DateWrapper可以存取 04/23 18:00
7F:→ iamstudent :因为其他的class或是client都可以使用Computer 04/23 18:00
8F:→ iamstudent :只让有关的类别可以存取就好,其他人只应该持有 04/23 18:01
9F:→ leondemon :Helper和DataWrapper都是private这样不行吗? 04/23 18:18
10F:推 iamstudent :就我目前的case,那个Helper一定会是private没有问题 04/23 18:25
11F:→ iamstudent :问题是那个DataWrapper,他几乎会整个等於大class 04/23 18:26
12F:推 iamstudent :不过我好像有点想法了,也许就整个成员抽出去 04/23 18:30
13F:→ iamstudent :我在想,如果把资源物件改放在Helper的super类别... 04/23 18:32







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