Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解单一责任原则_Java_Design Patterns_Single Responsibility Principle - Fatal编程技术网

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函数。