面向对象的设计原则

概述

这篇文章讲解了面向对象的设计原则。

设计原则

单一职责原则

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

单一职责原则,Single Responsibility Principle,简称 SRP。单一职责原则要求一个接口或类只有一个原因引起变化,也就是一个接口或类只有一个职责,就只负责一件事情。

好处
  • 类的复杂性降低,实现的职责都有清晰明确的定义
  • 可读性提高
  • 可维护性提高
  • 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做的好,一个接口修改只相应的实现类有影响,对其他接口无影响,对系统扩展性和维护性都有很大帮助。

单一职责原则最难划分的就是职责,一个职责一个接口,但现实问题是 “职责” 没有一个量化的标准,往往因项目而异,因环境而异,还要根据项目大小和复杂度来决定划分职责的粗细。

里氏替换原则

只要父类能出现的地方,子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但反过来就不行了,子类出现的地方,父类未必就能适应。

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

  • 子类必须完全实现父类的方法
  • 子类可以有自己的个性
  • 覆盖或实现父类的方法时输入参数可以被放大
  • 覆写或实现父类的方法时输出结果可以被缩小

里氏替换原则的目的是增强程序的健壮性,版本升级时也可以保持很好的兼容性。增加子类对于原有子类没有影响。子类对应不同的业务含义,使用父类作为参数,传递不同子类完成不同业务逻辑。

依赖倒置原则

依赖倒置原则(Dependence Inversion Principle,DIP)定义为:

High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstrations should not depend upon details. Details should depend upon abstractions.

三层含义:

  • 高层模块不应该依赖低层模块,两者都应该依赖其抽象。
  • 抽象不应依赖细节。
  • 细节应该依赖抽象。

对于 java 来说,抽象指的是接口和抽象类,细节是指实现类。

依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。

接口隔离原则

Clients should not be forced to depend upon interfaces that they don’t use.(客户端不应该依赖它不需要的接口)

The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上。)

通俗来讲:要建立单一接口,接口尽量细化,同时接口中的方法尽量少。

迪米特法则

迪米特法则(Law of Demeter,LoD)又称最少知识原则(Least Knowledge Principle,LKP),含义是:一个对象应该对其它对象有最少的了解,即一个类应该对自己所需要耦合或调用的类知道的最少。

开闭原则

Software entities like classes, modules and functions should be open for extension but closed for modifications.

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

开闭原则含义是说一个软件的实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。

参考资料

  • 秦小波.设计模式之禅

总结