设计模式SOLID原则
-
单一职责原则(Single Responsibility Principle)
单一类承担单一职责。[1]
-
开放封闭原则(Open close Principle)
对扩展开放,对修改封闭。[2]
-
里氏替换原则(Liskov Substitution Principle)
父类具有的功能,子类必须具有。[3]
-
接口隔离原则(Interface Segregation Principle)
依赖应当建立在最小的接口。 (而不是聚合的单一接口)[4]
-
依赖倒置原则(Dependency Inversion Principle)
依赖不基于实体类,而是基于接口 。(依赖不基于具体,而是基于抽象)[5]
国内有设计模式六大原则的说法,多出一个:
-
迪米特法则 (Law of Demeter) 又称 最少知道原则 (Least Knowledge Principle)
模块不应了解所操作对象的内部情况。[6]
Robert C. Martin 在 The Principles of OOD 与 Clean Architecture 中把 Single Responsibility Principle 放在“变化原因 / actor”语境里理解:一个模块应只对一类变化原因负责,而不是机械追求“一个类只能有一个方法”。参见:https://web.archive.org/web/20150906155800/http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod、https://www.pearson.com/en-us/subject-catalog/p/clean-architecture-a-craftsmans-guide-to-software-structure-and-design/P200000009528。 ↩︎
Open/Closed Principle 通常追溯到 Bertrand Meyer 的 Object-Oriented Software Construction,后续也被 Robert C. Martin 纳入 OOD 原则体系。这里的“对扩展开放,对修改封闭”应理解为在稳定变化轴上用抽象、策略或插件减少对既有核心代码的修改,而不是旧代码永远不能改:https://archive.eiffel.com/doc/oosc/、https://web.archive.org/web/20150906155800/http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod。 ↩︎
Liskov Substitution Principle 的学术来源是 Barbara Liskov 的 Data Abstraction and Hierarchy 以及 Liskov / Wing 的 A Behavioral Notion of Subtyping。更严格地说,子类型要能替换父类型并保住父类型承诺,包括前置条件、后置条件和不变量等行为契约,而不只是“拥有同名功能”:https://dl.acm.org/doi/10.1145/62139.62141、https://dl.acm.org/doi/10.1145/197320.197383。 ↩︎
Interface Segregation Principle 在 Robert C. Martin 的 OOD 原则体系中用于约束“客户不应依赖自己不用的方法”。它强调按客户角色切分接口,而不是把所有调用方都绑到一个膨胀接口上:https://web.archive.org/web/20150906155800/http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod。 ↩︎
Dependency Inversion Principle 在 Robert C. Martin 的表述中关注高层策略与低层细节的依赖方向;Microsoft Learn 的 .NET dependency injection 文档则展示了通过接口 / 基类抽象依赖、由容器注入实现来避免硬编码依赖的常见平台实践。DIP 不等于所有类都必须抽接口,依赖注入也只是常见实现手段之一:https://web.archive.org/web/20150906155800/http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod、https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection。 ↩︎
Law of Demeter 来源于 Lieberherr、Holland 和 Riel 的 Object-Oriented Programming: An Objective Sense of Style,核心是限制对象之间的结构穿透,减少调用方对内部对象图的知识。它不要求无意义地层层转发,而是提醒模块不要依赖过深的内部结构:https://dl.acm.org/doi/10.1145/62083.62095。 ↩︎