工作快半年了,最近才经历了第一次模块架构的设计。(之前都是头说,我们听,提意见。
只是在一定程度上解决了问题,但是感觉还是记录下,为以后的成长做个见证。
比较喜欢吃水果,就从水果的角度描述了。
有三种水果:苹果,梨,桃子。apple,pear,peach。
他们有共同base class:fruit。
按照需求,每种水果有相同的操作集合,相同操作对于每种水果来说大同小异。为每种水果下的每个操作定义了具体的实现类。eatApple
, cookApple;eatPear,cookPear;eatPeach, cookPeach。每个操作类都继承自水果基类。(不要考虑合理性,这个是必须的。我们不是真的在吃水果)
这样,eatApple, cookApple继承自apple,公共的部分都放在apple中。比如apple的大小,颜色。。。eatApple,cookApple包含了自己独有的部分,如eat用刀,cook用锅。
到这里没有什么问题,但是到和锅的描述类还没有实例化。
在eatApple和eatPear中,刀就是从中间切,实现方式是一样的。如果有两种水果,那我会将刀的实现放在fruit中。但是还有peach(中间有核,不能一刀切开)。
各种情况分析下:
如果将apple和pear的刀放在fruit中,那么apple和pear对于刀的使用方式只实现了一次,没有代码冗余。peach的刀在eatPeach中复写。但是如果再来一种水果和peach使用相同的方式,那么还需要重复一次peach的刀。这种方式不合理。
如果将所有的刀都放在子类中,那么apple和pear肯定是代码冗余的。
这里我想了一天,但是突然想到一个非常基本的问题:为什么将刀的实现放到水果类中。吃水果用刀,但是具体怎样用水果是不必关心的。
抽出刀的实现,建立新的类。
基类knife。fruit中包含一个knife的对象。
knife1,knife2. knife的具体实现类。
fruit中knife的实现在子类中完成。那么apple和pear就可以共用同一个knife(相同的子类)。peach用自己的knife。
总结下。主要就是两个方面:组件取代继承;类的定义。
组件良好的扩展性,可以任意组装,拆卸。
类的定义需要遵循一个类只关心一种事情。关心太多让类很累。同理,一个函数应该只完成一件事情。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!