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

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

背景介绍


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

《架构整洁之道》系列:



SRP 单一职责原则


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


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


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

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


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

这里我举一个例子:


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


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

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

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


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


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


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

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


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


结束语


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


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


最后


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

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

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

相关文章
|
8月前
|
设计模式 关系型数据库 数据安全/隐私保护
软件架构设计原则之单一职责原则
单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个类负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能导致另一个职责的功能发生故障。这样一来,这个类就存在两个导致类变更的原因。如何解决这个问题呢?将两个职责用两个类来实现,进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。总体来说,就是一个类、接口或方法只负责一项职责。
66 0
软件架构设计原则之单一职责原则
|
3月前
|
设计模式 存储 NoSQL
【设计模式】软件设计原则-单一职责原则
【1月更文挑战第12天】【设计模式】软件设计原则-单一职责原则
|
8月前
|
设计模式 关系型数据库
软件架构设计原则之接口隔离原则
接口隔离原则符合我们常说的高内聚、低耦合的设计思想,可以使类具有很好的可读性、可扩展性和可维护性。我们在设计接口的时候,要多花时间去思考,要考虑业务模型,包括对以后有可能发生变更的地方还要做一些预判。所以,对于抽象、对于业务模型的理解是非常重要的。下面我们来看一段代码,对一个动物行为进行抽象描述。
58 0
|
8月前
|
设计模式 关系型数据库
软件架构设计原则之迪米特法则
迪米特原则(Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合度。迪米特原则主要强调:只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以称为成员朋友类,而出现在方法体内部的类不属于朋友类。
68 1
|
10月前
|
设计模式 安全 Java
设计原则之接口隔离原则
设计原则之接口隔离原则
48 0
设计原则之接口隔离原则
|
10月前
|
设计模式 安全 Java
设计原则之依赖倒置原则
设计原则之依赖倒置原则
56 0
设计原则之依赖倒置原则
|
设计模式
单一职责原则|设计原则
本文带大家学习和了解第一种设计原则,单一职责原则
|
Java API 开发工具
接口隔离原则|设计原则
今天为大家带来的依旧是 设计原则 的知识: 接口隔离原则
|
设计模式
里氏替换原则|设计原则
里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程序中代替其基类(超类)对象。”
开闭原则|设计原则(二)
由于在软件体系中,唯一不变的,就是软件一直在变。