六大原则
# 单一职责原则 (Single Responsibility Principle)
一个类只负责一个功能领域中的相应职责。即对一个类而言,应该只存在一个引起它变化的原因(多个职责若总是同时发生改变则可将它们封装在同一类中)。
此原则可降低类的复杂度、提高类的可读性、提高系统的可维护性并且使变更引起的风险降低。这是实现高内聚低耦合的关键。
# 里氏代换原则 (Liskov Substitution Principle)
所有引用基类(父类)的地方必须能透明地使用其子类的对象。
在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。例,我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;但是我喜欢狗,不能据此断定我喜欢动物,因为我并不喜欢老鼠,虽然它也是动物。
# 依赖倒置原则 (Dependence Inversion Principle)
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。
满足此原则需要尽量遵循以下四点:
每个类都提供抽象类。
变量的声明类型是抽象类。
任何类都不应该从具体类派生。
使用继承时尽量遵循里氏替换原则
# 接口隔离原则 (Interface Segregation Principle)
使用多个专门的接口,而不使用单一的总接口。即每一个接口承担一种相对独立的角色。
接口隔离原则和单一职责原则都是为了提高类的内聚性、降低类之间的耦合性,并体现了封装的思想,但单一职责原则侧重功能,而接口隔离原则侧重接口依赖。
# 迪米特原则 (Law of Demeter)
一个软件实体应当尽可能少地与其他实体发生相互作用。如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
注意:过度使用迪米特原则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。
# 开闭原则 (Open-Closed Principle)
一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。例,可以为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成。如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。
# 总结
- 单一职责原则告诉我们实现类要职责单一。
- 里氏替换原则告诉我们不要破坏继承体系。
- 依赖倒置原则告诉我们要面向接口编程。
- 接口隔离原则告诉我们在设计接口的时候要精简单一。
- 迪米特原则告诉我们要降低耦合。
- 开闭原则是总纲,告诉我们要对扩展开放,对修改关闭。