单一职责原则进阶——多个地方的不同见解和解读

首先是定义

单一职责原则:一个类应该只有一个发生变化的原因
英文名叫Single Responsibility Principle,以下简称为SRP



下面我们从三本著作中去解读这个单一职责
这三本著作分别是《深入浅出面向对象分析与设计》、《设计模式解析》和《敏捷开发:原则、模式与实践》。

深入浅出面向对象分析与设计

首先他对SRP的解读稍有不同:

单一职责原则:系统里的每一个对象应该具有单一职责,所有对象的服务都应该聚焦在实现该职责上。

且他认为

内聚性是SRP的另一个名称。如果你的类是高内聚的,就表示你在正确的使用SRP。

为什么要强调他这里说的内聚性呢?因为在《敏捷》书中,他认为如果类的接口不是内聚的,那么就违反了接口隔离原则
(在百度百科里,他认为单一职责是基于内聚性提出的。图如下)

在最后他提出了一个判断是否是单一职责的办法:
写下一个式子:
the itself,其中第一个单词写类名,第二个单词写方法名,如果有参数的话在方法后跟上参数
我们举这样一个例子,调制调解器,就是光猫,可以拨号挂断,发数据和接收数据。

用《深入浅出》里的方法这个符合单一职责模式。但是在《敏捷》里就不符合了,这里在后面讲。
下面来看《设计模式解析》

设计模式解析

他将对象看做是具有责任的东西。每个对象包含一组职责,这个在之前如何理解一个类——单一职责原则中已经说了很多,这里不再赘述
最后一个是要将《敏捷》书

敏捷开发:原则、模式与实践

书中也说了来自于内聚性,但是在他的理解里,上述光猫的例子是违反SRP的。
他认为拨号和挂断属于连接管理,接受和发送属于数据通信。
我们把前者认为是A职责,后者是B职责,这两种职责是否应该被分开取决于两者是否经常同时变化
如果在A职责出现变动时,B职责也要同时变动,那么两个可以不用分开,否则的话就需要被分开。

  • 假设此时二者是同时变化的,而分开了
    那么带来的影响是:我在修改A职责所在的类时还要去审查B职责所在类的正确改动,显然是不好的。
  • 假设此时二者是非同时变化的,没有分开
    那么带来的影响是:(书中所说)其他不需要变化的方法需要重新部署编译,会增加部署的次数。另一方面我觉得是因为二者可以独立变化。
    最终的解决方案是将两个独立变化的职责分到了连接管理类和数据通信类,然后新建一个光猫类组合这两个类,外部依赖光猫类去调用。

    提到了另一个例子是MVC
    如Person类,从某种角度来看,Person的持久化(dao层)职责和业务(Service)职责都属于Person的职责,但是显然是不能放在一起的,原因是持久化层几乎不会变化,而业务层复杂多变改动大。持久化层隔离开后复用性高。
    最后文末提到了外观模式和代理模式,这两个模式可以用于分离职责。
    PS《敏捷》中提及的是否同步变化在其他两处没有特别强调,相对宽松,很多地方没有独立的讲接口隔离原则

原文地址:http://blog.51cto.com/13985113/2311418

时间: 2024-10-29 19:11:23

单一职责原则进阶——多个地方的不同见解和解读的相关文章

面向对象五大原则_1.单一职责原则&2.里氏替换原则

单一职责原则:Single Responsibility Principle (SRP) 一个类.仅仅有一个引起它变化的原因.应该仅仅有一个职责.每个职责都是变化的一个轴线.假设一个类有一个以上的职责,这些职责就耦合在了一起.这会导致脆弱的设计.当一个职责发生变化时,可能会影响其他的职责.另外,多个职责耦合在一起,会影响复用性. 比如:要实现逻辑和界面的分离. T负责两个不同的职责:职责P1.职责P2.当因为职责P1需求发生改变而须要改动类T时.有可能会导致原本执行正常的职责P2功能发生问题.

[OOD] 为什么单一职责原则(SRP)是最难运用的

单一职责原则(SRP)已经几乎是每一个程序员都知道的设计原则.最早由Robert C. Martin在<<敏捷软件开发 - 原则.模式与实践>>中正式提出.书中作者在结论中提到:  SRP是所有设计原则最简单的,但也是最难运用的.(中文翻译有之一,略去了) 现实工作中,关于一个类是否符合SRP,或者是否有必要符合SRP的讨论是经常发生的.争论的关键在于职责的定义,但我理解SRP真正的核心是关注于变化.这并不是我的新见解,全是来自Martin大叔的解释: 首先职责的定义是: 引起变化

设计模式六大原则(一):单一职责原则(SRP)

定义: 单一职责原则:就一个类而言,应该仅有一个引起它变化的原因. 原因: 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力.这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏.而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则.此原则的核心就是解耦和增强内聚性. 示例: 如果我们不遵守单一职责原则,会产生怎样的后果?产生的后果,我们是否能够接受呢? 我们去手机卖场的时候,往往可以发现,肯定在某个角落存在一个维

架构师之路——单一职责原则SRP (我单纯,我快乐)

定义: 不要存在多于一个导致类变更的原因.通俗地讲,一个类只做一件事情. 单一职责原则的好处: 1.类的复杂性降低,实现什么职责都有清晰明确的定义: 2.可读性提高,复杂性降低,那当然可读性提高了: 3.可维护性提高,可读性提高,那当然更容易维护了: 4.变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性.维护性都有非常大的帮助. 建议: 接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化 SRP好处

day01_面向对象五大原则_1.单一职责原则&amp;2.里氏替换原则

单一职责原则:Single Responsibility Principle (SRP) 一个类,只有一个引起它变化的原因.应该只有一个职责.每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起.这会导致脆弱的设计.当一个职责发生变化时,可能会影响其它的职责.另外,多个职责耦合在一起,会影响复用性.例如:要实现逻辑和界面的分离. T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障.也就是

如何定义一个类——单一职责原则

单一职责原则:就一个类而言,应该仅有一个引起他变化的原因. 1 一个老师类的例子 或者说在外部看来,一个类只应该能看到它的类的相关功能.如老师类只应该负责教授知识,备课,但是不应该负责开车.切合实际的说一个TaskService类不应该包含处理时间的类,他可以是private的,但是肯定不能是public的.这里引出另一个角度 2 如何看待一个类? 2.1通常的看法 通常的看法是,类是由成员属性和成语方法组成的数据结构或者是现实事物的抽象如对现实中的人抽象出Person,他具备人的基本属性和基本

面向对象编程的六大原则(1)--单一职责原则

什么是单一职责 单一职责原则(Single responsibility principle,简称SRP),顾名思义,是指一个类或者一个模块应该有且只有一个职责,它是面向对象编程六大原则之一. 单一职责的粒度 单一职责的粒度,可以是某个方法.某个类.某个程序包甚至某个功能.某个模块(甚至某个系统),每一个层次上都可以进行单一职责设计.下面来举个例子说明一下: 模块级别:某购物平台,包含如下几个模块:用户模块.商品模块.订单模块.库存模块.运输模块.支付模块,每一个模块都已本身的职责:用户模块负责

面向对象设计原则之一:单一职责原则

单一职责原则(Single Responsibility Principle SRP) There should never be more than one reason for a class to change. 什么意思呢? 所谓单一职责原则就是一个类只负责一个职责,只有一个引起变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化会削弱或抑制这个类完成其他职责的能力,这个耦合会脆弱的设计. 软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离:如果能

大话设计模式第三章之单一职责原则

单一职责原则指的是就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能削弱或者抑制这个类完成其它职责的能力(就像一个程序员  叫他去做医学研究,生物研究,可能会抑制他学设计模式的能力).这种耦合会导致脆弱的设计,当变化发生时,设计会遭到异常不到的破坏(你医学研究久了,设计模式少接触,也就生疏了). 在写一个类的时候,要在类的职责分离上多思考(类的职责搞不清楚,就好像你生病了去找修车的,买菜去学校买),这样代码才是真正的可维护,易扩