SOLID 是什么
SOLID 是面向对象设计的五条原则:单一职责、开闭、里氏替换、接口隔离与依赖倒置,用于指导类与模块的职责划分和依赖方向。它们的共同目标是控制变化的影响面——让一处需求变更只改动少量代码。原则是判断依据而不是强制规则,脱离具体变化点机械套用,往往会制造出多余的抽象层。
五项原则
| 原则 | 英文 | 一句话含义 |
|---|---|---|
| 单一职责 | SRP | 一个模块只有一个被修改的理由 |
| 开闭原则 | OCP | 对扩展开放,对修改关闭 |
| 里氏替换 | LSP | 子类型可替换父类型而不破坏正确性 |
| 接口隔离 | ISP | 客户端不应被迫依赖它不使用的方法 |
| 依赖倒置 | DIP | 高层与低层都依赖抽象,细节依赖抽象 |
常见违反信号
- 一个类文件名里出现“And”或“Manager”,说明职责已经不止一个
- 新增一种类型要修改多处 switch 或 if 分支,开闭原则被破坏
- 子类重写方法后抛出“不支持”异常,里氏替换被破坏
- 接口有十几个方法但实现类大多留空,接口隔离被破坏
- 业务层直接 import 数据库驱动或框架类型,依赖倒置被破坏
落地建议
- 先定位真实的变化点,再决定在哪里引入抽象,避免为想象的变化预留接口
- 用依赖注入把外部实现传进来,配合接口隔离缩小依赖面
- 用组合替代过多继承,减少子类对父类实现的隐式依赖
- 把原则写进代码评审清单,讨论时用具体违反信号而不是口号
- 对遗留代码渐进改进:先加测试,再小步重构,避免一次性重写
SOLID 与 DRY、KISS、YAGNI 常一起使用:前者管职责与依赖,后者管抽象程度与范围控制,二者共同约束过度设计。
把每条原则都推到极致(类不超过 20 行、全部先定义接口),会得到大量难以追踪的间接调用,维护成本反而上升。