架构风格与模式58 条

SOLID 五原则

面向对象设计的五条原则:单一职责、开闭、里氏替换、接口隔离与依赖倒置;用于指导类与模块的职责划分和依赖方向。

SOLID 是什么

SOLID 是面向对象设计的五条原则:单一职责、开闭、里氏替换、接口隔离与依赖倒置,用于指导类与模块的职责划分和依赖方向。它们的共同目标是控制变化的影响面——让一处需求变更只改动少量代码。原则是判断依据而不是强制规则,脱离具体变化点机械套用,往往会制造出多余的抽象层。

五项原则

原则英文一句话含义
单一职责SRP一个模块只有一个被修改的理由
开闭原则OCP对扩展开放,对修改关闭
里氏替换LSP子类型可替换父类型而不破坏正确性
接口隔离ISP客户端不应被迫依赖它不使用的方法
依赖倒置DIP高层与低层都依赖抽象,细节依赖抽象

常见违反信号

  • 一个类文件名里出现“And”或“Manager”,说明职责已经不止一个
  • 新增一种类型要修改多处 switch 或 if 分支,开闭原则被破坏
  • 子类重写方法后抛出“不支持”异常,里氏替换被破坏
  • 接口有十几个方法但实现类大多留空,接口隔离被破坏
  • 业务层直接 import 数据库驱动或框架类型,依赖倒置被破坏

落地建议

  • 先定位真实的变化点,再决定在哪里引入抽象,避免为想象的变化预留接口
  • 用依赖注入把外部实现传进来,配合接口隔离缩小依赖面
  • 用组合替代过多继承,减少子类对父类实现的隐式依赖
  • 把原则写进代码评审清单,讨论时用具体违反信号而不是口号
  • 对遗留代码渐进改进:先加测试,再小步重构,避免一次性重写
SOLID 与 DRY、KISS、YAGNI 常一起使用:前者管职责与依赖,后者管抽象程度与范围控制,二者共同约束过度设计。
把每条原则都推到极致(类不超过 20 行、全部先定义接口),会得到大量难以追踪的间接调用,维护成本反而上升。

易错点

  • 为满足单一职责把一个类拆成十几个小类,调用链拉长,理解成本显著上升
  • 为开闭原则预留大量扩展点,实际从未扩展过,代码充斥无用抽象
  • 子类改变父类方法的语义或前置条件,替换后行为异常难以定位
  • 接口设计过宽但实现类只用一个方法,所有实现被迫承担无用依赖
  • 只喊原则口号不做技术评审,讨论无法落到具体的类与依赖上

数据来源与参考

  • Robert C. Martin《Agile Software Development: Principles, Patterns, and Practices》
  • Robert C. Martin《Clean Architecture》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌