SHOW ME THE CODE - 面向对象程序设计之 - 单一职责原则

2024-04-23 10:28

本文主要是介绍SHOW ME THE CODE - 面向对象程序设计之 - 单一职责原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天我们从代码的角度来讲一讲,到底什么是:单一职责原则

SRP的定义

Single Responsibility Principle, 单一职责原则
单一职责原则(Single Responsibility Principle,SRP)最早是由罗伯特·C·马丁(Robert C. Martin)在他的经典著作《敏捷软件开发:原则、模式与实践》(Agile Software Development: Principles, Patterns, and Practices)中提出的。这本书于2003年首次出版,其中探讨了敏捷软件开发的原则、模式和实践。

在该书中,马丁将单一职责原则描述为:“一个类应该只有一个导致它变化的原因。”这个简明的定义强调了类的内聚性和责任的单一性,表明一个类应该只负责一个明确的任务或功能,而不应该包含多个不相关的功能或责任。

怎么理解单一职责

一个类只有一个职责,也可以理解只承担一个角色。即一个类应该专注于完成一个特定的任务或者扮演一个特定的角色,而不应该包含多个不相关的职责或角色。这样可以提高类的内聚性,使得类的设计更加清晰、简洁和易于理解。

例子1:现代化的流水线

大家可以试想一下,为什么现代化的工厂都是流水线作业?一台手机,一台汽车,一台飞机,从那么多的零部件如何组件成为了消费者手上的产品?流水线上的每一个环节,可以理解了一个类,他们都只专注于一件事情。

比如,汽车制造过程中的几个重要的环节:

  • 冲压工序
  • 焊接工序
  • 涂装工序
  • 总装工序

一条现代化的生产线,最终通过流水线的作业形式,结合信息技术,将生产过程中的各个具备不同职责的工序有机的整合起来,最终形成一条完整的生产线,从而实现高效、优质、低成本地生产产品。

例子2:部队

从古至今,部队都是按不同的兵种划分,古代有骑兵,有弓箭兵,有长枪兵,有水兵,有陆兵。现代,有海、陆、空,有步兵,有坦克兵,有炮兵,有医疗兵,有航空兵,还有信息化部队,后勤部队等等。

企业的运作

现代企业需要IT系统来支撑公司的日常运营工作,而企业的运营是由不同角色的人通过各种不同的流程有机的联系在一起才能使得企业高效的运转。

使用IT系统的人,来自于企业不同的部门,承担着不同的岗们职责,而我们设计IT系统的时候,也应该和企业的组织架构保持一致。比如说,HR和财务就是不同的角色。HR负责员工信息的管理,而员工奖金的分配,则通常是财务的事情。

SHOW ME THE CODE - 年终奖的计算该放在哪里

不正确的方式 - 违反SRP原则

// 员工基本信息类
public class Employee {private String name;private int employeeId;private double salary;public Employee(String name, int employeeId, double salary) {this.name = name;this.employeeId = employeeId;this.salary = salary;}public double calculateBonus() {double bonus = 0.0;// 假设这里有一些计算年终奖金的复杂逻辑......return bonus;}
}

我们看到,Bouns的计算放在了Employee 这个类里边,这里实际上就已经违反了单一职责原则,Employee 不仅负责员工基本信息的管理,还要负责年终奖金的计算。

Employee类涉及了两类现实中的角色,HR和财务人员。
现实中HR会负责员工信息的收集和更新。而年终奖的发放通常是需要结合企业的营收,中心的绩效,部门的绩效,以及个人绩效等多方面因素来决定,具体的计算逻辑应该由财务决定,而且有一些数据,只允许财务人员才能够看。

我们员工年终的信息应该从Payroll类中获取,而具体的计算逻辑则放在年终奖计算器BonusCalculator中。

正确的方式 - 职责分离

重构后的代码应该如下,这样就不违反单一职责原则了。Enployee不会包含除了员工信息管理之外的其它职责,Bonus的计算有专门的工具类来实现。


public class Employee {private String name;private int employeeId;private double salary;public Employee(String name, int employeeId, double salary) {this.name = name;this.employeeId = employeeId;this.salary = salary;}
}public class Payroll
{private BonusCalculator bonusCalculator;public void setBonusCalculator(BonusCalculator bonusCalculator){this.bonusCalculator = bonusCalculator;}public double getBouns(Employee employee){return bonusCalculator.calculateBonus(employee);}
}public class BonusCalculator {public double calculateBonus(Employee employee) {double bonus = 0.0;// 假设这里有一些计算年终奖金的复杂逻辑......return bonus;}
}

这篇关于SHOW ME THE CODE - 面向对象程序设计之 - 单一职责原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928539

相关文章

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

[最全]设计模式实战(一)UML六大原则

UML类图 UML类图是学习设计模式的基础,学习设计模式,主要关注六种关系。即:继承、实现、组合、聚合、依赖和关联。 UML类图基本用法 继承关系用空心三角形+实线来表示。实现接口用空心三角形+虚线来表示。eg:大雁是最能飞的,它实现了飞翔接口。 关联关系用实线箭头来表示。当一个类"知道"另一个类时,可以用关联。eg:企鹅需要"知道"气候的变化,需要"了解"气候规律。 聚合关

深入理解单一应用架构、垂直应用架构和分布式服务架构

什么是单一应用架构? 单一应用架构(Monolithic Architecture)是一种传统的软件架构模式,其中所有的功能模块被构建成一个独立的可部署单元。简单来说,整个应用程序作为一个整体被打包和部署。 单一应用架构的特点 集中管理:所有的功能模块都在一个代码库中进行管理。统一部署:整个应用程序作为一个单独的单元进行打包和部署。紧耦合:模块之间的依赖关系较强,一个模块的修改可能会影响到其

VS Code SSH 远程连接服务器及坑点解决

背景 Linux服务器重装了一下,IP没有变化,结果VS Code再重连的时候就各种问题,导致把整个流程全部走了一遍,留个经验帖以备查看 SSH 首先确保Windows安装了ssh,通过cmd下ssh命令查看是否安装了。 没安装,跳转安装Windows下的ssh 对应的,也需要Linux安装ssh,本文是Ubuntu系统,使用以下命令安装: sudo apt updatesudo

Google Code Jam 2014(附官方题解)

2014年Google编程挑战赛 Problem A. Magic Trick Confused? Read the quick-start guide. Small input 6 points You have solved this input set. Note: To advance to the next rounds, you will need to s

MapReduce程序设计2

要求 1、数据集stock-daily,包含A股近4000只股票的今年以来的日数据;数据集stock-daily-30d仅包含最近30个交易日数据,根据自己计算机性能选择。 数据来源:https://www.joinquant.com/help/api/help?name=JQData 2、数据集stock-concept,包含A股近4000只股票所有的股票代码、名称和概念。 数据来源:万

读书·架构整洁之道(原则篇)

十四年不修行,只读书,一年通幽。二十日不解碑,只静坐,一日看尽前陵碑 ----- 猫腻《择天记》 一.设计与架构究竟是什么?二.SOLID设计原则SRP:单一责任原则(Single Responsibility Principle)OCP:开闭原则(Open Closed Principle)LSP:里氏替换原则(Liskov Substitution Principle)ISP

java面向对象(4)

目录 1.多态 1.1如何构成多态 1.2多态的调用规则 1.3多态的向下转型 1.4 instanceof运算符 1.5多态的好处 2.final关键字 3.接口 3.1接口中可以定义哪些成员 3.2接口的使用 3.2接口的特性 1.多态 多态:同一种事物,在不同的时刻表现出不同的状态 1.1如何构成多态 当两个类有直接或间接的继承关系并且父类的引用

C++面向对象三大特性--多态

C++面向对象三大特性–多态 文章目录 C++面向对象三大特性--多态1.虚函数(Virtual Function)2.纯虚函数(Pure Virtual Function)和抽象类(Abstract Class)3.重写(Override)4.动态绑定(Dynamic Binding)或迟绑定(Late Binding)5.虚析构函数和纯虚析构5.1虚析构函数5.2纯虚析构函数5.3总结

Python基础之面向对象

文章目录 1 面向对象1.1 类方法1.1.1 普通方法1.1.1.1 实例调用1.1.1.2 类调用 1.1.2 类方法1.1.3 类静态方法 1.2 继承1.2.1 单继承1.2.2 多继承 1.3 方法重写1.4 类私有属性方法和专有方法1.4.1 类的私有属性1.4.2 类的私有方法1.4.3 类专有方法 1 面向对象 Python从设计之初就已经是一门面向对象的语言