单一职责原则
单一职责原则(Single Responsibility Principle, SRP),应该有且仅有一个原因引起类的变更。
There should never be more than one reason for a class to change.
一般来说,设计一个电话类,都会如下图这样设计。dial、hangup 和 chat 都放在同一个类中。
但其实这样子,违背了 SRP。dial() 和 hangup() 负责协议管理,chat()负责数据传送。

SRP 的好处:
- 类的复杂性降低,实现什么职责都有清晰明确的定义。
- 可读性提高。复杂性降低,可读性就提高了。
- 可维护性提高。因为可读性提高了,容易维护。
- 变更引起的风险降低。
SRP 最难划分的就是职责。一个职责一个接口,但问题是“职责”没有一个量化的标准。
对于接口,设计的时候要做到单一。但是对于实现类就需要多方面考虑。
生搬硬套 SRP 会引起类的剧增,维护麻烦,而且过分细分类的职责会人为的增加系统的复杂性(一个类拆分为两个类,然后聚合或者组合,这样做增加系统复杂性)。
SRP 适用于接口、类,同时也适用于方法 Function。
对于单一职责原则,我的建议是接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。
里氏替换原则
里氏替换原则(Liskov Substitution Prinple, LSP)(2种定义):
- If for each object
o1of type S, there is an objecto2of typeTsuch that for all programsPdefined in terms ofT, the behavior ofPis unchanged wheno1is substituted foro2thenSis a subtype ofT. (如果对每一个类型为 S 的对象 o1,都有类型为 T 的对象 o2,使得以 T 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,程序 P 的行为没有发生变化,那么类型 S 是 类型 T 的子类型) - Functions that use pointers or references to base classes must be able to use ojects of derived classes without knowing it.(所有引用基类的地方必须能够透明地使用其子类的对象。)
里氏替换原则为良好的继承定义了一个规范(4个含义):
- 子类必须完全实现父类的方法
- 在类中调用其他类时务必使用父类或接口。若不能使用父类或接口,则类的设计违背了 LSP 原则。
- 如果子类不能完整地实现父类的方法,或父类的某些方法在子类中已经“畸变”,则断开继承关系,转而采用依赖、聚集、组合等关系代替继承。
- 子类可以有自己的个性
- 。。。
