2

次のコードがあります。

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
    }
}

私がやりたいのは、どうにかしてこのアクションを独自のクラスに分離し、そのクラス内でメソッド /constructor を呼び出してこのチェックを行うことです。そうしないと、ネストされた if を使用してスタックし、非常に面倒で理解しにくくなります。currentLevel に基づいて対応する回答に対して userInput をテストするために、currentLevel と userInput のパラメーターを取得する方法を考えるのは正しいでしょうか? 以下は、関連する残りのクラスへのリンクです。

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

4

3 に答える 3

2

currentLevel に基づいて対応する回答に対して userInput をテストするために、currentLevel と userInput のパラメーターを取得する方法を考えるのは正しいでしょうか?

いいえ。実際には、現在のレベルを明示的なパラメーターとして渡すことは避けたいと思うでしょう。パラメーターとしてレベルを取得した場合、おそらく「複数のネストされた if」を別のクラスにプッシュすることになります。

次のように書く必要があると思います。

    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
    }
}
于 2013-06-08T23:56:22.577 に答える
0

私の目には、レベルについて話しているので、おそらくレベルを表すクラスが必要です。実際には、明らかに複数のレベルがあり、動作がわずかに異なるため、2 つのアプローチがあります。

  1. Level インターフェイスを用意してから、レベルごとにクラスを作成します。

また

  1. クラス内にレベル番号を隠すコンストラクターを持つ Level クラスを用意します。

その後、ネストされた if ステートメント (または if のいとこである switch ステートメント) の代わりに、多態的に切り替えることができます。

Level level = currentLevel;
while (level != null) {
  level.doStuff;
  level = level.getNextLevel();
}
于 2013-06-09T02:01:59.540 に答える