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

单一职责原则介绍

一.概念介绍

单一职责原则(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. 各个类都可以被其他代码复用,提高了代码的可复用性。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • wordpress 页面URL自动跳转到图片地址?
  • H5手机端调起支付宝app支付
  • [线程]单例模式 及 指令重排序
  • 面向对象编程
  • axios响应
  • c-数据结构(顺序表、链表)
  • 【GD32】RT-Thread实时操作系统移植(GD32F470ZGT6)
  • 【SpringCloud Alibaba】(十一)学习 Sleuth 链路追踪
  • 百度飞浆目标检测PPYOLOE模型在PC端、Jetson上的部署(python)
  • Python入门笔记
  • 【C/C++】C++类与对象基本概念(抽象封装、类的定义与使用、构造函数、析构函数、静态成员、友元)
  • openlayers10+vue3+ts
  • Java后端 - 常见BUG及其处理策略(持续更新中~)
  • C语言备忘
  • RocketMQ学习(二)
  • php的引用
  • “大数据应用场景”之隔壁老王(连载四)
  • 10个最佳ES6特性 ES7与ES8的特性
  • Akka系列(七):Actor持久化之Akka persistence
  • Android系统模拟器绘制实现概述
  • Angular 响应式表单 基础例子
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript中的对象个人分享
  • Spring声明式事务管理之一:五大属性分析
  • tweak 支持第三方库
  • vue-router 实现分析
  • vue-router的history模式发布配置
  • WePY 在小程序性能调优上做出的探究
  • 读懂package.json -- 依赖管理
  • 诡异!React stopPropagation失灵
  • 聊聊directory traversal attack
  • 微信开源mars源码分析1—上层samples分析
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​configparser --- 配置文件解析器​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ‌移动管家手机智能控制汽车系统
  • # Apache SeaTunnel 究竟是什么?
  • #include<初见C语言之指针(5)>
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2)STL算法之元素计数
  • (3)STL算法之搜索
  • (八十八)VFL语言初步 - 实现布局
  • (二)windows配置JDK环境
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (循环依赖问题)学习spring的第九天
  • (转) Face-Resources
  • (转)树状数组
  • .Net Core 中间件验签
  • .NET 表达式计算:Expression Evaluator
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 通过系统影子账户实现权限维持
  • .NET6实现破解Modbus poll点表配置文件
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .Net中的设计模式——Factory Method模式
  • .sdf和.msp文件读取