重构 if/else 逻辑

2022-09-01 06:37:48

我有一个java类,具有一千行的if/else逻辑方法,如下所示:

if (userType == "admin") {
     if (age > 12) {
          if (location == "USA") {
               // do stuff
          } else if (location == "Mexico") {
               // do something slightly different than the US case
          }
     } else if (age < 12 && age > 4) {
          if (location == "USA") {
               // do something slightly different than the age > 12 US case
          } else if (location == "Mexico") {
               // do something slightly different
          }
     }
 } else if (userType == "student") {
     if (age > 12) {
          if (location == "USA") {
               // do stuff
          } else if (location == "Mexico") {
               // do something slightly different than the US case
          }
     } else if (age < 12 && age > 4) {
          if (location == "USA") {
               // do something slightly different than the age > 12 US case
          } else if (location == "Mexico") {
               // do something slightly different
          }
     }

我应该如何将其重构为更易于管理的内容?


答案 1

您应该使用策略,可能在枚举中实现,例如:

enum UserType {
  ADMIN() {
    public void doStuff() {
      // do stuff the Admin way
    }
  },
  STUDENT {
    public void doStuff() {
      // do stuff the Student way
    }
  };

  public abstract void doStuff();
}

由于代码中每个最外层分支中的代码结构看起来几乎相同,因此在下一步重构中,您可能希望使用模板方法排除该重复项。或者,您也可以将位置(可能还有年龄)转换为策略。if

更新:在Java4中,您可以手动实现类型安全枚举,并使用普通的旧子类化来实现不同的策略。


答案 2

我用这段代码做的第一件事就是创建类型 和 ,这两者都继承自基类型。这些类应该有一个隐藏此逻辑的其余部分的方法。AdminStudentUserdoStuff()

根据经验,每当您发现自己打开类型时,都可以改用多态性。


推荐