gpt4 book ai didi

java - 理解单一职责原则

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:20 26 4
gpt4 key购买 nike

我很困惑如何确定一个方法是否有一个责任正在完成,就像 Clean Code 一书中的以下代码一样

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(Employee e),因此该方法的唯一职责就是如该方法名称所暗示的那样进行支付计算,但由于该方法内部有对过滤员工类型的开关此过滤现在是不同的或另一个责任,因此违反了 SRP。不知道我说的对不对。

最佳答案

"...clearly does more than one thing. Third, it violates the Single Responsibility Principle (SRP) because there is more than one reason for it to change."

这就是你的答案。每次添加新的 Employee.Type 时,该方法都必须更改。此外,每个 Employee.Type 的计算也可能会发生变化。

更好的解决方案是创建一个 Abstract Factory对于 Employee 和 Employee 的每个衍生物都有自己的 CalculatePay 实现。这样,当计算更改或添加新的 Employee.Type 时,只需更改一个类。

这是 Clean Code 的另一个摘录,更详细地解释了 -

The solution to this problem (see Listing 3-5) is to bury the switch statement in the basement of an ABSTRACT FACTORY,9 and never let anyone see it. The factory will use the switch statement to create appropriate instances of the derivatives of Employee, and the various functions, such as calculatePay, isPayday, and deliverPay, will be dispatched polymorphically through the Employee interface. My general rule for switch statements is that they can be tolerated if they appear only once, are used to create polymorphic objects

关于java - 理解单一职责原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33276095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com