3.1 开闭原则
开闭原则(Open-Closed Principle,OCP)指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。所谓开闭,也正是对扩展和修改两个行为的一个原则。
这个原则在迪米特法则中也有所体现,迪米特法则告诉我们在设计时应该尽量减少一个对象对于其他对象的依赖和了解,这样可以使得系统更加灵活,更容易适应变化。在实现开闭原则的过程中,迪米特法则可以帮助我们更好地设计出松耦合的架构和模块。
以一个课程体系的例子来说明如何应用开闭原则。
首先,我们可以创建一个课程接口ICourse,对于每一种具体的课程,例如Java架构课程、大数据课程、人工智能课程等,都创建一个具体的课程类,例如JavaCourse、DataScienceCourse、AICourse等,这些类都实现了ICourse接口。
假设我们现在要为Java架构课程增加一个活动,例如优惠价格活动。我们可以通过扩展JavaCourse类来实现这个功能,而不是修改原来的JavaCourse类。这样,我们既可以保持JavaCourse类的稳定性,同时又可以在需要的时候增加新的功能。
3.2 依赖倒置原则
依赖倒置原则(Dependence Inversion Principle,DIP)指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。通过依赖倒置,可以降低类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并降低修改程序带来的风险。
3.3 单一职责原则
单一职责原则(Simple Responsibility Principle,SRP)指不要存在一个以上导致类变更的原因。假设有一个Class负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能会导致另一个职责的功能发生故障。
3.4 接口隔离原则
接口隔离原则(Interface Segregation Principle,ISP)指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。接口隔离原则符合“高聚合、低耦合”的设计思想。
3.5 迪米特法则
迪米特法则(Law of Demeter,LoD)又叫作最少知道原则(Least Knowledge Principle,LKP),指一个对象应该对其他对象保持最少的了解,尽量降低类与类之间的耦合。
如:模块之间的交互:在模块化编程中,不同的模块之间需要进行交互。根据迪米特法则,应该尽量减少模块之间的耦合度,即减少一个模块对于其他模块的依赖和了解,这样可以提高模块的独立性和可重用性。
3.6 里氏替换原则
一个软件实体如果适用于一个父类,则一定适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变。
3.7 合成复用原则
合成复用原则(Composite/Aggregate Reuse Principle,CARP)指尽量使用对象组合(has-a)或对象聚合(contanis-a)的方式实现代码复用,而不是用继承关系达到代码复用的目的。合成复用原则可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较小。
继承,又被称为白箱复用,相当于把所有实现细节暴露给子类。组合/聚合又被称为黑箱复用,对类以外的对象是无法获取实现细节的。