单一责任原则(SRP)是指一个类或者模块只应该负责一个功能领域的相应职责。
这个概念是由美国计算机科学家RobertC.Martin在《Principles of Object Oriented Design》一文中提出的,原始描述为“A class should have only one reason to change”,即“如果一个类需要被修改,那么修改它的原因应该仅有一个”。
也就是说,当业务中的一个功能领域Business A相关的逻辑需要修改或扩充时,我们需要修改与这个功能领域相关的类Class A。而当业务中的另一个功能领域Business B相关的逻辑需要修改或扩充时,如果我们还需要修改类Class A,则意味着Class A定义了过多的职责,没有实现功能单一化。
为什么要实现功能单一化呢?我们看一则旧闻——据2007年新华网报道,专门生产瑞士军刀的瑞士文格尔公司推出了一款新品军刀,记115种功能于一身,由此跻身吉尼斯世界纪录,成为世界上功能最齐备的刀具。人们不仅可以用这款军刀削水果、剪指甲、剔牙齿,还可以用它修理自行车和高尔夫鞋,甚至还能完成植物嫁接工作。
试想当我们看到这样一把功能最齐备的刀具时,除了想做收藏品之外,应该不会有人真的想在日常生活中使用它吧,它用起来应该很不方便。
功能单一的原因是,职责负担过多的类被修改的概率会很大,把多个功能放在同一个类中,每次修改一个功能,很可能会影响到同一个类中的另一个功能,软件的可维护性就会大大降低。
单一责任原则是为了保证创建职责单一、功能明确的基础类。而更加复杂的类则应该由这些类进行组合(即一个类的另一个类的属性),或者配合接口使用。
单一责任原则的主要目的是在设计类时,要保证一个类应该有且只有一个职责,类中可以由多个方法,但这些方法必须是为了这同一个职责服务的,其设计目标就是我们常说的高内聚,需要保证类内的方法与属性都是紧密结合的,它们都是为同一个职责服务的,不要包含与职责相关性不高的内容。