SOLID 是用于构建可维护、灵活的面向对象系统的五项设计原则。每项原则都解决了导致代码僵硬、脆弱的一个常见根本原因。
| 字母 | 原则 | 单句含义 |
|---|
| S | Single Responsibility | 一个类应该只有一个改变的理由 |
| O | Open/Closed | 对扩展开放,对修改关闭 |
| L | Liskov Substitution | 子类型必须可以在基类型的任何地方使用 |
| I | Interface Segregation | 许多小接口优于一个大接口 |
| D | Dependency Inversion | 依赖抽象,而不是具体类 |
# Dependency Inversion: high-level code depends on an abstraction
class Notifier: # abstraction
def send(self, msg): ...
class EmailNotifier(Notifier):
def send(self, msg): print("email:", msg)
class OrderService:
def __init__(self, notifier: Notifier): # injected abstraction
self.notifier = notifier # not "new EmailNotifier()"
def place(self):
self.notifier.send("order placed") # works with ANY Notifier
OrderService 不直接依赖于邮件 — 可以在不改动它的情况下替换为 SMS 或测试替身(D)。添加新的通知器类型无需改动 OrderService(O)。
SOLID 是指导原则,不是法律。过度应用——每个类一个接口、到处都有间接层——会产生"抽象汤",反而比它要解决的问题更难理解。
SOLID 提供了一套共同的诊断语言:审查者可以明确指出为什么一个类难以改动("这违反了 SRP"),而不是凭品味争论。
明智地应用这些原则可以减少涟漪效应 — 改动保持局部化、新功能通过扩展而非重写实现,测试可以用伪实现替代真实依赖。