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

文章目录

  • [1. 定义](#1. 定义)
  • [2. 核心思想](#2. 核心思想)
  • [3. 优点](#3. 优点)
  • [4. 总结](#4. 总结)

1. 定义

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


2. 核心思想

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

3. 优点

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

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

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

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

举例说明

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

cpp 复制代码
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,分别负责生成报告和打印报告。

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

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

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

cpp 复制代码
int main() {
    ReportGenerator generator;
    ReportPrinter printer;

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

    return 0;
}

4. 总结

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

相关推荐
FL162386312916 分钟前
[C++]使用纯opencv部署yolov12目标检测onnx模型
c++·opencv·yolo
JenKinJia22 分钟前
Windows10配置C++版本的Kafka,并进行发布和订阅测试
开发语言·c++
wen__xvn1 小时前
每日一题洛谷P1914 小书童——凯撒密码c++
数据结构·c++·算法
云中飞鸿2 小时前
MFC中CString的Format、与XML中的XML_SETTEXT格式化注意
xml·c++·mfc
小小小白的编程日记2 小时前
List的基本功能(1)
数据结构·c++·算法·stl·list
努力可抵万难3 小时前
C++11新特性
开发语言·c++
ox00803 小时前
C++ 设计模式-策略模式
c++·设计模式·策略模式
egoist20233 小时前
【C++指南】一文总结C++类和对象【上】
开发语言·c++·类和对象·内存对齐·热榜·this指针·c++ 11
月上柳梢头&3 小时前
[C++ ]使用std::string作为函数参数时的注意事项
开发语言·c++·算法
商bol453 小时前
复习dddddddd
数据结构·c++·算法