单一职责原则(The Single Responsibility Principle, SRP)

概念

作为对象系统最基本的元素,类自身的设计质量将直接影响到整个设计方案的质量。
对于单个类而言,最核心的工作就是其职责分配过程

内聚性是一个模块的组成元素之间的相关性。模块设计应遵循高内聚的设计原则。其中功能内聚是内聚度最高的一种内聚形式,是指模块内所有元素共同完成一个功能,缺一不可,模块不能再被分割。对于类设计来说,单个类也应保持高内聚,即达到功能内聚。单一职责原则即描述了这一设计要求:​“对一个类而言,应该只有一类功能相关的职责。​”

可以把类的每一类职责对应一个变化的维度;当需求发生变更时,该变化会反映为类的职责的变化。因此,如果一个类承担过多的职责,那么就会有多个引起变化的原因,从而造成类内部的频繁变化;同时,不同的职责耦合在同一个类中,一个职责的变化可能会影响其他职责,从而引发“脆弱性”的“臭味”​。为此,类设计应遵从SRP,应建立高内聚的类。

例子

违背SRP的设计方案:

在这里插入图片描述
由于Rectangle类涉及了图形绘制等问题,因此需要用到开发环境所提供的GUI图形库(采用GUI Library包来表示)来绘图。另外,数学应用程序和绘图程序(分别用两个包来表示)都需要用到该类,因此也建立了这两个应用程序与Rectangle之间的依赖关系。

这个设计方案明显违背了SRP,因为Rectangle有两类毫不相关的职责:

  • 其一是周长、面积等与数学模型相关的职责;
  • 其二则是绘制等与图形用户界面相关的职责。

而由于违背SRP,该设计模型存在一些严重的问题。

  • 数学应用程序只涉及计算周长、面积等数学模型,与GUI毫不相关,但也依赖于GUI图形库。
  • 当GUI图形库发生变化(如应用程序由Windows移植到Linux,相应的图形接口会发生变化)时,需要重新修改Rectangle类,而这种修改会影响到数学应用程序。这种影响是难以接受的,因为该程序与GUI没有任何关系。因此,一个好的设计方案是将其中的一类职责分离出来,从而保持每一个类处理一类职责,从而满足SRP。

因此,一个好的设计方案是将其中的一类职责分离出来,从而保持每一个类处理一类职责,从而满足SRP。如图:

在这里插入图片描述
在该设计方案中,保留了Rectangle类中的与数学模型相关的职责,而将GUI方面的职责封装到一个新的GUIRectangle类中。该方案中数学应用程序与GUI完全无关,从而避免了上述问题的发生。而图形绘制程序则依赖于新的GUIRectangle类来处理长方形的绘制等问题,GUIRectangle类通过一个关联关系访问Rectangle类,从而获知需要绘制的长方形的信息。

SRP是一个非常简单的原则,却是最难正确应用的原则之一。正如初学软件工程者都知道模块设计时的高内聚和低耦合原则,但怎样才能达到高内聚的目标很难简单地描述清楚。SRP明确地告诉设计人员应保持类职责的内聚性。但单一类职责并不等于说类只有一个职责,这种职责过于单一的类必将加大系统的耦合程度。因此,要合理评估类的职责,结合业务场景考虑职责的相关性,从而将不相关的职责相互分离,达到SRP所要求的类的内聚性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值