设计模式之路(2)单一职责原则

一、单一职责原则基本定义

Single Responsibility Principle,缩写是SRP。

定义:There should never be more than one reason for a class to change.

即单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。

单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

二、由来

SRP这一概念,由Robot C. Martin在其广泛流行的经典著作《Agile Software Development, Principles, Patterns, and Practices》中的面向对象设计原则部分引入。此原则有两个约束:

  • 职责:什么是职责?我之前认为是一个类要实现的功能,或者提供的服务,从面向对象的角度说是内聚性。从这个角度去理解也可以,但是,功能的大小怎么定义是个难题,什么样的功能放在一起是好的内聚也不好定义。我们知道,面向对象设计更多考虑变化因素可能导致系统的改变,从而提供更灵活应变的设计。所以Robert C. Martin从变化这个角度对职责的定义为:“变化的原因(a reason for change)”,理解为,如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。

  • 单一:只有一个引起类改变的原因

在Martin的书中分析单一职责带来的好处是:

  • 可以分离变化
  • 减少改动
  • 减少不必要的依赖,从而在发生变化时减少设计所遭受的破坏。

但更多的是从类和接口的角度去分析。然而SRP对每一个程序模块都是适用的,比如小到代码块,函数,大到包级别,组件级别。

三、小结

SRP是一把双刃剑,如果做到极端,没有合理的权衡,对于类来说就有可能形成爆炸。类爆炸的可能性有,职责没有划分清楚而形成过多的类;因为业务的需要,需求的复杂性带来的。不论其产生的原因,过多的类,如果没有好的组织方式,杂乱无章,势必带来维护的复杂性。所谓维护的复杂性,在于代码的可读性,以及重构的高成本。一种可行的解决方案就是利用模式来管理,定义清晰的层次结构。比如利用工厂,模板方法等等。

总结起来,对于SRP,正如Robert C. Martin所说,是一起面向对象设计中最简单的原则之一,也是最难正确应用之一。它是其它原则的基础,比如OCP(Open for extension, Close for modification)。但是,万变不离其宗,本质是抽象变化,解除耦合,让设计出来的系统可读性好,可维护性好,可扩展性好。合理的职责划定带来清晰代码单元结构,如果设计不合理则适得其反,导致代码难以读懂,维护成本增加。

Neil Liu wechat
个人微信,欢迎交流
让我感受下知识的力量~