软件设计原则----合成/聚合复用原则(CARP)
“要尽量使用合成/聚合,尽量不要使用继承。” 陈述: 在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。 引入: 如我们所知,在面向对象设计里,不同环境中复用已有设计和实现的基本方法:
1、继承复用
继承复用通过扩展一个已有对象的实现来得到新的功能,基类明显地捕获共同的属性和方法,而子类通过增加新的属性和方法来扩展超类的实现。继承是类型的复用。 继承复用的优点:
2、合成/聚合复用
由于合成/聚合可以将已有的对象纳入到新对象中,使之成为新对象的一部分,因此新的对象可以调用已有对象的功能, 其优点在于:
要正确的选择合成/复用和继承,必须透彻地理解里氏替换原则和Coad法则。
Coad法则由Peter Coad提出,总结了一些什么时候使用继承作为复用工具的条件。 Coad法则: 只有当以下Coad条件全部被满足时,才应当使用继承关系:
错误地使用继承而不是合成/聚合的一个常见原因是错误的把“Has-A”当成了“Is-A”。
“Is-A”代表一个类是另外一个类的一种; “Has-A”代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类。
例如:如果我们把“人”当成一个类,然后把“雇员”,“经理”,“学生”当成是“人”的子类。
错误在于把“角色”的等级结构和“人”的等级结构混淆了。“经理”,“雇员”,“学生”是一个人的角色,一个人可以同时拥有上述角色。如果按继承来设计,那么如果一个人是雇员,就不可能是经理,也不可能是学生,显然不合理。 正确的设计是有个抽象类“角色”,“人”可以拥有多个“角色”(聚合),“雇员”,“经理”,“学生”是“角色”的子类。 注意: 里氏替换原则是继承复用的基础。 总结:
参考资源: 《设计模式:可复用面向对象软件的基础》,ERICH GAMMA RICHARD HELM RALPH JOHNSON JOHN VLISSIDES著作,李英军 马晓星 蔡敏 刘建中译,机械工业出版社,2005.6 《敏捷软件开发:原则、模式与实践》,Robert C. Martin著,邓辉译,清华大学出版社,2003.9 《设计模式解析》,Alan Shalloway等著(徐言声译),人民邮电出版社,2006.10
转载:http://www.52php.cn/article/p-rarkkuxk-ym.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |