一些面向对象的设计法则 Bob Tarr 著
Favor Composition Over Inheritance
组合的优点
容器类仅能通过被包含对象的接口来对其进行访问。
对装性好。
实现上的相互依赖性比较小。(译者注:被包含对象与容器对象之间的依赖关系比较少)
组合的缺点
从而导致系统中的对象过多。
必须仔细地对接口定义
继承
将父类的实现细节暴露给子类
易于修改或扩展那些被复用的实现。
判断标准:
继承: “是一个…的特殊类型”,
组合:“是一个由…所扮演的角色”,或者 has a
如乘客只是Person所扮演的一种角色,则在Person中组合乘客。
Program To An Interface, Not An Implementation
接口的优点:
可以被另一个对象替换
增加了重用的可能
接口的缺点:
设计的复杂性略有增加
接口表示“…像…”(LikeA)的关系,继承表示“…是…”(IsA)的关系,组合表示“…有…”(HasA)的关系
Software Entities Should Be Open For Extension, Yet Closed For Modification
对扩展开放,对修改封闭,算是设计软件的一种原则吧,比较抽象
单选法则(the Single Choice Principle)
无论在什么时候,一个软件系统必须支持一组备选项,理想情况下,在系统中只能有一个类能够知道整个的备选项集合。
替换法则(LSP)
以基类做参数的函数,当传入派生类对象也可以使用,也就是不需要向下转型。
用于区分不该用的继承
为了保持LSP(并与开放-封闭法则一起),所有子类必须符合使用基类的client所期望的行为。
一个子类型不得具有比基类型(base type)更多的限制,可能这对于基类型来说是合法的,但是可能会因为违背子类型的其中一个额外限制,从而违背了LSP!
LSP保证一个子类总是能够被用在其基类可以出现的地方!