1. SRP 的 Robert Martin 原意中变化原因(reason to change)唯一,而非职责单一
请解释 Robert Martin 提出的单一职责原则(SRP)的原始含义,并说明它与"职责单一"的通俗理解有何区别?
- 对 SRP 原始定义("一个类只有一个变化原因")的准确理解
- 区分"职责"与"变化原因"两个概念的不同
- 理解 SRP 为什么是"变化驱动"而非"功能驱动"的
Robert Martin 在《敏捷软件开发:原则、模式与实践》中给出的 SRP 定义是"一个模块应该只有一个引起它变化的原因(reason to change)"。注意这里的核心概念是"变化原因"而不是"职责"。通俗理解的"职责单一"容易让人误以为"一个类只做一件事",但更精确的表述是:当你因为某种业务需求的变化而需要修改这个类时,不应该有第二个不同的业务需求也要求修改同一个类。如果两个不同的业务需求会触发同一个类被修改,那么这个类就有两个变化原因,违反了 SRP。Martin 的后续版本进一步用"actor 视角"来定义,即一个类应该只服务于一个参与者(actor)。
SRP 的本质是"变化对齐":把会因同一原因而变化的代码放在一起,把会因不同原因而变化的代码分开。它管的是"代码的耦合方向"而非"类的大小"。实践中,一个类可能有很多方法,但只要所有这些方法都服务于同一个变化原因,它就是符合 SRP 的;反之,一个类即使只有两个方法,如果它们服务于两个不同的变化原因,也违反了 SRP。