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

相关推荐
xiaoye-duck10 分钟前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Azure_withyou40 分钟前
Visual Studio中try catch()还未执行,throw后便报错
c++·visual studio
琉染云月42 分钟前
【C++入门练习软件推荐】Visual Studio下载与安装(以Visual Studio2026为例)
c++·visual studio
L_09072 小时前
【C++】高阶数据结构 -- 红黑树
数据结构·c++
智者知已应修善业6 小时前
【查找字符最大下标以*符号分割以**结束】2024-12-24
c语言·c++·经验分享·笔记·算法
91刘仁德6 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
diediedei6 小时前
模板编译期类型检查
开发语言·c++·算法
mmz12077 小时前
分治算法(c++)
c++·算法
一切尽在,你来7 小时前
C++多线程教程-1.2.1 C++11/14/17 并发特性迭代
开发语言·c++
80530单词突击赢7 小时前
C++入门指南:从零到精通
开发语言·c++