单一职责原则

单一职责原则(Single Responsibility Principle, SRP),应该有且仅有一个原因引起类的变更。

There should never be more than one reason for a class to change.

一般来说,设计一个电话类,都会如下图这样设计。dial、hangup 和 chat 都放在同一个类中。
但其实这样子,违背了 SRPdial()hangup() 负责协议管理,chat()负责数据传送。
image.png
image.png

SRP 的好处:

  • 类的复杂性降低,实现什么职责都有清晰明确的定义。
  • 可读性提高。复杂性降低,可读性就提高了。
  • 可维护性提高。因为可读性提高了,容易维护。
  • 变更引起的风险降低。

SRP 最难划分的就是职责。一个职责一个接口,但问题是“职责”没有一个量化的标准。

对于接口,设计的时候要做到单一。但是对于实现类就需要多方面考虑。
生搬硬套 SRP 会引起类的剧增,维护麻烦,而且过分细分类的职责会人为的增加系统的复杂性(一个类拆分为两个类,然后聚合或者组合,这样做增加系统复杂性)。

SRP 适用于接口、类,同时也适用于方法 Function

对于单一职责原则,我的建议是接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。


里氏替换原则

里氏替换原则(Liskov Substitution Prinple, LSP)(2种定义):

  1. If for each object o1 of type S, there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T. (如果对每一个类型为 S 的对象 o1,都有类型为 T 的对象 o2,使得以 T 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,程序 P 的行为没有发生变化,那么类型 S 是 类型 T 的子类型)
  2. Functions that use pointers or references to base classes must be able to use ojects of derived classes without knowing it.(所有引用基类的地方必须能够透明地使用其子类的对象。)

里氏替换原则为良好的继承定义了一个规范(4个含义):

  • 子类必须完全实现父类的方法
    • 在类中调用其他类时务必使用父类或接口。若不能使用父类或接口,则类的设计违背了 LSP 原则。
    • 如果子类不能完整地实现父类的方法,或父类的某些方法在子类中已经“畸变”,则断开继承关系,转而采用依赖、聚集、组合等关系代替继承。
  • 子类可以有自己的个性
  • 。。。

依赖倒置原则


接口隔离原则


迪米特法则


开闭原则