Java 理解单一责任原则
我很困惑如何确定一个方法是否有一个职责,就像《清洁代码》一书中的以下代码一样Java 理解单一责任原则,java,design-patterns,single-responsibility-principle,Java,Design Patterns,Single Responsibility Principle,我很困惑如何确定一个方法是否有一个职责,就像《清洁代码》一书中的以下代码一样 public Money calculatePay(Employee e) throws InvalidEmployeeType { switch (e.type) { case COMMISSIONED: return calculateCommissionedPay(e); case HOURLY:
public Money calculatePay(Employee e) throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPay(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
正如作者在这段代码片段中所说:“…显然做了不止一件事。
第三,它违反了单一责任原则(SRP),因为存在不止一个
更改的原因。”。第一眼看到代码时,我就在想,为什么该方法违反了SRP,因为如果代码发生了变化,那么只有在增加了员工类型的情况下才会出现切换语句,但当我试图进一步理解该方法时,我提出了一个假设,说明了为什么它违反了上述原则
我的假设是,由于该方法的名称是calculatePay(雇员e)
那么,该方法的唯一责任就是按照该方法的名称进行付款计算,但由于在该方法内部有一个打开过滤的开关,因此该过滤现在是一个不同的职责,或者另一个职责因此违反了SRP。我不知道我是否做对了
“…显然不止一件事。第三,它违反了单一
责任原则(SRP),因为有不止一个原因
让它改变。”
这就是你的答案。每次添加新的Employee.Type
,该方法都必须更改。此外,每个Employee.Type
的计算也可能会更改
更好的解决方案是创建一个for Employee和Employee的每个派生函数,它们有自己的CalculatePay
实现。这样,当计算更改或添加新的Employee.Type
时,只需更改一个类
下面是另一段来自干净代码的摘录,它更详细地解释了-
这个问题的解决方案(请参见清单3-5)是隐藏开关
在一家抽象工厂的地下室里的陈述,9,绝不让
有人看到了吗。工厂将使用switch语句创建
雇员衍生工具的适当实例,以及
将启用calculatePay、iPayDay和deliverPay等功能
通过Employee接口以多态方式发送。将军
switch语句的规则是,如果
仅显示一次,用于创建多态对象
我通常在班级层面应用SRP。它可以防止类变得太大,承担太多的角色 我将“责任”视为概念性的。因此,我认为你的方法只有一个责任:计算工资 我试着跟随谷歌在这方面的做法,寻找这些暗示你正在偏离SRP的警告标志:
- 总结课程内容包括“和”李>
- 对于新的团队成员或缺乏经验的开发人员来说,这个课程将是一个挑战 阅读并快速“理解”
- 类具有仅在某些方法中使用的字段
- 类具有仅对参数进行操作的静态方法
但是,另一方面,您的代码包含一个switch语句,表明您可能正在偏离OCP…谢谢您的输入,我想在
中也列出每个员工的计算。类型也可能会更改。员工的计算将如何影响该方法?由于每种类型都只是调用一个方法来执行计算,我认为,根据您的回答和书中给出的陈述,我可以假设我关于如何理解该原理的假设是正确的吗?应该在类的上下文中看到,而不一定是在方法级别上。这就是为什么我说,如果任何计算发生变化,您需要更新这个类。如果您将此方法移动到Employee的派生类,则如果计算需要更改,则只有该类必须更改。@anathema另外,如果我们希望以不同的方式计算小时工资(例如,周末工作会影响工资),则我们可能会更改calculateHourlyPay函数签名(添加布尔标志或日期时间),因此也需要更改calculatePay函数。