《敏捷软件开发:原则、 模式与实践》中这样描述:就一个类而言,应该仅有一个引起它变化的原因。
在SRP中,把类职责定义为“变化的原因”(a reason for change),每一个职责都是变化的一个轴线(an axis of change ),如果有多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。当需求变化时,该变化会反应为类的职责的变化,如果一个类承担的职责过多,就等于将这些职责耦合在了一起,一个职责的变化可能换削弱或者抑制这个类完成其他职责的能力。
考虑下面类图中的设计。Rectangle类具有两个方法,一个方法把矩形绘制在屏幕上,另一个方法计算矩形的面积。
有两个不同的应用程序使用Rectangle类。一个是计算机几何学方面的,Rectangle类会在计算机几何形状计算方面为它提供帮助,它从来不会在屏幕上绘制矩形。另外一个应用程序实质上是有关图形绘制方面的,它可能也会进行一些计算几何方面的工作,但是它肯定会在屏幕上绘制矩形。
这个设计违反了单一职责原则,Rectangle类具有两个职责。第一个职责提供了一个矩形几何形状的数据模型,第二个职责是把矩形在图形用户界面上绘制出来。
这将导致一些严重问题。首先,必须在计算几何用用程序中包含GUI代码,如果这是一个C++应用程序,就必须要把GUI代码链接进来,这会浪费链接时间、编译时间以及内存占用。如果是一个Java应用程序,GUI的.class文件必须要被部署到目标平台。其次,如果GraphicalApplication的改变由于一些原因导致了了Ranctangle的改变,那么这个改变会迫使我们重新构建、测试以及部署ComputationGeometryApplication。
一个好的设计是把这两个职责分离到两个不同的类中,改进后的设计如下。Rectangle类中进行计算的部分移到GeometryRectangle类中,这时矩形绘制方式的改变不会对ComputationGeometryApplication造成影响。