第n次避免使用switch语句

时间:2020-07-31 18:51:27

标签: java c# oop switch-statement

关于避免使用switch语句的一个经常争论的观点是,如果有更改/添加,您将不得不遍历整个代码,在代码中,switch语句受新选择的影响。 (而且您可能会忘记更改一个)。

这听起来很有趣,但是如果我使用其他结构,例如函数指针(跳转表),如下所示:

[https://ultimatecourses.com/blog/deprecating-the-switch-statement-for-object-literals] [1]

或此处

[https://simpleprogrammer.com/refactoring-switches-to-classes/] [1]

当需要新的选择时,我在适应那些问题时会遇到同样的问题。 所以..如果我完全有开关/选择,那么实现“打开/关闭原理”的最佳选择是什么?

我看到的唯一方法是不使用

switch(person.position){

case "manager":
break;

case "worker":
break;

case: "temp"
....

是将“ John Smith”的整个Person对象馈入一个函数中,然后将调用适当的函数。 switch语句将在此类中:

class Person {
...
...

public void applyBonus(){
    switch (this.position) {
    
    case "manager": this.addBonus(10000)
    break;
    }

}

如果现在请求任何更改,则仅在“人”类中。

我正确吗?

1 个答案:

答案 0 :(得分:0)

我回答了类似的问题earlier today(但使用C#)。您的Person可以是抽象类,可以强制实现Person类的类来定义其bonus的数量。然后,您的基类可以简单地实现applyBonus。例如:

public abstract class Person
{
  protected double salary, bonusAmount, baseSalary;
  
  protected Person(double baseSalary, double bonusAmount)
  {
    this.baseSalary = baseSalary;
    this.bonusAmount = bonusAmount;
  }
  
  public void applyBonus()
  {
    salary += bonusAmount;
  }
}

public final class Manager extends Person {
  public Manager()
  {
    super(100000.0, 1000.0);
  }
}

public final class Worker extends Person {
  public Worker()
  {
    super(10000.0, 500.0);
  }
}

public final class TempWorker extends Person {
  public TempWorker()
  {
    super(1000.0, 200.0);
  }
}

现在您可以执行以下操作:

var myTeam = new Person[] { new Manager(), new Worker(), new Worker(), new TempWorker() };
// apply bonuses:
for(var member : myTeam){
    member.applyBonus();
}

现在,我不是说这是您应该如何通过任何方式完成的操作。我正在向您展示多态和其他OOP模式如何帮助您更抽象地思考程序中的对象并避免迭代类型。