设计原则(二):SRP 单一职责原则

简介: 设计原则(二):SRP 单一职责原则

背景介绍


这是我的《架构整洁之道》系列的第六篇,这一篇我们将一起学习 SRP 单一职责原则~

《架构整洁之道》系列:



SRP 单一职责原则


SRP 原则总是被误解,有很多程序员认为这个原则的内涵是:每个模块都应该只做一件事


但是其实并不是这样的,与之混淆的设计原则为:一个函数只完成一个功能,我们在重构复杂函数的时候经常会使用这个原则,但这只是一个面向底层实现细节的设计原则,并非 SRP 原则的全部。


对 SRP 原则的描述应该为:任何一个软件模块都应该只对某一类行为者负责

这里的行为者指的是:一个或多个有共同需求的人


这里的软件模块指的是:一组紧密相关的函数和数据结构,“相关”这个词实际上就隐含了 SRP 这一原则。代码与数据就是靠着与某一类行为者的相关性被组合在一起的

这里我举一个例子:


网络异常,图片无法展示
|


某个工资管理程序中的 Employee 类有三个函数: calculatePay()、reportHours() 和 save()。

  • calculatePay() 函数是由财务部门制定的,他们负责向 CFO 汇报
  • reportHours() 函数是由人力资源部门制定并使用的,他们负责向 coo 汇报
  • save() 函数是由 DBA 制定的,他们负责向 CTO 汇报

程序员这样做实际上就等于使三类行为者的行为耦合在了一起了,违反了 SRP设计原则


针对上面这个问题,解决方案也很简单:


网络异常,图片无法展示
|


将相关的函数划分成不同的类。

网络异常,图片无法展示
|


或者如上图采用 facade 模式,EmployeeFacade 类仅需要包含初始化和调用三个具体实现类的函数。


结束语


网络异常,图片无法展示
|


单一职责原则主要讨论的是函数和类之间的关系一一但是它在两个讨论层面上会以不同的形式出现。在组件层面,我们可以将其称为共同闭包原则,在软件架构层面,它则是用于奠定架构边界的变更轴心。


最后


✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

少年向来不识天高地厚
放眼处皆自负才高八斗
虽是自命风流
倒也坦诚无忧
我爱这样的少年
谦和而狂妄
骄傲又坦然☀️

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

相关文章
|
机器学习/深度学习 人工智能 API
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5
558 0
|
存储 缓存 IDE
VirtualBox实现共享剪贴板
VirtualBox实现共享剪贴板
1040 0
|
开发工具 git 应用服务中间件
超简单!基于计算巢SaaS Boost快速售卖你的软件
通过计算巢开源项目SaaS Boost售卖你的软件使用流程
超简单!基于计算巢SaaS Boost快速售卖你的软件
|
安全 Java Android开发
构建高效安卓应用:探究Kotlin与Java的性能对比
【2月更文挑战第22天】 在移动开发的世界中,性能优化一直是开发者们追求的关键目标。随着Kotlin在安卓开发中的普及,许多团队面临是否采用Kotlin替代Java的决策。本文将深入探讨Kotlin和Java在安卓平台上的性能差异,通过实证分析和基准测试,揭示两种语言在编译效率、运行时性能以及内存占用方面的表现。我们还将讨论Kotlin的一些高级特性如何为性能优化提供新的可能性。
869 0
|
11月前
|
人工智能 安全 Dubbo
Spring AI 智能体通过 MCP 集成本地文件数据
MCP 作为一款开放协议,直接规范了应用程序如何向 LLM 提供上下文。MCP 就像是面向 AI 应用程序的 USB-C 端口,正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一个将 AI 模型连接到不同数据源和工具的标准化方法。
4823 101
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 表单布局Form Layout
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 表单布局Form Layout
610 2
|
前端开发 JavaScript
3分钟掌握!用HTML+CSS实现懒加载,真的这么简单?
3分钟掌握!用HTML+CSS实现懒加载,真的这么简单?
|
机器学习/深度学习 人工智能 搜索推荐
构建基于AI的个性化新闻推荐系统:技术探索与实践
【6月更文挑战第5天】构建基于AI的个性化新闻推荐系统,通过数据预处理、用户画像构建、特征提取、推荐算法设计及结果评估优化,解决信息爆炸时代用户筛选新闻的难题。系统关键点包括:数据清洗、用户兴趣分析、表示学习、内容及协同过滤推荐。实践案例证明,结合深度学习的推荐系统能提升用户体验,未来系统将更智能、个性化。
|
机器学习/深度学习 存储 Kubernetes
如何将 Apache Airflow 用于机器学习工作流
Apache Airflow 是一个流行的平台,用于在 Python 中创建、调度和监控工作流。 它在 Github 上有超过 15,000 颗星,被 Twitter、Airbnb 和 Spotify 等公司的数据工程师使用。 如果您使用的是 Apache Airflow,那么您的架构可能已经根据任务数量及其要求进行了演变。 在 Skillup.co 工作时,我们首先有几百个 DAG 来执行我们所有的数据工程任务,然后我们开始做机器学习。
|
编解码
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe9 in position 3114: invalid continuation byte
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe9 in position 3114: invalid continuation byte
192 0