软件设计原则之SRP:单一职责原则

2024-04-06 14:58

本文主要是介绍软件设计原则之SRP:单一职责原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇介绍软件设计原则之一SRP:单一职责原则。

SRP:单一职责原则

一个类应该只有一个发生变化的原因。

Why

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

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

如何定义职责

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

Modem.java

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

接口中却显示出了两个职责。第一个职责连接管理,第二个数据通信。dial和hangup函数进行连接处理,而send和recv函数进行数据通信。

那么这两个职责应该分开吗?这依赖于程序变化的方式。如果应用程序的变化会影响连接函数的签名,那么这个设计就具有僵化性的臭味,因为调用send 和 recv的类必须要重新编译、部署的次数常常会超过我们希望的次数。这种情况下,这两个职责应该被分离。

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

有个推论是:仅当变化发生时,变化的轴线才具有实际意义。如果没有征兆,那么应用SRP或者任何其他原则都是不明智的。

分离耦合的职责

上面,我们把两个职责都耦合进了modem的实现类中。这不是所希望的,但是或许是必要的。常常会有一些和硬件和操作系统的细节有关的原因,迫使我们不愿耦合在一起的东西耦合在了一起。然而对于应用的其余部分来说,通过分离它们的接口我们已经解耦了概念。已经把丑陋的部分隐藏起来了。其丑陋性不会污染应用程序的其他部分。

SRP是所有原则中最简单的原则之一,也是最难正确运用的原则之一。我们会自然地把职责结合在一起。软件设计真正要做的许多工作,就是发现职责并把那么职责相互分离。事实上,我们将要论述的其余原则都会以这样或那样的方式回到这个问题上。

结论

职责定义为变化的原因,对于一组的耦合的职责设计要不要分离,具体要看职责是不是同时变化,我们可以通过接口来分离耦合的职责。

 

本文首发于个人微信公众号:webguan ;欢迎您的关注

这篇关于软件设计原则之SRP:单一职责原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/880141

相关文章

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

PHP最长单一子串

<?php//方法一$s='abcccddddddcdefg';$max='';while($s!=''){$i=0; while($i<strlen($s) && $s[$i]==$s[0]) $i++;if ($i>strlen($max)){$max=substr($s,0,$i);} $s=substr($s,$i);}echo $m

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

水处理过滤器运行特性及选择原则浅谈

过滤属于流体的净化过程中不可缺的处理环节,主要用于去除流体中的颗粒物或其他悬浮物。水处理过滤器的原理是利用有孔介质,从流体中去除污染物,使流体达到所需的洁净度水平。         水处理过滤器的滤壁是有一定厚度的,也就是说过滤器材具有深度,以“弯曲通 道”的形式对去除污染物起到了辅助作用。过滤器是除去液体中少量固体颗粒的设备,当流体进入置有一定规格滤网的滤筒后,其杂质被阻挡,而

设计模式 -- 职责链模式(Chain of Responsibility Pattern)

1 问题引出 1.1 学校 OA 系统的采购审批项目 如果金额 小于等于 5000, 由教学主任审批 (0<=x<=5000)如果金额 小于等于 10000, 由院长审批 (5000<x<=10000)如果金额 小于等于 30000, 由副校长审批 (10000<x<=30000)如果金额 超过 30000 以上,有校长审批 ( 30000<x) 1.2 传统方式 传统方式是

读软件设计的要素03概念的组合

1. 概念的组合 1.1. 概念不像程序那样,可以用较大的包含较小的 1.1.1. 每个概念对用户来说都是平等的,软件或系统就是一组串联运行的概念组合 1.2. 概念是通过操作来同步组合的 1.2.1. 同步并不增加新的概念操作,但会限制已有的操作,从而消除一些独立概念可能会出现的操作序列 1.3. 在自由组合中,概念彼此独立,仅受一些记录的约束,这些约束是为了确保概念对事物观点的一

《论软件设计模式及其应用》通关范文,软考高级系统架构设计师

论文真题 设计模式(Design Pattern)是一套被反复使用的代码设计经验总结,代表了软件开发人员在软件开发过程中面临的一般问题的解决方案和最佳实践。使用设计模式的目的是提高代码的可重用性,让代码更容易被他人理解,并保证代码可靠性。现有的设计模式已经在前人的系统中得以证实并广泛使用,它使代码编写真正实现工程化,将已证实的技术表述成设计模式,也会使新系统开发者更加容易理解其设计思路。根据

软件设计之JDBC(3)

软件设计之JDBC(3) 此篇应在MySQL之后进行学习: 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷2024最新JDBC教程 | jdbc基础到高级一套通关! 资料可以去尚硅谷官网免费领取 学习内容: JDBC优化及工具类的封装ThreadLocal概述DAO概念及搭建事务的概述 1、JDBC优化及工具类的封装 JDBC过程中,部分代码存在冗余问题

掌握 Redis 数据冗余:主从服务器的角色与职责

掌握 Redis 数据冗余:主从服务器的角色与职责 一 . 什么是主从复制1.1 主从复制是什么 ?1.2 什么是主从模式1.3 主从复制能够解决的问题 二 . 配置主从复制2.1 启动多个 redis-server2.2 配置主从模式2.3 查看主从结构信息2.4 断开 / 临时修改主从结构 三 . 主从复制的补充内容3.1 安全性、只读、传输延时安全性只读传输延迟 3.2 主从复制的拓扑

读软件设计的要素02概念的目的

1. 要素 1.1. 概念的定义包括名称、目的、状态、操作和操作原则 1.2. 操作原则(operational principle) 1.2.1. 操作原则用于展示如何通过操作实现目的,这是理解概念的关键 1.2.2. 展示如何通过操作的组合实现概念的目的,包含一个或多个典型的使用场景 1.2.3. 操作原则并没有增加任何信息,因为你完全可以从操作规范中推理出任何使用场景 1