单一职责原则(Single Responsibility Principle )简称SRP
定义
一个类应该只有一个发生变化的原因。
简单理解:一个类只负责一项职责或只做一件事情。
理解
该原则看上去非常简单明了,但这个设计原则备受争议却又极其重要,只有当亲身经历写过垃圾代码后,才能逐渐明白深意。
栗子
Volley中,HttpStack(HttpClientStack,HurlStack)类族就体现了该原则
public interface HttpStack {
public HttpResponse performRequest(Request<?> request, Map<String,String> additionalHeaders)
throws IOException, AuthFailureError;
}
HttpStack定义了一个执行网络请求的接口,只有一个performRequest函数。它的职责就很单一,而且清晰明确。如果需要修改网络请求相关代码,只需要修改HttpStack的实现,不会影响其它类的代码。
假如HttpStack的实现包含执行网络请求、解析网络请求、gzip压缩、封装请求参数,那在修改代码时必须谨慎,避免因修改而影响其它功能。
单一职责原则并不是说一个类只有一个函数,而是说这个类中的函数所做的工作是高度相关的,也就是高内聚。
查看HttpStack的实现HttpClientStack可以看出该类并不只有一个函数,但所做的工作都高度相关。
优点
- 类的复杂性降低、实现什么职责都有清晰明确的定义。
- 可读性提高,复杂性降低,那么当然可读性提高了。
- 可维护性提高,可读性提高,那当然更容易维护。
- 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。
总结
从单一职责原则定义来看非常简单,但最大的问题就在于对职责的怎么定义,怎么划分类的职责,每个人的场景和问题都不一样,所以很多时候都需要靠个人经验来界定。