当前位置: 首页 > news >正文

【C++】单一职责模式

目录

  • 一、简介
    • 1. 含义
    • 2. 特点
  • 二、实现
    • 1. 将类拆分成多个类
    • 2. 使用命名空间(Namespace)
    • 3. 使用组合而不是继承
  • 三、总结
    • 如果这篇文章对你有所帮助,渴望获得你的一个点赞!

一、简介

1. 含义

在面向对象设计中,单一职责原则(Single Responsibility Principle,简称 SRP)是 SOLID 原则之一,提出了一个类应该只有一个修改的理念。具体来说,一个类应该只有一个引起它变化的原因,即一个类应该只有一个责任。如果一个类承担的责任过多,那么对这个类的修改就会影响到所有依赖它的地方。

2. 特点

在使用单一职责原则时,需要权衡设计的复杂性和可维护性之间的关系。在实践中,通常需要根据具体的项目需求和团队的经验做出相应的决策。

  • 优点:
  1. 可维护性提高: 将一个类的职责限制在一个范围内,使得类的代码更加清晰、简洁。这有助于提高代码的可维护性,降低了修改代码的风险。
  2. 可读性提高: 每个类都有一个明确的职责,这使得代码更容易理解和阅读。当其他开发者阅读代码时,他们能够更容易地理解每个类的目的。
  3. 可测试性提高: 单一职责原则有助于更容易进行单元测试。每个类只负责一个明确定义的职责,因此测试每个职责变得更加简单。
  4. 降低耦合度: 职责划分清晰,类之间的依赖关系更加清晰,从而减少了类之间的耦合度。这样,一个类的变化不太可能影响到其他类。
  • 缺点:
  1. 类的数量增加: 如果划分职责过于细致,可能会导致类的数量急剧增加。这可能会使代码的管理变得复杂,尤其是当某些类只包含很少的代码时。
  2. 系统变得过于分散: 如果过度划分职责,可能会导致系统的职责分散,使得某个功能的实现涉及多个类,需要跨越多个类来理解整个系统的运作。
  3. 设计复杂性增加: 在某些情况下,过于强调单一职责原则可能会导致设计变得过于复杂。有时候适度的耦合可以简化设计,而过度的解耦可能会使设计变得过于抽象和复杂。

二、实现

​ 在C++中,实现单一职责原则的方式包括:

1. 将类拆分成多个类

将一个类中的多个职责拆分成多个独立的类,每个类负责一个职责。这有助于提高代码的可维护性和可扩展性。

// 负责文件操作的类
class FileManager {
public:void readFile(const std::string& filename);void writeFile(const std::string& filename, const std::string& content);
};// 负责数据处理的类
class DataProcessor {
public:void processData(const std::vector<int>& data);
};

2. 使用命名空间(Namespace)

将不同职责的类放置在不同的命名空间中,以隔离它们的功能。

namespace FileManager 
{class Reader { /* ... */ };class Writer { /* ... */ };
}namespace DataProcessor 
{class Processor { /* ... */ };
}

3. 使用组合而不是继承

将不同职责的类通过组合的方式组合到一个类中,而不是通过继承。

class Report 
{
private:FileManager::Reader fileReader;DataProcessor::Processor dataProcessor;public:void generateReport(const std::string& filename) {std::vector<int> data = fileReader.readFile(filename);dataProcessor.processData(data);// 生成报告的逻辑}
};

三、总结

通过遵循单一职责原则,可以使代码更加清晰、可维护、可测试,并且降低了类之间的耦合。这样的设计有助于应对变化,当一个需求发生变化时,只需修改与之相关的类,而不会影响到其他部分的代码。

注意:单一职责原则并不是绝对的,有时候在设计时需要根据具体情况进行权衡,以确保代码的简洁性和可理解性。


如果这篇文章对你有所帮助,渴望获得你的一个点赞!

在这里插入图片描述

相关文章:

【C++】单一职责模式

目录 一、简介1. 含义2. 特点 二、实现1. 将类拆分成多个类2. 使用命名空间&#xff08;Namespace&#xff09;3. 使用组合而不是继承 三、总结如果这篇文章对你有所帮助&#xff0c;渴望获得你的一个点赞&#xff01; 一、简介 1. 含义 在面向对象设计中&#xff0c;单一职责…...

GPT4-隐者地址

网址 https://evo.ninja/测试是否是GPT4 https://blog.csdn.net/fyfugoyfa/article/details/130254735...

教师考编需要什么条件

教师考编&#xff0c;了解考编需要什么条件是非常重要的。接下来&#xff0c;我来介绍几点教师考编的条件。 需要具备相应的学历背景。一般来说&#xff0c;考编需要具备本科或以上学历&#xff0c;并且所学专业与所报考的岗位相关。在某些特殊情况下&#xff0c;如报考幼儿园教…...

刘家窑中医医院鲁卫星主任:冬季守护心脑血管,为社区居民送去健康关爱

随着冬季的来临&#xff0c;气温逐渐降低&#xff0c;心脑血管疾病的风险也随之增加。为了提高公众对心脑血管疾病的认知和预防意识&#xff0c;北京刘家窑中医医院于近日成功举办了冬季守护心脑血管公益义诊活动。 本次义诊活动主要针对社区居民中的中老年人&#xff0c;特别是…...

专家级定位咨询:打造不可复制的市场地位

在这个快速变化的商业环境中&#xff0c;每个品牌都渴望在市场中占据一个独一无二的位置。但是&#xff0c;真正实现这一点并非易事。这就是为什么专家级定位咨询如此重要&#xff1a;它不仅帮助品牌发现其独特之处&#xff0c;还能指导它们如何有效地利用这一优势来在市场中脱…...

为什么说代码注释是程序员必备的技能?

代码注释是对代码中的特定部分或整体功能的解释和说明。注释添加在代码中&#xff0c;是给程序员看的&#xff0c;当系统运行程序&#xff0c;读取注释时会越过不执行。随着技术的发展&#xff0c;现在具有百万行代码的程序已经很常见了&#xff0c;在这样一个大型的代码中&…...

日期——年月日星期时间封装和年月日时间封装

年月日星期时间 function nowDate(time) {var getTime new Date().getTime(); //获取到当前时间戳var time new Date(getTime); //创建一个日期对象var year time.getFullYear(); // 年let wk new Date().getDay()var month (time.getMonth() 1).toString().padStart(2, …...

RK3568全国产化多网口板卡带poe供电,支持鸿蒙麒麟系统

信迈XM-3568-01主板采用瑞芯微RK3568四核Cortex-A55 处理器&#xff0c;主频最高可达2.0GHz&#xff0c;效能有大幅提升最高可配8GB内存容量&#xff0c;频率高达1600MHz&#xff1b;支持全链路ECC&#xff0c;让数据更安全可靠配置双千兆自适应RJ45以太网口&#xff0c;并扩展…...

UI卡顿问题

1、 监测卡顿的方式 a、Xcode 层级关系是否有异常 b、 instruments 的Animation Hitch工具检测&#xff1a;碰到问题&#xff0c;录制完了无数据&#xff08;用iphone7录制有数据的&#xff0c;iphne14录制无数据&#xff1f;&#xff09; 2、可能导致的卡顿的原因 a、 直播广…...

Linux操作系统的ECS云服务器上搭建WordPress网站教程

WordPress是使用PHP语言开发的博客平台,在支持PHP和MySQL数据库的服务器上,您可以用WordPress架设自己的网站,也可以用作内容管理系统(CMS)。本教程介绍如何在Linux操作系统的ECS实例上搭建WordPress网站。 前提条件 已创建Linux操作系统的ECS实例,并且手动部署LNMP环境…...

【Linux】多线程相关问题

判断题 不论是系统支持线程还是用户级线程&#xff0c;其切换都需要内核的支持&#xff08;F&#xff09; 用户态线程的切换在用户态实现&#xff0c;不需要内核支持。 线程包含CPU现场&#xff0c;可以独立执行程序&#xff08;F&#xff09; 线程包含cpu现场&#xff0c;但是…...

GPS北斗卫星时空信号安全防护装置(授时)介绍

GPS北斗卫星时空信号安全防护装置&#xff08;授时&#xff09;介绍 GPS北斗卫星时空信号安全防护装置&#xff08;授时&#xff09;介绍 当前&#xff0c;我国电力系统普遍采用北斗卫星或者GPS卫星授时来实现时间同步&#xff0c;但不加防护的授时装置存在卫星信号被干扰或欺…...

redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板

redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象&#xff0c;引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致这个数据的每次请求都需要查DB&#xff0c;数据库压力…...

智慧公交:提高城市出行效率的数字化之路

随着城市化进程的不断加速&#xff0c;公共交通成为人们日常出行的主要方式之一。为了提高公共交通的效率和服务质量&#xff0c;智慧公交应运而生。智慧公交是一种基于物联网、大数据、人工智能等技术&#xff0c;对公共交通进行数字化、智能化改造的新型公共交通系统。 以此为…...

Linux - 内存 - memblock 分配器

说明 memblock是Linux内核启动早期用于管理物理内存的机制&#xff0c;在伙伴系统&#xff08;Buddy System&#xff09;接管内存管理之前为系统提供物理内存分配、释放等功能。相对于伙伴系统&#xff0c;memblock功能和实现较为简单。本文基于&#xff1a;linux_5.10 arm64平…...

SQL、Jdbc、JdbcTemplate、Mybatics

数据库&#xff1a;查询&#xff08;show、select&#xff09;、创建&#xff08;create)、使用(use)、删除(drop)数据库 表&#xff1a;创建&#xff08;【字段】约束、数据类型&#xff09;、查询、修改&#xff08;alter *add&#xff09;、删除 DML&#xff1a;增加(inse…...

四六级高频词组8

目录 词组 其他链接 词组 301. in fashion&#xff08;stylish&#xff0c; most modern&#xff09;时兴&#xff0c;流行 302. after the fashion &#xff08;of&#xff09; 依照… 303. find fault with&#xff08;complain about&#xff1b;criticize&#xff09;找…...

fastapi-amis-admin快速创建一个后台管理系统增加音乐管理功能(3)

感觉为了实现maui的效果。准备了一个后端及restful项目 &#xff0c;如同想吃鱼就健个鲁塘一下&#xff0c;但还是写一下吧。 fastapi_amis_admin 是一个功能强大的框架&#xff0c;旨在帮助开发者在使用 FastAPI 进行 web 开发时&#xff0c;能够快速创建一个高效且易于管理的…...

全球化需要先搬离中国?中国公司出海不应失去“模式自信”

中国企业出海近期热闹非凡&#xff0c;其中以短剧为代表的文化内容产业和跨境电商产业都吸引了大量关注。例如亚马逊在12月12日公布一组最新数据&#xff0c;亚马逊过去一年销售额超过1000万美金的中国卖家数量&#xff0c;同比增长接近30%。中国跨境电商平台在刚刚过去的“黑五…...

三大维度解码剑南春“高质量发展”丨年度盘点

执笔 | 洪大大 编辑 | 扬 灵 2023年即将画上句点&#xff0c;当我们回首这一年为行业带来惊喜的品牌&#xff0c;剑南春是其中之一。 回顾剑南春今年一整年的动作&#xff0c;从新品频发到双节&#xff08;618、双11&#xff09;热销&#xff0c;从全国巡展到荣誉满载&…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...