使用OO编程来避免多个嵌套if

时间:2013-06-08 23:37:41

标签: java oop applet

我有以下代码:

public void actionPerformed(ActionEvent e) {
    String userInput = commandInput.getText();
    if (currentLevel == 0) {
        if (userInput.equals(answers.getIntroAnswers().get(0)) || userInput.equals(answers.getIntroAnswers().get(1))) {
            messageDisplay.append("\n \n" + userInput + "\n");
            commandInput.setText("");
            messageDisplay.append("\n" + messages.getNextMessage());
            currentLevel++;
            getCurrentLevel();
        } else {
            messageDisplay.append(notValid());
        }
    } else if (currentLevel == 1) {
        // do the same as above but with the next set of answers
    }
}

我想要做的是以某种方式将此动作分离到它自己的类中并调用该类中的方法/构造函数来执行此操作检查否则我将被卡住使用嵌套if并且它将变得非常混乱并且难以理解。我是否正确思考一个方法来获取currentLevel和userInput的参数,以便根据currentLevel测试userInput对应的答案?以下是其他课程的链接:

https://github.com/addrum/TextGame.git

3 个答案:

答案 0 :(得分:2)

  

我是否正确思考一个方法来获取currentLevel和userInput的参数,以便根据currentLevel测试userInput对应的答案?

没有。实际上,您可能希望避免将当前级别作为显式参数传递。如果您已将级别作为参数,则可能最终只是将“多个嵌套ifs”推送到另一个类中。

我认为你需要这样写:

    InputChecker[] levelChecker = ... create an array of checker instances
    ....
    levelChecker[currentLevel].check(userInput);

然后,您需要创建一个类(可能是匿名的)来实现每个级别的检查。请注意,如果需要,可以通过构造函数参数向检查器类提供级别编号,并将其保存在私有实例变量中。

您可以展开/概括InputChecker接口以包含其他特定于级别的行为。或者确实将这部分作为Level接口。


  

“这是采用currentLevel并将userInput与当前级别进行比较吗?”

没有。在上面的示例代码中,它调用InputChecker实例上的方法来进行检查。由于每个级别都有不同的InputChecker个实例,因此可以检查不同的答案......或其他任何内容。

但是,如果每个级别的“输入检查”行为之间的差异是他们检查不同的答案集,那么:

levelAnswers = answers.getAnswersForLevel(currentLevel);
for (String answer : levelAnswers) {
    if (userInput.equals(answer)) {
       // blah blah blah
    }
}

答案 1 :(得分:0)

为什么不在同一个类中创建方法而不是使用不同的类来做这个,考虑方法使用的其他变量,例如,

        messageDisplay.append("\n \n" + userInput + "\n");
        commandInput.setText("");
        messageDisplay.append("\n" + messages.getNextMessage());
        currentLevel++;

所以我建议在同一个方法中创建方法,然后从actionPerformed

中调用它
       public void checks()
       {
         String userInput = commandInput.getText();
          if (currentLevel == 0) {
            if (userInput.equals(answers.getIntroAnswers().get(0)) ||    userInput.equals(answers.getIntroAnswers().get(1))) {
              messageDisplay.append("\n \n" + userInput + "\n");
              commandInput.setText("");
              messageDisplay.append("\n" + messages.getNextMessage());
              currentLevel++;
              getCurrentLevel();
            } else {
                messageDisplay.append(notValid());
               }
           } else if (currentLevel == 1) {
                // do the same as above but with the next set of answers
               }
        }

然后从actionPerformed

调用它
     public void actionPerformed(ActionEvent e)
     {
       check():
     }

所以,现在你可以使用单独的方法处理。

答案 2 :(得分:0)

在我看来,既然你在谈论关卡,你可能应该有一个代表关卡的课程。实际上,由于你显然有不止一个级别,其行为略有不同,你有两种方法。

  1. 拥有一个Level界面,然后每个级别创建一个类。
    1. 有一个Level类,其构造函数隐藏了类中的级别号。
    2. 之后,您可以多态地切换而不是嵌套的if语句(或者如果是表兄,那就是switch语句)。

      Level level = currentLevel;
      while (level != null) {
        level.doStuff;
        level = level.getNextLevel();
      }