SOLID原则学习,单一职责原则(Single Responsibility Principle)

news2025/1/9 16:11:51

在这里插入图片描述

文章目录

  • 1. 定义
  • 2. 核心思想
  • 3. 优点
  • 4. 总结


1. 定义

单一职责原则是面向对象设计中的五大原则(SOLID)之一,由Robert C. Martin提出。它指出一个类应该只有一个引起它变化的原因,即一个类应该只负责一项职责。


2. 核心思想

职责:指的是类所承担的任务或功能。
单一:一个类应该只负责一个功能领域中的一项职责。

3. 优点

  • 高内聚:类的职责单一,功能集中,代码更易理解和维护。

  • 低耦合:职责分离后,类之间的依赖减少,修改一个类不会影响其他类。

  • 可复用性:职责单一的类更容易在其他地方复用。

  • 可测试性:职责单一的类更容易进行单元测试。

举例说明
假设我们有一个类 Report,它负责生成报告并将其打印出来。这个类违反了单一职责原则,因为它承担了两项职责:生成报告和打印报告。
违反SRP的代码:

class Report {
public:
    void generateReport() {
        // 生成报告的逻辑
        std::cout << "Generating report..." << std::endl;
    }

    void printReport() {
        // 打印报告的逻辑
        std::cout << "Printing report..." << std::endl;
    }
};

在这个例子中,Report 类负责生成报告和打印报告。如果未来需要修改生成报告的逻辑或打印报告的逻辑,都需要修改 Report 类,这增加了类的复杂性和维护成本。


遵循SRP的代码:
为了遵循单一职责原则,我们可以将 Report 类拆分为两个类:ReportGenerator 和 ReportPrinter,分别负责生成报告和打印报告。

class ReportGenerator {
public:
    void generateReport() {
        // 生成报告的逻辑
        std::cout << "Generating report..." << std::endl;
    }
};

class ReportPrinter {
public:
    void printReport() {
        // 打印报告的逻辑
        std::cout << "Printing report..." << std::endl;
    }
};

现在,ReportGenerator 类只负责生成报告,ReportPrinter 类只负责打印报告。这样,每个类都只有一个职责,代码更加清晰,易于维护和扩展。
使用示例:

int main() {
    ReportGenerator generator;
    ReportPrinter printer;

    generator.generateReport();  // 生成报告
    printer.printReport();       // 打印报告

    return 0;
}

4. 总结

单一职责原则通过将类的职责分离,使得每个类都专注于一个功能领域,从而提高了代码的可维护性、可复用性和可测试性。在实际开发中,遵循SRP可以帮助我们设计出更加清晰、灵活的软件系统。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对快速由表及里说拜拜/如何正确运用由表及里

你是不是还&#xff1a;看到一男子拖走一女子就以为小情侣吵架而已&#xff08;可能人贩子&#xff09;&#xff1b;看到男友对你好个几次就从此死心塌地&#xff08;可能有手就行&#xff0c;细节装装而已&#xff09;结果耽误终身&#xff1b;看到女同事对你微笑不排斥就以为…

【算法】八大排序算法

这篇文章是对数据结构中 八大经典排序算法 的详解&#xff0c;包括其原理、实现过程、时间复杂度、空间复杂度及其适用场景。最后两种排序不常见&#xff0c;但仍收录了进来保持文章结构的完整性。 排序(Sort)是将无序的记录序列&#xff08;或称文件&#xff09;调整成有序的…

【学习笔记】数据结构(十一)

外部排序 文章目录 外部排序11.1 外存信息的存取11.2 外部排序的方法11.3 多路平衡归并的实现 - 增加k11.4 置换-选择排序 - 减少m11.5 最佳归并树 外部排序 指的是大文件的排序&#xff0c;即待排序的记录存储在外存储器 上&#xff0c;在排序过程中需进行多次的内、外存之间的…

基于 Python 自动化接口测试(踩坑与实践)

文档&#xff1a;基于 Python 的自动化接口测试 目录 背景问题描述与解决思路核心代码修改点及其详细解释最终测试结果后续优化建议 1. 问题背景 本项目旨在使用 Python 模拟浏览器的请求行为&#xff0c;测试文章分页接口的可用性。测试目标接口如下&#xff1a; bashcoder…

单片机-外部中断

中断是指 CPU 在处理某一事件 A 时&#xff0c;发生了另一事件 B&#xff0c;请求 CPU 迅速去处理(中断发生)&#xff1b;CPU 暂时停止当前的工作(中断响应)&#xff0c; 转去处理事件 B(中断服务)&#xff1b;待 CPU 将事件 B 处理完毕后&#xff0c;再回到原来事件 A 被中断的…

vite5.x配置https

旧版的vite直接在config里面配置https&#xff1a;true即可&#xff0c;新版的麻烦一些。 1.准备工作 需要安装openssl 下载地址&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 找到合适的版本安装&#xff0c;配置好环境变量&#x…

Clip Studio Paint 报错:Running on unsupported Os. Clip Studio Paint will close.

问题描述 启动 Clip Studio Paint 报错&#xff1a;Running on unsupported Os. Clip Studio Paint will close. 原因 Clip Studio Paint 锁区&#xff0c;系统是中国大陆的无法使用。 解决方式 打开系统设置 时间和语言- 区域- 区域格式- 简体中文&#xff08;新加坡&am…

vue2/vue3中使用的富文本编辑器vue-quill

前言&#xff1a; 整理下常用的富文本编辑器工具。 vue3: 实现效果&#xff1a; 实现步骤&#xff1a; 1、安装插件&#xff0c; 编辑器核心插件 vueup/vue-quill yarn add pnpm i npm i cnpm i vueup/vue-quill vueup/vue-quill 2、安装选择性插件 &am…

Vscode 如何使用GitHub Copilot

一、“GitHub Copilot”进行登录 前提必须有github账号&#xff0c;如果没有就注册一个&#xff1b; 系统会提示您输入 GitHub 凭据。单击“登录 GitHub”&#xff0c;然后单击“允许”并输入您的 GitHub 凭据。 登录成功后&#xff1a; 二、 GitHub Copilot功能 1、预测代码 …

docker搭建atlassian-confluence:7.2.0

文章目录 引言I 部署前准备数据库镜像准备自己构建镜像dockerhub第三方镜像II 安装启动容器基础配置(获取服务器ID)授权码获取集群选择设置数据库配置管理员账号引言 准备数据库、镜像启动容器获取服务器ID根据服务器ID等信息,基于atlassian-agent.jar 授权I 部署前准备 数…

通过可穿戴外骨骼,以更灵活的方式操作你的机器人。

今天&#xff0c;我们将介绍一款专为控制 Mercury X1 和 Mercury B1 机械臂而设计的创新外骨骼。这种外骨骼以人类手臂的结构为蓝本&#xff0c;可实现直观和精确的控制。 开发这种外骨骼的动机源于人们对深度学习和机器学习等领域日益增长的兴趣。这些技术使机器人能够自主学习…

Ubuntu更改内核

需求背景&#xff1a; 由于软件需要在较低版本或者指定版本才可以运行 版本&#xff1a; 配置文件&#xff1a; vi /etc/default/grub 启动界面&#xff1a; 可运行版本&#xff1a; 解决方案&#xff1a; 方案1、更改启动顺序 sudo vi /etc/default/grub 方案2、调整启动顺…

maven之插件调试

当使用maven进行项目管理的时候&#xff0c;可能会碰到一些疑难问题。网上资料很少&#xff0c;可能会想着直接调试定位问题。这里以maven-compiler-plugin为例&#xff1a; &#xff08;1&#xff09;准备maven-compiler-plugin源码 进入maven 官网-》Maven Plugins-》找到对…

DevToys 专为 Windows 开发者打造的“瑞士军刀”式离线软件

你是否还在为寻找各种在线开发小工具而疲于奔波&#xff1f;**每次要格式化 JSON、比较文本、或者测试正则表达式&#xff0c;都得打开一堆网站&#xff0c;弹窗广告满天飞&#xff0c;严重影响工作效率。想不想要一个“多合一”的离线工具箱&#xff0c;轻松搞定开发中琐碎的日…

INT301 Bio Computation 题型整理

perceptron 设计和计算 1. XOR: 当两个输入值中只有一个为真时&#xff0c;输出为真 2. 3. 5. 6. 7. 2^3 2^n 9. a) 直接test b) 把v≥2 改成 v≥1 10. no, because it cant be separate through only one decision boundary,its not linearlly separable. Backpropagatio…

009:传统计算机视觉之边缘检测

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 本节来看一个利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测&#xff1f; 边缘检测是通过一些算法来识别图像中物体之间或者物体与背景之间的边界&…

ffmpeg-avio实战:打开本地文件或者网络直播流dome

使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客 #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavformat/avio.h> #include <libavutil/file.h> #include &l…

Unity Burst详解

【简介】 Burst是Unity的编译优化技术&#xff0c;优化了从C#代码编译成Native代码的过程&#xff0c;经过编译优化后代码有更高的运行效率。 在Unity中使用Burst很简单&#xff0c;在方法或类前加上[BurstCompile]特性即可。在构建时编译代码的步骤&#xff0c;Burst编译器会…

el-table 合并单元格

参考文章&#xff1a;vue3.0 el-table 动态合并单元格 - flyComeOn - 博客园 <el-table :data"tableData" border empty-text"暂无数据" :header-cell-style"{ background: #f5f7fa }" class"parent-table" :span-method"obj…

WebRTC 在视频联网平台中的应用:开启实时通信新篇章

在当今这个以数字化为显著特征的时代浪潮之下&#xff0c;实时通信已然稳稳扎根于人们生活与工作的方方面面&#xff0c;成为了其中不可或缺的关键一环。回首日常生活&#xff0c;远程办公场景中的视频会议让分散各地的团队成员能够跨越地理距离的鸿沟&#xff0c;齐聚一堂共商…