首页 > 其他分享 >设计原则--单一职责原则SRP

设计原则--单一职责原则SRP

时间:2024-01-25 14:44:55浏览次数:30  
标签:职责 原则 -- 代码 SRP 模块 遵循 单一

目录


简介

单一职责原则(Single Responsibility Principle,SRP)是软件工程中的一种设计原则,它指出一个类或模块应该只有一个主要的职责,并且该职责应该被完整地封装在这个类或模块中。

遵循单一职责原则的好处包括:

  1. 提高可读性和可维护性:当一个类或模块只有一个明确的职责时,它的代码更容易理解和维护。

  2. 提高可复用性:如果一个类或模块只专注于一个职责,那么在其他项目中复用该类或模块会更加容易。

  3. 降低耦合:当类或模块的职责单一且明确时,它们之间的耦合会降低,从而使系统更加灵活和可扩展。

  4. 易于测试:由于职责单一,测试范围更小,更容易编写有效的测试用例。

要遵循单一职责原则,可以采取以下一些策略:

  1. 分离职责:将不同的职责分配给不同的类或模块。

  2. 内聚性:确保一个类或模块中的代码紧密相关,并且都与该类或模块的主要职责相关。

  3. 解耦:减少类或模块之间的依赖关系,使它们更容易独立修改和扩展。

  4. 抽象:使用抽象类和接口来定义通用的行为,而不是具体的实现细节。

通过遵循单一职责原则,可以使软件系统更加模块化、可维护和可扩展。


如何遵守?

在实际项目中,有效地遵循单一职责原则可以采取以下几个方法:

  1. 识别和分离职责:仔细分析系统的需求和功能,将不同的职责识别出来。将每个职责分配给一个独立的类或模块。

  2. 定义清晰的接口:为每个类或模块定义清晰的接口,明确其职责和与其他部分的交互方式。这样可以降低耦合,使代码更容易理解和维护。

  3. 避免混合职责:避免在一个类中混合多个不相关的职责。如果一个类承担了过多的职责,考虑将其拆分为多个更专注的类。

  4. 使用封装和抽象:利用封装和抽象的特性,将具体的实现细节隐藏在类的内部,只公开必要的接口和操作。这样可以更好地遵循单一职责原则。

  5. 持续审查和重构:定期审查代码,检查是否存在职责不清晰或违反单一职责原则的地方。进行适时的重构,将复杂的类或模块拆分为更小、更专注的部分。

  6. 团队协作和沟通:在团队中强调单一职责原则的重要性,促进团队成员之间的沟通和协作。共同努力确保代码的设计符合单一职责原则。

遵循单一职责原则需要在设计和编码过程中时刻关注职责的分离和清晰度。这有助于提高代码的可维护性、可读性和可扩展性,降低系统的复杂度,并使项目更加易于管理和开发。


反例

假设有一个名为 CustomerService 的类,它的职责包括处理客户数据、发送邮件以及生成报告。这个类违反了单一职责原则,因为它承担了多个不相关的职责:

  1. 处理客户数据:包括添加、修改、删除客户信息等。

  2. 发送邮件:用于向客户发送通知、营销邮件等。

  3. 生成报告:根据客户数据生成统计报告、销售报告等。

在这个例子中,如果 CustomerService 类中的任何一个职责发生变化,都可能影响到其他职责的正常工作。例如,如果需要修改发送邮件的方式,那么就需要修改 CustomerService 类中的相应代码,这可能会引入潜在的错误,并增加维护的难度。

为了遵循单一职责原则,可以将 CustomerService 类拆分为多个更专注的类:

  1. CustomerDataManager:专门处理客户数据。

  2. Mailer:专门负责发送邮件。

  3. ReportGenerator:专门用于生成报告。

这样,每个类都只专注于一个职责,并且可以更容易地进行修改、测试和维护,而不会相互影响。

标签:职责,原则,--,代码,SRP,模块,遵循,单一
From: https://www.cnblogs.com/yubo-guan/p/17987115

相关文章

  • lambda表达式
    1.假如有ABC等多个系统每个系统下有多个附件,每系统共两种文件类型分别为新设计文档和评审记录文档2.获取每个系统下该文件类型的上传的最新的文档(每个文件都标有最新日期duptime)3.Java代码处理逻辑和代码要实现获取每个系统下指定文件类型的最新上传文档的逻辑,可以按照以......
  • jclasslib 插件安装及使用
    原文地址blog.csdn.net学习Java,必须要了解JVM,而学习JVM知识时,总要去研究一些字节码指令而jclasslib这个插件很好的解决了这个问题jclasslib安装:1.打开设置或者按Ctrl+Alt+S,打开设置2.找到jclasslib插件点击install下载安装即可3.安装完重启,然后点击视图:......
  • 修改.class文件内容
    原文地址blog.csdn.net1.另存为.java文件下载安装JD-GUI,打开需要修改的jar包,找到想要修改的class文件,ctrl+s保存为.java文件2.修改.java文件内容,并生成.class文件修改.java文件内容并保存在当前文件夹的cmd中执行以下命令生成.class文件javac-c......
  • notepad++离线安装插件
    背景有一些外面的网站无法通过在线的方式直接安装插件,所有就需求从其他的渠道获取插件包,解压后离线安装。举例方法安装nppplugin_svn插件首先先下载插件压缩包nppplugin_svn_x86.zip解压后放到notepad++的插件文件夹中解压的文件夹需要跟dll文件名称一致重启notepad++即可......
  • 前端工程化解决方案webpack使用小结
    前端工程化解决方案webpack,模块化、组件化、规范化、自动化,使得前端开发更加高效。功能:代码压缩混淆、处理浏览器端js的兼容性、以模块化的方式处理项目中的资源webpack插件:clean-webpack-plugin清除dist文件夹之前打包生成的文件使用步骤:先安装 再在webpac......
  • 16、std::forward与完美转发详解
    概述std::forward是C++11中引入的一个函数模板,用于实现完美转发(PerfectForwarding)。它的作用是根据传入的参数,决定将参数以左值引用还是右值引用的方式进行转发。然而,完美转发是为了解决传递参数时的临时对象(右值)被强制转换为左值的问题。在C++03中,可以使用泛型引用来......
  • OB的内存&转储&合并
    OB的内存&转储&合并 转:https://www.cnblogs.com/z-uncle/p/17916448.html内存OBserver内存:物理总内存=OBserver内存+OS剩余内存。OBserver的内存分为两部分,一部分是system内存,一部分是租户内存。通过参数设定observer占用的内存上限:memory_limit_percentage=80--->80%......
  • 【K8S】label标签常用命令
    node节点增加、修改、删除、查看、查找label标签单个node增加标签:kubectllabelnode<nodename>type=basic所有node增加标签:kubectllabelnode--alltype=basic修改:kubectllabelnode<nodename>type=special--overwrite删除单个标签:kubectllabelnode<nodename>type-......
  • svelte路由01
    1、about.svelte页面a、使用 use:link 方式<script>import{link}from'svelte-spa-router';</script><div>这里是about关于我们</div><div><ahref="/home"use:link>进入首页</a></div>......
  • 近6成金融机构的选择!华为云GaussDB加快金融核心系统转型
    当前,数据库在金融机构的应用正在从办公、一般系统逐步迈入核心系统应用的深水区。如何构建安全可靠、高效稳定的核心系统数据库,支持业务运营和管理决策,成为了众多金融机构关注的焦点问题。近期,北京金融信息化研究所联合华为云、中国工商银行、中国邮政储蓄银行、华夏银行共同发布......