该篇主要讲的是面向对象六大原则,分别是单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则和开闭原则。
1.单一职责原则(简称SRP)
- 单一职责原则的定义是:应该有且仅有一个原因引起类的变更。
- 好处:
-
- 类的复杂性降低,实现什么职责都有清晰明确的定义;
- 可读性提高,复杂性降低,显然可读性提高了;
- 可维护性提高,可读性提高,显然更容易维护了;
- 变更引起的风险降低,变更是必不可少,如果接口的单一职责做得好,一个接口修改只对响应的实现类有影响,对其他的接口无影响,对系统的扩展性、维护性都有非常大的帮助。
实现接口单一职责,是依据职责进行划分,一个职责一个接口,但是职责没有一个标准,但是要类实现单一职责,则需要多方面考虑。
- 例子:
- A接口负责进行属性修改,B接口负责行为,C类可以实现A和B接口两个接口,如果A接口进行修改,则A的实现类修改即可,如果A和B接口合并,那么即使不需要A的方法的实现类,也需要增加方法。
注意:单一职责原则提出了一个编写程序的标准,用“职责”或“变更原因”来衡量接口或类设计得是否优良,但是“职责”和“变化原因”都是不可度量的,因项目而异,因环境而异。
2.里氏替换原则(简称LSP)
- 只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。
- 规范:
-
- 子类必须完全实现父类的方法;
- 子类可以有自己的个性;
- 重载或实现父类的方法时输入参数可以被放大;
- 重写或实现父类的方法时输出结果可以被缩小;
3.依赖倒置原则(简称DIP)
- 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
4.接口隔离原则
- 建立单一接口,不要建立臃肿庞大的接口。根据模块提供接口,而不是将所有接口都放入一个接口中,但是首先必须满足单一职责原则。
- 含义:
-
- 接口要尽量小–首先必须满足单一职责原则;
- 接口要高内聚;
- 定制服务;
- 接口设计是由限度的;
5.迪米特法则(简称LoD)
- 一个对象应该对其他对象有最少的了解。
- 含义:
-
- 只和朋友交流;
- 朋友间也是有距离的;
- 是自己的就是自己的;
- 谨慎使用Serializable;
说明:朋友类是出现在成员变量、方法的输入输出参数中的类称为成员朋友类。迪米特法则要求类尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多实用private、package-private、protected等访问权限。
6.开闭原则
- 一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。软件实体应该对扩展开发,对修改关闭。