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可以帮助我们设计出更加清晰、灵活的软件系统。

相关推荐
史迪仔011240 分钟前
[QML] QML IMage图像处理
开发语言·前端·javascript·c++·qt
会编程的土豆2 小时前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
低频电磁之道2 小时前
解决 Windows C++ DLL 导出类不可见的编译错误
c++·windows
君义_noip3 小时前
信息学奥赛一本通 4150:【GESP2509七级】⾦币收集 | 洛谷 P14078 [GESP202509 七级] 金币收集
c++·算法·gesp·信息学奥赛·csp-s
Ricky_Theseus4 小时前
静态链接与动态链接
c++
澈2074 小时前
双指针,数组去重
c++·算法
小辉同志4 小时前
207. 课程表
c++·算法·力扣·图论
feng_you_ying_li5 小时前
C++11,{}的初始化情况与左右值及其引用
开发语言·数据结构·c++
小樱花的樱花5 小时前
打造高效记事本:UI设计到功能实现
开发语言·c++·qt·ui
零二年的冬6 小时前
epoll详解
java·linux·开发语言·c++·链表