当前位置: 首页 > 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;从全国巡展到荣誉满载&…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...