Contents

面向对象设计原则

Contents

面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。

  1. 单一职责原则

    类的职责单一,对外只提供一种功能,而引起类变化的原因都应该只有一个。

    一个类对外只提供一种功能。

  2. 开闭原则

    类的改动是通过增加代码进行的,而不是修改源代码。

    增加功能时去增加代码而不是修改代码。

  3. 里氏替换替换原则

    任何抽象类(interface接口)出现的地方都可以用他的实现类进行替换,实际就是虚拟机制,语言级别实现面向对象功能。

  4. 依赖倒置原则

    依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程。

    模块与模块依赖抽象而不是具体实现。

  5. 接口隔离原则

    不应该强迫用户的程序依赖他们不需要的接口方法。一个接口应该只提供一种对外功能,不应该把所有操作都封装到一个接口中去。

  6. 合成复用原则

    如果使用继承,会导致父类的任何变换都可能影响到子类的行为。如果使用对象组合,就降低了这种依赖关系。对于继承和组合,优先使用组合。

    通过组合来实现父类方法。

  7. 迪米特法则

    一个对象应当对其他对象尽可能少的了解,从而降低各个对象之间的耦合,提高系统的可维护性。例如在一个程序中,各个模块之间相互调用时,通常会提供一个统一的接口来实现。这样其他模块不需要了解另外一个模块的内部实现细节,这样当一个模块内部的实现发生改变时,不会影响其他模块的使用。

    依赖第三方来实现解耦。

以上面向对象设计原则对于写代码有什么指导思想呢,我想大致可以分为两点:

  1. 对象的职责设置的尽可能单一,后续有需求的更改不需要修改之前的代码。不推荐使用继承(父类发生更改非常容易影响子类),而是多用组合(如Python中常用的mixin,通过组合不同的mixin获得不同的功能)。
  2. 在进行系统设计时要考虑三个层次:抽象层、实现层、业务逻辑层。在写业务逻辑层的时候,依赖的是抽象层提供的接口,这样即使是具体实现层的代码改动,或者是需要另一种实现方式,在业务逻辑层也不需要改动。