Bob 大叔在21世纪早期将单一职责,开闭原则,里氏替换,接口隔离以及依赖倒置5个原则成为 SOLID 原则,而遵循面向对象的原则是我们走向灵活软件之路迈出的第一步.

单一职责

对于一个类而言,应该只有一个引起它变化的原因.一个类应该是一组相关性很高的函数,数据的集合.
如果所有的功能都在一个类中,那么随着软件的升级,这个类会越来越臃肿,不利于维护,扩展性和灵活性太差, 应该将这个类中的功能进行拆分成多个类,每个类只有一个职责.这就叫单一职责.

开闭原则

在软件的生命周期内,对代码进行修改时,可能会引入错误到旧的代码中,因此,当软件需要变化时,应该尽量通过扩展的方式实现变化,而不是修改原有的代码.要实现这一原则,要尽量面向接口编程,将一个功能点抽离出一个接口,以后再添加功能时,只需要创建一个类,实现该接口即可.

里氏替换原则

所有引用基类的地方都能直接的使用其子类对象,而且替换也不会产生任何错误,使用者也不需要知道使用的是那个子类.
里氏替换原则的核心原理是抽象,抽象又依赖于继承这个特征, 在 OOP 中,继承的优点如下:

  1. 代码重用,减少 创建类的成本,每个子类都拥有父类的属性和方法
  2. 子类与父类相似,但又与父类不同
  3. 提高了可扩展性

缺点如下:

  1. 继承是侵入性的,只要继承就必须拥有父类的所有属性和方法
  2. 可能造成子类代码沉余,灵活性降低.

依赖倒置原则

如果类与类之间直接依赖细节(细节就是实现类),这就说明这两个类是耦合的,当实现的细节修改之后,就需要修改依赖者的代码.这限制了系统的扩展性.
类与类之间的依赖通过抽象产生,也就是面向接口编程,当需要扩展或者修改时,只需要修改实现类,而不用修改依赖类的代码.

接口隔离原则

类与类之间的关系应该建立在最小的接口上,将庞大的接口拆分成若干个小的接口,这样客户端只需要知道它们感兴趣的方法,使系统解开耦合,从而更容易重构,更改和重新部署.

迪米特原则

一个类对自己需要调用的类,知道的越少越好,被调用类的内部实现与调用者没有任何关系,调用者只需要关心它需要的方法,其它的一概不用管.