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

单一职责原则介绍

一.概念介绍

单一职责原则(Single Responsibility Principle, SRP)是面向对象设计中的五大基本原则之一,它是指一个类或者模块应该仅有一个引起它变化的原因。

具体来说,单一职责原则有以下几个特点:

  1. 职责集中:一个类或模块应该专注于完成一种特定的功能或职责,而不应该承担过多的职责。

  2. 职责分离:如果一个类或模块承担了多个职责,那么当其中一个职责发生变化时,就会影响到其他职责,导致代码难以维护。

  3. 可测试性:单一职责的类或模块更容易编写单元测试,因为它们的功能更加集中和明确。

  4. 可复用性:单一职责的类或模块更容易被其他代码复用,因为它们的功能更加独立和通用。

  5. 可读性:单一职责的类或模块更容易被开发人员理解和修改,因为它们的功能更加清晰和简单。

遵循单一职责原则的好处包括:

  1. 提高代码的可维护性:当一个类或模块只负责一个职责时,代码的结构更加清晰,修改时不会影响到其他无关的功能。

  2. 提高代码的可测试性:单一职责的类或模块更容易编写单元测试,因为它们的功能更加集中和明确。

  3. 提高代码的可复用性:单一职责的类或模块更容易被其他代码复用,因为它们的功能更加独立和通用。

  4. 提高代码的可读性:单一职责的类或模块更容易被开发人员理解和修改,因为它们的功能更加清晰和简单。

总之,单一职责原则是面向对象设计中非常重要的一个原则,它可以帮助我们编写出更加高质量、可维护和可扩展的代码。在实际开发中,我们应该努力遵循这一原则,尽量将类或模块的职责划分得更加清晰和集中。

二.具体例子

假设我们有一个 Employee 类,它负责管理员工的基本信息,如姓名、工号、部门等。

不遵循单一职责原则的例子:

class Employee {  
public:  
    Employee(const std::string& name, int id, const std::string& department)  
        : m_name(name), m_id(id), m_department(department) {}  

    void setName(const std::string& name) { m_name = name; }  
    void setId(int id) { m_id = id; }  
    void setDepartment(const std::string& department) { m_department = department; }  

    std::string getName() const { return m_name; }  
    int getId() const { return m_id; }  
    std::string getDepartment() const { return m_department; }  

    void giveRaise(double percentage) { /* 计算并更新工资 */ }  
    void fireEmployee() { /* 执行解雇流程 */ }  
    void printEmployeeInfo() { /* 打印员工信息 */ }  

private:  
    std::string m_name;  
    int m_id;  
    std::string m_department;  
};  

在这个例子中,Employee 类承担了太多的职责,包括管理员工基本信息、计算工资、执行解雇流程、打印员工信息等。这违反了单一职责原则,因为当其中一个职责发生变化时,就会影响到其他职责,导致代码难以维护。

遵循单一职责原则的例子:

class Employee {  
public:  
    Employee(const std::string& name, int id, const std::string& department)  
        : m_name(name), m_id(id), m_department(department) {}  

    std::string getName() const { return m_name; }  
    int getId() const { return m_id; }  
    std::string getDepartment() const { return m_department; }  

private:  
    std::string m_name;  
    int m_id;  
    std::string m_department;  
};  

class EmployeeCompensation {  
public:  
    void giveRaise(Employee& employee, double percentage) {  
        // 计算并更新工资  
    }  
};  

class EmployeeManagement {  
public:  
    void fireEmployee(Employee& employee) {  
        // 执行解雇流程  
    }  
};  

class EmployeeReporting {  
public:  
    void printEmployeeInfo(const Employee& employee) {  
        // 打印员工信息  
    }  
};  

在这个例子中,我们将 Employee 类的职责划分为三个不同的类:

  1. Employee 类负责管理员工的基本信息。
  2. EmployeeCompensation 类负责处理员工的工资相关操作。
  3. EmployeeManagement 类负责处理员工的解雇流程。
  4. EmployeeReporting 类负责打印员工信息。

这样做的好处是:

  1. 每个类都只负责一个明确的职责,代码更加清晰和可维护。
  2. 当某个职责发生变化时,只需要修改相应的类,不会影响到其他无关的功能。
  3. 各个类都可以独立地进行单元测试,提高了代码的可测试性。
  4. 各个类都可以被其他代码复用,提高了代码的可复用性。

总之,这个例子展示了如何遵循单一职责原则来设计代码,从而提高代码的质量和可维护性。


http://www.kler.cn/news/293240.html

相关文章:

  • Gartner报告解读:如何帮助企业完善数据分析与治理路线图
  • Jmeter模拟用户登录时获取token如何跨线程使用?
  • PostgreSQL技术内幕8:PostgreSQL查询执行器
  • 完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (二) 源码架构流程梳理、代码编写
  • Python爬虫01
  • 代码随想录:343. 整数拆分
  • ECMAScript与JavaScript的区别:深入解析与代码示例
  • MP条件构造器之常用功能详解(select、set)
  • MySQL——事务与存储过程(三)存储过程的使用(4)删除存储过程
  • 三星的新款笔记本电脑AI性能提升一倍
  • vite创建的vue项目怎么使用jsx来实现elementPlus表格表尾的合计有多行大的方法
  • 【全网最全】2024年数学建模国赛D题39页成品论文+matlab代码+结果等(后续会更新)
  • 身份验证技术应用10大关键趋势
  • 图论题总结
  • 基于JavaWeb开发的Java+Springboot+Vue+elememt美食论坛平台设计实现
  • 安卓逆向(之)真机root(红米手机)
  • 社群空间站付费入群系统易支付版全套搭建教程
  • 【嵌入式学习笔记】---- 通信基础
  • 关于蓝屏查看日志分析原因
  • C_13_FILE
  • 【Spring】Spring MVC 入门(2)
  • css之雪碧图(精灵图)
  • Oracle手动误删物理上的数据文件解决办法
  • 软件测试学习笔记丨Pytest+Allure测试计算器
  • 什么是回流与重绘,如何尽力避免
  • ARM基础知识---CPU---处理器
  • Electron32-Vue3OS桌面管理os模板|vite5+electron32+arco后台os系统
  • openconnect-gui for qt 避坑指南
  • HTML的块级元素与行内元素
  • VM Workstation虚拟机AlmaLinux 9.4操作系统安装(桌面版安装详细教程)(宝塔面板的安装),填补CentOS终止支持维护的空白