这是关于面向对象设计的五个原则(即 SOLID 原则)的描述:

SRP(单一职责原则)

  • 每个职责应该是一个独立的类,因为每个职责都是变化的轴。
  • 一个类应该有一个,且仅有一个,变化的原因。
  • 如果对业务规则的更改导致一个类的更改,那么对数据库模式、GUI、报告格式或系统的任何其他部分的更改都不应该强制该类更改。

OCP(开闭原则)

一个类应该对扩展开放,对修改关闭。

换句话说,你永远不应该需要改变现有的代码或类:所有新的功能都可以通过添加新的子类或方法,或通过通过委托重用现有的代码来添加。这可以防止在现有代码中引入新的错误。如果你从不改变它,就不会破坏它。它还可以防止你在现有代码中修复现有错误,如果采取到了极端的情况。

LSP(里氏替换原则)

希望达到的替换属性是:如果对于类型 S 的每个对象 o1,都有类型 T 的对象 o2,使得对于所有以 T 为基础定义的程序 P,当 o1 替换 o2 时,P 的行为不变,那么 S 是 T 的子类型。

— Barbara Liskov,《数据抽象和层次结构》,SIGPLAN Notices,23,5(1988年5月)。

ISP(接口隔离原则)

一个类对另一个类的依赖应该依赖于最小的可能接口。

DIP(依赖反转原则)

  • A. 高层模块不应该依赖低层模块。两者都应该依赖于抽象。
  • B. 抽象不应该依赖于细节。细节应该依赖于抽象。

迪米特法则

只与你的直接朋友交流。

  • 你的方法可以直接调用其类中的其他方法。
  • 你的方法可以直接调用其自身字段上的方法(但不能调用字段的字段上的方法)。
  • 当你的方法带有参数时,可以直接调用这些参数上的方法。
  • 当你的方法创建本地对象时,该方法可以调用本地对象上的方法。

警告:

  • 不应该在全局对象上调用方法(但可以将其作为参数传递)。
  • 在除了 a 的类之外的某个类中,不应该存在消息链 a.getB().getC().doSomething()。

参考资料

PrinciplesOfObjectOrientedDesign