单一职责原则(Single Responsibility Principle),简称SRP
单一职责原则定义:应该有且仅有一个原因引起类的变更,即一个接口或是类只有一个职责,它就负责一件事情。
先来看一个糟糕的设计
可以看到IPhone这个接口有两个职责,一个是协议管理,一个是数据传送。dial()和hangup()两个方法实现的是协议管理,而chat()实现的是数据传送。如果是这样设计的话,当协议变化或者是数据传送的变化,都会影响到这个接口,那么就增加了程序的风险,显然不是一种好的设计。这个时候,我们就看到单一职责的好处了,我们可以把这个接口拆成两个接口,让一个接口负责协议管理,另一个接口负责数据传送,这样当一个职责发生变化时,就不会影响到另一个,增加了程序的健壮性。来看一下改进之后的类图:
一个类实现了两个接口,把两个职责融合在一个类中。虽然Phone这个类有两个职责,但是我们是面向接口编程,对外公布的是接口而不是实现类。单一职责不仅适用于接口和类,同样适用于方法,即一个方法尽量做一件事情。
小结:
单一职责比较难实现,因为“职责”没有一个量化的标准,到底一个类负责哪些职责?职责怎么细化?这些都要从实际出发,不能生搬硬套原则,原则是死的,就像毛爷爷当年在中国应用马克思主义一样,不能生搬硬套,要在我们现实情况的基础上去应用原则。
对于单一职责原则,作者的建议是:接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化