【问题标题】:Avoiding switch statements nth time第 n 次避免 switch 语句
【发布时间】:2020-07-31 18:51:27
【问题描述】:

关于避免 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;
    }

}

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

我做对了吗?

【问题讨论】:

  • 如果添加另一个Position,您将不得不更改源代码(即switch-语句)。另一种(更灵活)的方法是,例如,使用Chain-of-responsibility,其中可以动态注册新的处理程序。

标签: java c# oop switch-statement


【解决方案1】:

我回答了一个类似的问题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 模式如何帮助您更抽象地思考程序中的对象并避免迭代类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多