关于避免使用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;
}
}
如果现在请求任何更改,则仅在“人”类中。
我正确吗?
答案 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模式如何帮助您更抽象地思考程序中的对象并避免迭代类型。