定义
就一个类而言,应该仅有一个引起它改变的原因。
原因
需求的变化会反映为类的职责的变化,过多的职责耦合在一起,使得一个职责的变化可能会削弱或抑制这个类完成其他职责的能力。
举例
下面的Modem
(调制解调器)接口具有两个职责,一个是连接管理(dial
和hangup
方法),另一个是数据通信(send
和recv
方法)。
public interface Modem {
void dial(String pno);
void hangup();
void send(char c);
void recv();
}
这两个职责是否应该被分开,这依赖于需求变化的方式。
分开
如果需求的变化会单独影响连接管理的职责,比如连接管理方法的签名发生变化,那么就会导致调用数据通信方法的类必须重新编译,这种情况下这两个职责就应该被分离。不分开
如果需求的变化总是导致这两个职责同时变化,那么就不应该分离它们。实际上,分离它们就会有不必要的复杂性的臭味。
结论
SRP是所有原则中最简单的之一,也是最难正确运用的之一。我们会自然地将职责混合在一起。软件设计真正要做的许多内容,就是发现职责并把那些职责分离。