[问题] 继承架构设计的问题

楼主: sd016808 (sd016808)   2016-05-31 20:28:24
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
问题(Question):
如连结程式码所示,当继承Item的产品类别越来越多
例如:饼干、衣服、3C产品...等等,每个产品都有自己的member variable和method
用目前这样的架构,Item类别势必得越写越大,而且Seller和Store也必须提供越来越多

method去操做产品,要如何避免此状况发生?
是不是打从一开始就应该把Seller拆成Candy Seller和Drink Seller
以及Store拆成Candy Store和Drink Store会比较好?
程式码(Code):(请善用置底文网页, 记得排版)
http://codepad.org/PmQnpIqx
补充说明(Supplement):
程式码看起来可能有一点不太像C++,好一段间没写了,请见谅。
作者: xpride (陈ㄚ智)   2016-05-31 23:52:00
为什么Item要提供子类别自已专属的接口??自已的事情自已做就好了。你提供Get/SetSize这接口,candy以外的子类别又不能用那干麻要把他写进接口里??
楼主: sd016808 (sd016808)   2016-06-01 01:35:00
如果item不提供子类别专属的接口 那seller类别要如何呼叫到candy或者drink专属的method? 难道要做向下转型吗?
作者: IKAFIRE (没有)   2016-06-01 01:52:00
一开始就不该透过item存取子类别的method,子类别的method就以子类别的型态去存取,处理完再用item pointer接是说你set method的定义怎么好像跟惯用相反
楼主: sd016808 (sd016808)   2016-06-01 07:48:00
抱歉 set的部分写太快写错了 是要改变member value 不是要return value 引数的部分也忘记写ORZ一开始就用子类别去存取 是不是代表说seller打从一开始就应该直接拆成candy seller 和 drink seller 然后各自处理candy 和 drink类别 不要透过item去操作 然后store类别身上同时拥有candy seller 和drink seller 再根据不同的function来使用drink seller和candy seller就好
作者: IKAFIRE (没有)   2016-06-01 17:01:00
你可能要先解释一下你的需求是什么,你想要达成什么你的seller用途是什么?在这里看来是冗余的存在
楼主: sd016808 (sd016808)   2016-06-01 18:21:00
seller 是量测设备 store 是一群量测设备的集合 item是可以被量测的产品 一台设备可以只量测一台产品 也可以同时量测多台产品 client端基本上是透过store去控制所有的量测设备的动作 因为产品间的差异很大 可能是风扇需要量测转速 可能是电源 需要量测电压电流资讯以目前的架构 item类别会变成一种很奇怪的抽象产品 同时具备了各种不同产品的属性 而且实际上的量测设备只有一种 但是它能量测各种不同的产品 所以我在犹豫到底需不需要把设备抽象化成切成不同的seller
作者: IKAFIRE (没有)   2016-06-01 19:13:00
http://imgur.com/nDOiMkj 这种感觉?
楼主: sd016808 (sd016808)   2016-06-01 20:03:00
如果FanSeller要控制转速 但是seller没有提供这个接口那你的store要怎么呼叫? 我是不是应该把不同的控制方法分离成不同接口 然后让store拥有各种不同接口的List例如List<IFanControl> List<IPowerControl> 再根据seller对外开放面的接口决定里面应该使用哪一个list
作者: IKAFIRE (没有)   2016-06-01 20:12:00
所以你要先把你的需求描述完整,不完整的需求设计出来当然功能不会完整
楼主: sd016808 (sd016808)   2016-06-01 20:13:00
另外可以请问一下I大绘制UML所用的软件名称吗?
作者: IKAFIRE (没有)   2016-06-01 20:14:00
我是用PlantUML的online editor叫PlantText
楼主: sd016808 (sd016808)   2016-06-01 20:25:00
感谢! 主要的需求其实就是我需要控制N台多功能的仪器根据接上的不同产品 决定要使用仪器的哪些功能 例如接上风扇 就需要控制读取转速资讯 接上电源 要读取电压电流资讯 因为仪器是多功能的只要有一台就能做不同的控制所以我需要产品的class负责记录不同产品的资讯需要仪器的class作单台仪器的控制需要一个仪器的群组的class 负责一次对全部的仪器操控最后我可能打算实做成这个样子http://imgur.com/s9GqAoN就是每新增一个产品别的时候得新增一个新的List就是了..
作者: IKAFIRE (没有)   2016-06-01 21:15:00
这样每增加一种device就要修改group的接口,略不方便我会觉得想办法用统一界面操作device比较有扩充性
作者: FrozenMoment   2016-06-01 22:05:00
觉得 group 当容器就好,device 直接给外部操作
楼主: sd016808 (sd016808)   2016-06-03 19:44:00
因为有些是SetALL的命令可能是透过Broadcast的方式下不是把List里的device取出来一个一个下 所以我觉得可能还是得要有一个Group去操作或比较方便一些会

Links booklink

Contact Us: admin [ a t ] ucptt.com