软件设计模式原则(三)单一职责原则

        单一职责原则(SRP)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。

目录

一.定义

二.原理

类的单一职责原则

单一职责原则好处

三.实践



一.定义

        每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起——这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。例如:要实现逻辑和界面的分离。

二.原理

        如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。

类的单一职责原则

        一般一个对象可以分为属性行为二部分,所以在类的设计时,我们一般把对象的属性抽象成一个BO(Business Object,业务对象),把对象的行为抽象成一个Biz(Business Logic,业务逻辑)

单一职责原则好处
  • 降低类的复杂性:每个类实现单一职责,并且单一职责都有清楚明确的定义,复杂性当然降低
  • 提高可读性:类的复杂性降低了,当然提高了可读性了。
  • 提高可维护性:类的复杂性降低,可读性好,当然好维护。
  • 提高扩展性:变更引起的风险降低,变更是必不可少的,如果接口的单一职责做的好,一个接口修改只对相应的实现类有影响,对其它的接口没有影响,这对系统的扩展性,维护性都是有好处的。

归纳弱点:

  • 职责多,引起此类变化的原因也多。后续变更的风险就大。
  • 后续需求变更,会造成职责的混乱,类结构的不稳定。

三.实践

举个例子,将一个女孩追到手,有如下两种方式:

方法一

public void ChaseGirl()
{
	SentLetter();
	DevelopFeeling();
	MakeVow();
}

public void SentLetter()
{
	
}

public void DevelopFeeling()
{
	
}

public void MakeVow()
{
	
}

方法二

public void ChaseGirl()
{
	SentLetterAndDevelopFeeling();
	MakeVow();
}

public void SentLetterAndDevelopFeeling()
{
	
}

public void MakeVow()
{
	
}

        不难看出,虽然底层的实现逻辑几乎相同,但是方法二中将送情书and发展感情耦合在了一个类中,违反了单一原则:假设有的女孩对情书不屑一顾,那么就要修改认识的方式——但此时也要修改发展感情的方法~这就是典型的耦合性高的开发~

单一职责原则的重心不在于“一”,而是如何拆分“一”:每个设计师都知道软件应该解耦和分层,但难的是何时分,以及如何分——比如有的人就认为建立契机和发展感情应该是一个统一的过程~ 

因此引出解决的方法:遵守单一职责原则,将不同的职责封装到不同的类或模块中。

类改造:改造后,类的职责单一

原有违背单一职责原则的类如下:

修改后如下:

        这种清晰的职责范围划分就是单一职责原则的最佳实践。符合单一职责原则的设计能使类具备高内聚性,让单个模块变得简单易懂,如此才能增强代码的可读性和可复用性。并提高系统的易维护性和易测试性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux下安装nginx

第一步:压缩包 准备压缩包,最好准备一个稳定的版本:下载地址 我这边选用的是1.24.0双版本号 第二步:解压 在相对应的目录下,执行命令:tar -zxvf nginx-1.18.0.tar.gz 第三步:配置\编译 推荐…

【vue】尚硅谷vue3学习笔记

Vue3快速上手 1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/release…

图论|并查集理论基础 1971. 寻找图中是否存在路径

什么是并查集 并查集是一种数据结构,用于处理一些不交集的合并及查询问题。它支持两种操作: 查找(Find):确定某个元素属于哪个子集。它可以用来判断两个元素是否属于同一个子集。 合并(Union)&…

Button初了解

Button 由TextView派生而来,二者的区别有: Button有默认的按钮背景,TextView默认无背景Button的内部文本默认居中对齐,而TextView的默认靠左对齐2023年以前,Button默认将英文换为大写,而TextView保持原始的…

springboot助农管理系统

springboot助农管理系统 成品项目已经更新!同学们可以打开链接查看!需要定做的及时联系我!专业团队定做!全程包售后! 2000套项目视频链接:https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwdekjv 提…

虚拟化逻辑架构: VM VirtualBox 指定6.0.24版本开启硬件辅助虚拟化功能

目录 一、实验 1.安装VM VirtualBox-6.0.24 2.安装VM VirtualBox-6.1.26 3.再次重新安装VM VirtualBox-6.0.24 二、问题 1.系统开机报错 2.Ubuntu系统无法自适应VM VirtualBox系统边框 3.VirtualBox如何开启无缝模式 3.Ubuntu如何查询软件是否已经安装 一、实验 1.安…

Redis之五大基础数据类型(详细总结 面试必备)

Redis之五大基础数据类型 Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。 这 5 种数据类…

二叉树在线OJ

二叉树的构建及遍历 本题目的要求是: 输入一个数组,里面存放了若干个字符,#代表了空指针,数组中的顺序是 是先序遍历,然后要求你用中序输出 首先我们要做的就是构造结构体: typedef struct TreeNode {char…

leetcode:232. 用栈实现队列

一、题目 原题链接:232. 用栈实现队列 - 力扣(LeetCode) 函数原型: typedef struct //我的队列结构定义 { } MyQueue; MyQueue* myQueueCreate() //我的队列创建及其初始化 void myQueuePush(MyQueue* obj, int x) //我的队…

shell编程awk命令详解(超详细)

文章目录 前言一、awk命令介绍1. awk命令简介2. awk命令的基本语法3. 常用的awk命令选项4. 常用的awk内置变量 二、awk命令示例用法1. 打印整行2. 打印特定字段3. 根据条件筛选行4. 自定义分隔符5. 从文件中读取awk脚本 总结 前言 awk命令是一种强大的文本处理工具&#xff0c…

【理解ARM架构】中断处理 | CPU模式

🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🍜中断🍨GPIO中断代码实现 🍜CPU🍨CONTROL…

Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 队列的说明 1.1 队列的几种常用操作 2.0 使用链表实现队列说明 2.1 链表实现队列 2.2 链表实现队列 - 入栈操作 2.3 链表实现队列 - 出栈操作 2.4 链表实现队列 …

机器学习笔记 - 什么是3D语义场景完成/补全?

一、什么是3D语义场景补全? 3D 语义场景完成(Semantic Scene Completion)是一种机器学习任务,涉及以体素化形式预测给定环境的完整3D场景(完成3D形状的同时推断场景的 3D 语义分割的任务)。这是通过使用深度图和为场景提供上下文的可选 RGB 图像来完成的。目标是以一种可轻…

2023年腾讯云双12优惠活动整理汇总

2023年双12腾讯云推出了年末感恩回馈活动,年度爆款2核2G4M云服务器118元/年,新老用户同享,还可领取总面值2000元代金券,老用户服务器续费4折起。本文为大家整理汇总腾讯云双12优惠活动。 活动地址: 点此直达腾讯云双1…

linux常用命令-find命令与scp命令详解(超详细)

文章目录 前言一、find命令介绍1. find命令简介2. find命令的基本语法3. 常用的find命令选项和表达式 二、find命令示例用法1. 按照名称进行搜索2. 按照类型进行搜索3. 按照修改时间进行搜索4. 按照文件大小进行搜索5. 对搜索到的文件执行指定的命令6. 删除搜索到的文件 三、sc…

23种设计模式之C++实践(二)

23种设计模式之C++实践 3. 设计模式(二)组合型模式7. 适配器模式——不兼容结构的协调7.2:类适配器模式7.3:双向适配器模式适配器模式总结8.桥接模式——处理多维度变化桥接模式总结9. 组合模式——树形结构的处理9.2 透明组合模式9.3 安全组合模式组合模式总结10. 装饰模式…

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。 流程配置ncnn android yolov5导出自己模型的ncnn修改yolo.py文件导出TorchScript文件pnnx转torchscript为ncnn 安卓运行权重路径输入输出anchors 大小类别名generate_proposals方法修改 结果 流程 网络yolov5 的部署已经有很多了…

分享一个国内可用的免费GPT4-AI提问AI绘画网站工具

一、前言 ChatGPT GPT4.0,Midjourney绘画,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而,GPT-4对普…

Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!

1、背景 集群配置为:8 个 node 节点,16 核 32G,索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高,search 没有慢查询的状态。 2、集群压测性能不能上去,cpu 使用未打…

mybatis的一级缓存和二级缓存

mybatis的一级缓存和二级缓存 mybatis设计两级缓存来提高查询效率。 一级缓存是SqlSession级别,每个会话都需要创建一个sqlsession,避免同一个用户在多次查询中每次都去查询数据库就把查询结果做了缓存 二级缓存 跨SqlSession的缓存,以及缓存…