0

私は次の問題に遭遇しました。これは想像力を働かせても解決するのは難しいことではありませんが、最良/最もエレガントな解決策が何であるかを知りたいと思います。

のプロトタイプは次のようになります。

bool Team::isEveryoneDead(int teamOnTurn);

利用可能なチームは2つあり、現在順番になっているチームのインスタンスに応じて、チーム内のすべてのキャラクターがこの非常に特定の順序で死んでいるかどうかを確認したいと思います。

  1. 最初にターンしていないチーム内のすべてのキャラクターをループします。生きているキャラクターがいる場合は、ループを停止します(ステップ2に進みます)。生きている人がいない場合は、関数を 終了して戻ります。

  2. ターンしていないチームに生きているキャラクターが少なくとも1人含まれていることがわかったので、現在ターンしているチームをループして同じことを確認します。誰かが生きているのを見つけたら、ループを止めて終了/戻ります。

この引数int teamOnTurnにより、現在順番になっているTeamのインスタンスを解決できます。ここでは、「生きている状態」を評価する順序が非常に重要です。

ここで、実行できるいくつかのアプローチがあります。たとえば、順序をハードコーディングし(可能な順序は2つしかないため)、順番を確認して、次のような特定の順序を持​​つブランチを実行することにより、順序を解決します。

bool Team::isEveryoneDead(int teamOnTurn) {
    if (Team::Blue == teamOnTurn) {
        checkThis();
        checkThat();
    } else {
        checkThat();
        checkThis();
    }
} 

ただし、このソリューションは、たとえば5では完全には機能しません。より多くのアイテムの特定の呼び出し順序の順列。最大限のエレガンスでこれを解決するには、どのような手法を導入する必要がありますか:) ?

よろしくお願いします、スカーレット。

4

1 に答える 1

1

実際にチェックを行う別の内部メソッドを作成してみて、isEveryoneDead()メソッドに、チームがチェックされる順序を調整させます。たとえば、次のようになります。

bool Team::isEveryoneDead(int teamOnTurn) {
    bool isFound = isEveryoneDeadInternal( /* params for team not on turn */ );
    if(isFound) {
        isFound = isEveryoneDeadInternal( /* params for team on turn */ );
    }
    return isFound;
} 

// This method know nothing about on turn or off turn
bool Team:isEveryoneDeadInternal() {
    // Loop through all characters in the team, checking if any are alive
    // When the first live character is found, return true
    // else return false
}

これはDRYと呼ばれる概念です:Dont Repeat Yourself

于 2012-05-08T14:24:16.783 に答える