1.开闭原则(Open - Closed Principle,OCP)
- 具体含义:软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这意味着软件系统在设计时,应该考虑到未来可能的功能扩展。当需要添加新功能时,通过增加新的代码模块(如类、函数等)来实现,而不是去修改已有的、能正常工作的代码部分。因为修改现有代码可能会引入新的错误,并且会影响到依赖于这些代码的其他部分,而通过扩展方式添加功能可以在不影响原有功能的基础上,更加安全地集成新功能。
2.里氏替换原则(Liskov Substitution Principle,LSP)
- 具体含义:子类型必须能够替换掉它们的父类型。也就是说,在程序中任何使用父类对象的地方,都可以用其子类对象来替换,并且程序的行为(包括功能和语义)不会发生改变。这要求子类在继承父类的过程中,不能改变父类原有的行为方式和功能特性,只是在父类的基础上进行合理的扩展或细化。
3.依赖倒置原则(Dependency Inversion Principle,DIP)
- 具体含义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。在软件系统设计中,高层模块是指包含复杂业务逻辑和控制流程的模块,低层模块是指提供基本数据存储、输入输出等功能的模块。这一原则强调通过引入抽象层(如接口或抽象类),使得高层模块和低层模块之间的依赖关系反转,高层模块不再直接依赖低层模块的具体实现,而是依赖抽象;低层模块则实现这些抽象,从而降低模块之间的耦合度,提高系统的灵活性和可维护性。
4.接口隔离原则(Interface Segregation Principle,ISP)
- 具体含义:客户端不应该被迫依赖于它不使用的方法。一个类对另一个类的依赖应该建立在最小的接口上。这意味着在设计接口时,应该尽量细化接口,使每个接口只包含客户端真正需要的方法,避免一个接口包含过多的方法,导致客户端被迫实现一些不需要的功能。这样可以使接口更加专注,减少类之间的不必要耦合,提高系统的灵活性和可维护性。
5.单一职责原则(Single Responsibility Principle,SRP)
- 具体含义:一个类应该只有一个引起它变化的原因。也就是说,一个类应该只负责完成一个特定的职责或功能。这有助于使类的内部逻辑更加清晰,职责更加明确。当系统的某个功能需求发生变化时,只需要修改负责该功能的类,而不会影响到其他类,从而降低系统的维护成本和复杂性。
6.迪米特法则(Law of Demeter,LoD),也称为最少知识原则(Least Knowledge Principle)
- 具体含义:一个对象应该对其他对象有最少的了解。一个软件实体应当尽可能少地与其他实体发生相互作用。这意味着在设计软件系统时,应该尽量减少对象之间的直接关联和交互,每个对象只需要与其紧密相关的对象进行通信,避免一个对象深入了解其他多个对象的内部细节和复杂操作。这样可以降低对象之间的耦合度,使得系统的维护和扩展更加容易。
7.组合 / 聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
- 具体含义:在软件复用时,尽量使用组合(has - a)和聚合(contains - a)关系,而不是继承关系来实现。组合是指一个对象包含另一个对象作为其一部分,例如汽车包含引擎,引擎是汽车的一个组成部分;聚合是指一个对象拥有另一个对象的集合,例如一个班级拥有多个学生。通过组合和聚合关系复用代码更加灵活,因为这些关系是在运行时动态确定的,而继承关系是在编译时就确定的。并且组合和聚合可以在不破坏现有代码的情况下,方便地添加或删除成员对象。
软件设计的七大原则包括开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、单一职责原则、迪米特法则和组合 / 聚合复用原则。开闭原则强调软件实体应对扩展开放、对修改关闭,便于功能的增添且不影响已有代码稳定性;里氏替换原则要求子类型能无缝替换父类型,保证继承体系的合理性与程序行为的一致性;依赖倒置原则使得高层与低层模块都依赖抽象,降低耦合度,提升系统灵活性;接口隔离原则提倡最小化接口,避免客户端依赖不必要的方法,减少类间耦合;单一职责原则规定一个类只负责一项职责,让类的职责清晰,便于维护和变更;迪米特法则主张一个对象对其他对象了解最少,降低对象间的关联程度,增强系统的可维护性;组合 / 聚合复用原则倡导优先使用组合或聚合关系而非继承来实现复用,使代码更具灵活性和可扩展性。这些原则相互配合,有助于打造出高内聚、低耦合、易维护、易扩展的优质软件系统架构,从不同角度保障软件设计的质量与可维护性,提升软件开发的整体效率和质量,是软件开发过程中重要的指导准则,能有效应对软件在生命周期中不断变化的需求和复杂的架构设计挑战。