2012-12-25 5 views
5

Ich habe den folgenden Code, um zu überprüfen, ob eine Spieleinheit ein Spieler oder ein Feind ist. Dies sind die einzigen zwei Kategorien. Ich könnte die isEnemy-Methode löschen und alle Prüfungen für den Feind ausführen als ob (! IsPlayer), aber ich persönlich fühle, dass, wenn (isEnemy) die Absicht des Codes klarer macht. Gibt es etablierte Codierungsstile, die etwas über diese Art von Situation zu sagen haben?Ist redundanter Code akzeptabel, wenn er die Lesbarkeit verbessert?

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; 
} 
+0

IMHO Wenn Sie Code mit einem Zweck schreiben, ist alles, was Sie hinzufügen, was nicht dort sein muss, verwirrend. Sie können mehr Zeit damit verschwenden, den Zweck von etwas zu finden, das keinen Zweck hat, als etwas, das offensichtlich einen Zweck hat. In Ihrem Beispiel ist nicht klar, wie eine Methode durch die andere ersetzt werden kann. –

Antwort

2

Ich denke, dass beide Methoden akzeptabel ist. ! Wenn isEnemy() == isPlayer() Ich halte würde die Umsetzung isEnemy() als:

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

Auf diese Weise erhalten Sie die Lesbarkeit mit zwei spezifischen Methoden, aber nicht unbedingt zu wiederholen sich, als ob Sie isPlayer einstellen() und beeinflussen beide Methoden.

1

Meiner Meinung nach ist das absolut akzeptabel. Gerade bei großen Projekten ist Lesbarkeit sehr wichtig. Bedenken Sie auch, dass Sie, wenn Sie die dritte Rolle in Zukunft hinzufügen, if (! IsPlayer) nicht verwenden können.

3

Persönlich würde ich isEnemy() als !isPlayer() implementieren, aber haben die eine assert, die die Schleife läuft, um sicherzustellen, dass es wirklich ein Feind ist.

6

Für Ihren Fall haben Sie nur zwei mögliche Zustände - sie sind entweder ein Feind oder sie sind ein Spieler. Wenn sie ein Spieler sind, sind sie kein Feind. Der sauberste Weg, dies auszudrücken wäre !isPlayer.

Wenn Sie andere mögliche Zustände hatten, dann sollten Sie vielleicht eine Art Aufzählung der anderen Zustände betrachten. Als allgemeine Faustregel gilt . Wenn sich ein Teil Ihres Codes ändert, den Sie dupliziert haben (vielleicht um einen Fehler zu beheben), müssen Sie jedes Auftreten dieses Fehlers ändern. Es kann sich zu einem Wartungs-Albtraum entwickeln.

1

Wenn Sie Ihren Code betrachten, identifizieren Sie den Feind, wenn er in der Sammlung "Feinde" vorhanden ist. Für dich ist also ein Feind nicht jemand, der kein Spieler ist. Wenn du diese Semantik erzwingen willst, dann denke ich nicht, dass du mit der isEnemy() Methode davonkommen solltest.

Ein anderer Grund, den Sie möglicherweise benötigen, isEnemy() Methode ist, wenn Sie eine Möglichkeit eines anderen Typs sagen Ally. Mit der isEnemy() -Methode wird dieser Zusatz einfacher und sauberer.

Aber wenn über 2 Bedingungen nicht gültig sind, dann loswerden. Wie sie sagen, YAGNI :)

Verwandte Themen