单一职责原则的定义
单一职责原则的英文原话是:
There should never be more than one reason for a class to change.
意思是:一个类,应当只有一个引起它变化的原因;即一个类应该只有一个职责。
就一个类而言,应该只专注于做一件事和仅有一个引起变化的原因,这就是所谓的单一职责
原则。该原则提出了对对象职责的一种理想期望,对象不应该承担太多职责,正如人不应该一心分为二用。
唯有专注,才能保证对象的高内聚
;
唯有单一,才能保证对象的细粒度
。
对象的高内聚
与细粒度
有利于对象的重用。一个庞大的对象承担了太多的职责,当客户端需要该对象的某一个职责时,就不得不将所有的职责都包含进来,从而造成冗余代码。
单一职责原则还有利于对象的稳定。
-
所谓“职责”,就是对象能够承担的责任,并以某种行为方式来执行。
-
对象的职责总是要提供给其他对象进行调用的,从而形成对象与对象的协作,由此产生对象之间的依赖关系。
-
类的职责越少,则对象之间的依赖关系就越少,耦合度就减弱,受其他对象的约束与牵制就越少,从而保证了系统的
可扩展性
。 -
因此,在
单一职责原则
中,也可以把“职责”定义为“变化的原因”。 -
如果存在多个动机去改变一个类,那么这个类就具有多于一个的职责。
-
“变化的原因”只有实际发生时才有意义,可能预测到会有多个原因引起这个类的变化,但这仅仅是预测,并没有真的发生,那么这个类仍可看做具有单一职责,不需要分离职责。
-
单一职责原则
并不是极端地要求我们只能为类定义一个职责,而是利用极端的表述方式重点强调,在定义对象职责时,必须考虑职责与对象之间的所属关系 -
职责必须恰如其分地表现对象的行为,而不至于破坏和谐与平衡的美感,甚至格格不入。
-
换言之,该原则描述的
单一职责
指的是公开在外的与该对象紧密相关的一组职责。
例如,如图2-1所示,在媒体播放器中,可以在MediaPlayer
类中定义一组与媒体播放相关的方法,如open()、play()、stop()
等。这些方法从职责的角度来讲是内聚的,完全符合单一职责原则中“专注于做一件事”的要求。如果需求发生扩充,还需要提供上传、下载媒体文件的功能,那么在设计时,就应该定义一个新类,如MediaTransfer
,由它来承担这一职责,而不是为了方便,草率地将其添加到MediaPlayer
类中。
单一职责的优点
单一职责原则的优点有以下几个方面:
■ 降低类的复杂性;
■ 提高类的可读性;
■ 提高代码的可维护性和复用性;
■ 降低因变更引起的风险。
总结
- 不要在一个
类
中包含万物