5

ゲームユニットがプレイヤーか敵かを確認する次のコードがあります。カテゴリはこの2つだけです。isEnemy メソッドを削除して、すべての敵のチェックを if(!isPlayer) として実行することもできますが、個人的には、if(isEnemy) の方がコードの意図が明確になると感じています。この種の状況について何か言える確立されたコーディング スタイルはありますか?

public boolean isPlayer(Unit unit) {
    return unit == player;
}

public boolean isEnemy(Unit unit) {
    for (Unit e : enemies) {
        if (unit.equals(e))
            return true;
    }
    return false;
}
4

5 に答える 5

6

あなたの場合、考えられる状態は 2 つだけです。それらは敵であるか、プレイヤーです。彼らがプレイヤーなら、彼らは敵ではありません。それを表現する最もクリーンな方法は!isPlayer.

他の状態が考えられる場合は、他の状態に関するある種の列挙を調べたいと思うかもしれません。

一般的な経験則として、 自分自身を繰り返さないでください。複製したコードの一部を変更した場合 (おそらくバグを修正するため)、そのバグが発生するたびに変更する必要があります。メンテナンスの悪夢に変わる可能性があります。

于 2012-12-25T04:02:17.543 に答える
3

個人的には、私は as を実装isEnemy()しますが、それが本当に敵であることを確認するためにループを実行する!isPlayer()an を持っています。assert

于 2012-12-25T04:00:04.083 に答える
2

両方の方法を使用することは許容できると思います。isEnemy() == !isPlayer() の場合、 isEnemy() を次のように実装することを検討します。

public boolean isEnemy(Unit unit) {
  return !isPlayer(unit);
}

このようにして、2 つの特定のメソッドがあるという読みやすさが得られますが、isPlayer() を調整して両方のメソッドに影響を与えることができるかのように、必ずしも繰り返す必要はありません。

于 2012-12-25T04:36:39.180 に答える
1

コードを見ることで、敵がコレクション「敵」に存在するかどうかを識別できます。したがって、あなたにとっての敵は、本質的にプレイヤーではない誰かではありません。このセマンティックを強制したい場合は、 isEnemy() メソッドで逃げる必要はないと思います。

isEnemy() メソッドが必要になるもう 1 つの理由は、Ally などの別のタイプの可能性がある場合です。isEnemy() メソッドを使用すると、その追加がよりシンプルでクリーンになります。

ただし、上記の 2 つの条件が無効な場合は削除してください。彼らが言うように YAGNI :)

于 2012-12-25T04:32:33.767 に答える
1

私の意見では、それは絶対に受け入れられます。特に大きなプロジェクトでは、可読性が非常に重要です。また、将来的に 3 番目のロールを追加すると、if (!isPlayer) が使用できなくなることも考慮してください。

于 2012-12-25T03:57:32.117 に答える