`

单一职责原则

阅读更多

动机:阅读《敏捷软件开发–原则、模式与实践》很长时间,收益非浅。不过书中的示例都是c++或者java的,想把他们改写成as的模式,同时增加一些自己的感想。

这条原则曾经被称之为内聚性(cohesion)。他们把内聚性定义为:一个模块的组合元素之间的功能相关性。在本章中,我们稍微改变一下它的含义,把内聚性和引起一个模块或者类改变的作用力联系起来。

1.单一职责原则(SRP)

就一个类而言,应该仅有一个引起它变化的原因。

例如,在一个Game类中,可能会具有两个不同的职责,一个职责是维护创建当前轮的比赛,另一个职责是计算总比赛得分。根据srp原则,着两个职责应该分离到两个类中,Game类保持维护创建当前轮的比赛,Scorer类负责计算比赛的得分。

如何要把这两个职责分离到单独的类中呢?因为每个职责都是一个变化的轴线。当需求变化时,该变化会反映到类的职责的变化。如果一个类承担了多于一个的职责,那么引起它变化的原因就会有多个。

如果一个类承担的职责过多,等于把这些职责耦合在了一起。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

例如,考虑下图的设计。Retangle类具有两方法,如图。一个方法把矩形绘制在屏幕上,另一个方法计算矩形的面积。

有两个不同的Application使用Rectangle类,如上图。一个是计算几何面积的,Rectangle类会在几何形状计算方面给予它帮助。另一个Application实质上是绘制一个在舞台上显示的矩形。

这一设计违反了单一职责原则。Rectangle类具有了两个职责,第一个职责是提供一个矩形形状几何数据模型;第二个职责是把矩形显示在屏幕上。

对于SRP的违反导致了一些严重的问题。首先,我们必须在计算几何应用程序中包含核心显示对象的模块。其次,如果绘制矩形Application发生改变,也可能导致计算矩形面积Application发生改变,导致不必要的重新编译,和不可预测的失败。

一个较好的设计是把这两个职责分离到下图所示的两个完全不同的类中。这个设计把Rectangle类中进行计算的部分一道GeometryRectangle类中。现在矩形绘制方式的改变不会对计算矩形面积的应用产生影响了。

1.1 什么是职责

在SRP中,我们把职责定义为“变化的原因”(a reason for change)。如果你能够想到多于一个的动机去改变类,那么这个类就具有多于一个的职责。有时,我们很难注意到这一点。我们习惯于以组的形式去考虑职责。

interface Modem{
     public dial(pno:String):void;
     public hangup():void;
     public send(c:Char):void;
    public recv():void;
}

 

上述Modem接口,大多数人会认为这个接口看起来非常合理。该接口声明了4个函数确实是Modem所具有的功能。然而,该接口却显示出了两个职责,一个是连接管理(dial+hangup),第二个是数据通信(send+recv)。

这两个职责应该被分离开么?这依赖于应用程序的变化。 是按照实际情况决定的。如果应用程序的变化会影响连接管理,那么设计就具有僵化的臭味。因为,调用send和recv的类必须要重新编辑。在这种情况下,这两个职责应该被分离,这样做会避免这两个职责耦合在一起。

另一方面,如果应用程序的变化总是导致这两方面职责同时变化,那么就不必分离他们。实际上,分离他们就会具有不必要的复杂性臭味。

1.2 持久化

上图展示了一种常见的违反SRP的情况,Employee类包含了业务逻辑和对于持久层的控制。这两个职责在大多数情况下决不应该混合在一起。业务规则往往会频繁的变化,而持久化的方式却不会如此频繁的变化,并且变化的原因也是完全不同的。把业务规则和持久模块绑定在一起的做法是不妥的。当僵化性和脆弱性的臭味变得强烈,那么就应该使用FACADE和PROXY模式对设计进行重构,分离这两个职责。

小结:

SRP是所有原则中最简单的之一,也是最难正确应用的。我们会自然的把职责结合在一起。软件设计要做的许多内容,就是发现职责并把那些职责相互分离。分离的原则也不是教条性的,需要应实际需求而定。

分享到:
评论

相关推荐

    单一职责原则(SRP)

    单一职责原则(SRP) 单一职责原则(SRP)是面向对象设计的五个基本原则之一。该原则规定,一个类应当只有一个引起它变化的原因。换言之,一个类应该只有一个职责,避免一个类承担多个职责,从而降低类的耦合度和...

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

    本文将深入探讨这六大原则中的第一个——单一职责原则(Single Responsibility Principle, SRP),并结合AcountYear.java这个文件名来解析该原则的应用。 单一职责原则指出,一个类或者一个模块应该只有一个引起它...

    设计模式(三)之单一职责原则.zip

    单一职责原则可以使类的复杂度降低,实现什么职责都有清晰明确的定义;类的可读性提高,复杂度降低;可读性提高了,代码就更容易维护;变更(需求是肯定会变)引起的风险(包括测试的难度,以及需要测试的范围)降低...

    设计模式6大原则:单一职责原则

    设计模式6大原则:单一职责原则

    C#俄罗斯方块源码(单一职责原则)

    【标题】"C#俄罗斯方块源码(单一职责原则)" 涉及到的核心知识点主要是C#编程语言以及软件设计原则中的“单一职责原则”(Single Responsibility Principle, SRP)。C#是一种广泛用于开发Windows应用程序、Web服务和...

    15丨理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?1

    【单一职责原则】是软件设计中的一个重要原则,它是SOLID原则的首字母S代表的含义。SOLID原则是由五个设计原则组成的,分别是:单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open-Closed ...

    Java设计模式中单一职责原则详解.rar

    其中,"单一职责原则"(Single Responsibility Principle,SRP)是面向对象设计的基本原则之一,也是Java设计模式中的重要组成部分。本篇文章将深入探讨单一职责原则的概念、意义、应用及其在Java编程中的实际运用。...

    单一职责模式例子。

    在软件设计领域,单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的六大原则之一,由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Code》中提出。这个原则强调一个类或者模块应当...

    14丨软件设计的单一职责原则:为什么说一个类文件打开最好不要超过一屏?.pdf

    【单一职责原则】是软件设计中的一个重要原则,它源自于"设计模式:可复用对象的设计与模式"这本书,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者共同提出,通常被简称为SOLID原则之一。...

    单一职责原则.pdf

    **单一职责原则(Single Responsibility Principle, SRP)**是面向对象设计的基本原则之一,由罗伯特·C·马丁(Robert C. Martin)提出,并在《敏捷软件开发:原则、模式和实践》中阐述。这一原则是SOLID原则的首...

    6单一职责原则-课程内容.rar

    《单一职责原则详解》 在软件工程领域,设计原则是构建高质量、可维护代码的关键指导方针。其中,“单一职责原则”(Single Responsibility Principle,SRP)是面向对象设计的五个核心原则之一,由罗伯特·C·马丁...

    6单一职责原则-MOOC课程内容.pdf

    单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计(OOD)中的一个基本原则。它强调每个类应该只有一个改变的理由,意味着一个类应该只有一个职责,只有一个因素能引起这个类的变更。当类...

    PHP面向对象五大原则之单一职责原则(SRP)详解

    单一职责原则(SRP)是面向对象设计中的一个基本原则,它要求一个类应该只有一个引起它变化的原因。在PHP等面向对象编程语言中,遵守这一原则可以帮助开发人员编写出结构更清晰、维护性更强的代码。接下来,我们将详细...

    简单讲解Java设计模式编程中的单一职责原则

    Java设计模式中的单一职责原则(Single Responsibility Principle,SRP)是面向对象设计的基本原则之一,它的核心思想是:一个类或者一个模块应该只有一个引起它变化的原因。这意味着一个类应该只负责一项职责,使得...

    图形编辑器GraphicEditor类需要遵循单一职责原则,即一个类只负责完成一个功能或职责.uml

    图形编辑器GraphicEditor类需要遵循单一职责原则,即一个类只负责完成一个功能或职责.uml

    单一职责原则_动力节点Java学院整理

    【单一职责原则】是软件设计中的一个重要原则,它源自于面向对象设计的SOLID原则,由罗伯特·C·马丁(Robert C. Martin)提出。该原则的主要思想是,一个类或者模块应该只有一个引起其变化的原因,也就是说,类应该...

    Java设计模式七大原则-单一职责原则.md

    设计模式

    单一职责源码

    在软件设计领域,单一职责原则(Single Responsibility Principle, SRP)是面向对象设计的基本原则之一,由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Code》中提出。这一原则强调一个类或者模块应该有且...

    单一原则SRP.zip

    单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的基本原则之一,由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Architecture》中提出。这一原则主张一个类或模块应当有且仅有一...

Global site tag (gtag.js) - Google Analytics