单一职责原则(The Single Responsibility Principle,SRP)
就一个类而言,应该仅有一个引起它变化的原因。
为何要把两个职责分离到单独的类中?
因为每一个职责都是变化的一个轴线(an axis of change)。当需求变化时,该变化会反应为类的职责的变化。如果一个类承担了多于一个的职责,那么引起它变化的原因就会有多个。
Rectangle 类具有两个职责
1、提供了一个矩形几何形状的数学模型;
2、在一个图形用户界面上绘制。
一个较好的设计是把这两个职责分离到不同的类中:
什么值职责
在SRP中,我们把职责定义为“变化的原因”(a reason for change)。如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。
如果应用程序的变化总是导致多个职责同时变化,那么就不必分离它们。
推论:变化的轴线仅当变化实际发生时才具有真正的意义。如果没有征兆,那么就去应用SRP,或者任何其他原则都是不明智的。
// 调制解调器违反SRP
public interface Modem {// 拨号public void dial(String pno);// 挂机public void hangup();// 发送public void send(char c);// 接收public void recv();
}
Modem 包含两个职责
1、连接管理(dial 和 hangup);
2、数据通信(send 和 recv)。
分离耦合的职责
ModemImplementation看作是一个杂凑物(kludge),或者一个瑕疵。然而请注意所有的依赖关系都和它无关,谁也不依赖于它。除了main外,谁也不知道它的存在。
持久化
一种常见的违反SRP的情形。Employee类包含了业务规则和对持久化的控制。