- 开闭原则 (OCP)
核心是指在一个软件实体中(如类,函数等),我们应该对扩展开放、对修改关闭,这样就可以提高软件系统的可复用性和可维护性。
- 里氏替换原则 (LSP)
- 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
- 子类中可以增加自己的特有方法。
- 当子类方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法输入的参数更宽松。
- 当子类实现父类的方法(重载/重写/实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类更严格或者相等。
- 依赖倒置原则 (DIP)
在设计代码结构时,高层模块不应该依赖低层模块,而是都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。通过依赖倒置原则可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,而且能够降低修改程序所带来的风险。
- 单一职责原则 (SRP)
不要存在多于一个导致类变更的原因。假如我们有一个类里面有两个职责,一旦其中一个职责发生需求变更,那我们修改其中一个职责就有可能导致另一个职责出现问题,在这种情况应该把两个职责放在两个 Class 对象之中。
- 接口隔离原则 (ISP)
- 一个类对其它类的依赖应建立在最小的接口之上。
- 建立单一的接口,不建立庞大臃肿的接口。
- 尽量细化接口,接口中的方法应适度。
- 迪米特法则(最少知道原则) (LOD)
一个对象对其它对象应该保持最少的了解,尽量降低类与类之间的耦合
- 合成复用原则 (CRP)
软件复用时,要尽量先使用组合(has-a)或者聚合(contains-a)等关联关系来实现,这样可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其它类造成的影响相对较少。
继承通常也称之为白箱复用,相当于把所有的实现细节都暴露给子类。组合/聚合也称之为黑箱复用,对类以外的对象是无法获取到实现细节的。