9 Stimmen

Wie kann man einem Entwickler erklären, dass das Hinzufügen zusätzlicher if - else if-Bedingungen kein guter Weg ist, um die Lesbarkeit zu "verbessern"?

Kürzlich bin ich auf den folgenden C++-Code gestoßen:

if (a)
{
  f();
}
else if (b)
{
  f();
}
else if (c)
{
  f();
}

Dabei sind a, b und c unterschiedliche Bedingungen, die nicht sehr kurz sind.

Ich habe versucht, den Code zu ändern:

if (a || b || c)
{
  f();
}

Der Autor war jedoch dagegen und meinte, dass meine Änderung die Lesbarkeit des Codes beeinträchtigen würde. Ich hatte zwei Argumente:

1) Man sollte die Lesbarkeit nicht erhöhen, indem man eine Verzweigungsanweisung durch drei ersetzt (obwohl ich wirklich bezweifle, dass es möglich ist, den Code lesbarer zu machen, indem man else if anstelle von || verwendet).

2) Es ist nicht der schnellste Code, und kein Compiler wird ihn optimieren.

Aber meine Argumente haben ihn nicht überzeugt.

Was würden Sie einem Programmierer sagen, der einen solchen Code schreibt?

Glauben Sie, dass ein komplexer Zustand eine Entschuldigung für die Verwendung von sonst wenn anstelle von OR ?

1voto

Lasse V. Karlsen Punkte 364542

Ich bezweifle sehr, dass dies zu einer Leistungssteigerung führt, außer in einem ganz bestimmten Szenario. In diesem Szenario ändern Sie a, b und c, und somit ändert sich, welcher der drei, die den Code auslösen, aber der Code wird trotzdem ausgeführt, dann könnte die Reduzierung des Codes auf eine if-Anweisung zu einer Verbesserung führen, da die CPU den Code im Verzweigungscache haben könnte, wenn sie das nächste Mal dazu kommt. Wenn Sie den Code verdreifachen, so dass er dreimal so viel Platz im Verzweigungscache einnimmt, besteht eine höhere Wahrscheinlichkeit, dass einer oder mehrere Pfade verdrängt werden, so dass die Ausführung nicht mehr optimal ist.

Es handelt sich um eine sehr niedrige Stufe, so dass ich auch hier bezweifle, dass dies große Auswirkungen haben wird.

Was die Lesbarkeit anbelangt, so stellt sich die Frage, welches Dokument leichter zu lesen ist:

  • wenn etwas, tun Sie dies
  • wenn etwas anderes, tun Sie dies
  • wenn noch etwas anderes, tun Sie dies
  • "dies" ist in allen drei Fällen dasselbe

oder dies:

  • wenn etwas, oder etwas anderes, oder noch etwas anderes, dann tun Sie dies

Wenn Sie mehr Code als nur einen einfachen Funktionsaufruf einfügen, wird es schwierig zu erkennen, dass es sich tatsächlich um drei identische Codeteile handelt.

Die Wartungsfreundlichkeit sinkt mit der 3 if-Anweisung Organisation wegen dieser.

Sie haben auch doppelten Code, was fast immer ein Zeichen für eine schlechte Struktur und ein schlechtes Design ist.

Grundsätzlich würde ich dem Programmierer sagen, dass, wenn er Probleme hat, die 1 if-Anweisung zu lesen, C++ vielleicht nicht das ist, was er tun sollte.

Nehmen wir nun an, dass die Teile "a", "b" und "c" sehr groß sind, so dass das "OR" darin in einer Menge von Klammern oder ähnlichem untergeht.

Ich würde den Code trotzdem so umgestalten, dass er die Funktion nur an einer Stelle aufruft (oder den Code darin ausführt), also ist das vielleicht ein Kompromiss?

bool doExecute = false;
if (a) doExecute = true;
if (b) doExecute = true;
if (c) doExecute = true;
if (doExecute)
{
    f();
}

oder, noch besser, auf diese Weise die Kurzschlüsse der booleschen Logik zu nutzen, um unnötige Auswertungen zu vermeiden:

bool doExecute = a;
doExecute = doExecute || b;
doExecute = doExecute || c;
if (doExecute)
{
    f();
}

0voto

sylvanaar Punkte 7988

Leistung sollte eigentlich gar nicht in Frage kommen

Vielleicht wird er später nicht unter allen 3 Bedingungen f() aufrufen.

0voto

AndersK Punkte 34870

Die Wiederholung von Code macht die Dinge nicht klarer, Ihr (a||b||c) ist viel klarer, obwohl man es vielleicht noch mehr refaktorisieren könnte (da es C++ ist), z.B.

x.f()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X