if-Anweisung - Kurzschlussauswertung gegen Lesbarkeit
Manchmal ein if
- Anweisung kann sein eher kompliziert oder zu lang, so dass aus Gründen der besseren Lesbarkeit ist es besser, zu extrahieren kompliziert ruft, bevor die if
.
z.B. dieser:
if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall())
{
//do stuff
}
in diesem
bool b1 = SomeComplicatedFunctionCall();
bool b2 = OtherComplicatedFunctionCall();
if (b1 || b2)
{
//do stuff
}
(Beispiel ist nicht dass schlecht, es ist nur eine illustration... vorstellen, dass auch andere Anrufe mit mehreren Argumenten, etc).
Aber mit dieser Extraktion verlor ich den short-circuit-evaluation (SCE).
- Kann ich wirklich verlieren, SCE, jedes mal? Gibt es irgendein Szenario, wo der compiler erlaubt ist, zu "optimieren" und trotzdem SCE?
- Gibt es Möglichkeiten, um die verbesserte Lesbarkeit der zweite snippet ohne SCE?
InformationsquelleAutor der Frage relaxxx | 2016-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer natürlichen Lösung würde wie folgt Aussehen:
Dies hat die Vorteile, dass Sie einfach zu verstehen, anwendbar auf alle Fälle und mit Kurzschluss-Verhalten.
Das war meine erste Lösung: Ein gutes Muster in der Methodenaufrufe und die für-Schleife stellen ist folgende:
Bekommt man gleich nette performance-Vorteile der Kurzschluss-Bewertung, aber der code sieht mehr lesbar.
InformationsquelleAutor der Antwort Horia Coman
Neige ich dazu, zu brechen, Bedingungen auf mehrere Zeilen, d.h.:
Selbst wenn es mit mehreren Operatoren (&&) man muss nur vorher den Einzug mit jedes paar von Klammern. SCE noch Tritte in - keine Notwendigkeit zur Verwendung von Variablen. Schreiben von code auf diese Weise war es viel mehr readible mir schon seit Jahren. Komplexeres Beispiel:
InformationsquelleAutor der Antwort AmigoJack
Wenn Sie lange Ketten von Bedingungen und was halten Sie einige der von Kurzschlüssen, dann könnte man temporäre Variablen verwenden, um mehrere Bedingungen zu kombinieren. Wobei dein Beispiel wäre es möglich zu tun, z.B.
Wenn Sie eine C++11-fähigen compiler, den Sie verwenden konnte, lambda-Ausdrücke zum kombinieren von Ausdrücken in Funktionen, ähnlich wie oben:
InformationsquelleAutor der Antwort Some programmer dude
1) ja, Sie müssen nicht mehr für den SCE. Ansonsten hätte man
funktioniert die eine oder andere Weise, je nachdem, ob es eine
if
Aussage später. Viel zu Komplex ist.2) Dieses ist die Meinung basiert, aber für halbwegs komplexe Ausdrücke, die Sie tun können:
Wenn es Möglichkeiten zu Komplex, die offensichtliche Lösung ist das erstellen einer Funktion, die wertet den Ausdruck aus und nennen Sie es.
InformationsquelleAutor der Antwort SJuan76
Können Sie auch verwenden:
und SCE arbeiten.
Aber es ist nicht viel mehr lesbar als Beispiel:
InformationsquelleAutor der Antwort KIIV
Ich glaube nicht, dass eine solche Optimierung ist zulässig; insbesondere
OtherComplicatedFunctionCall()
könnten einige Nebenwirkungen haben.Ich lieber umgestalten, es in eine Funktion oder eine variable mit einem beschreibenden Namen; die Aufrechterhaltung sowohl Kurzschluss-Auswertung und-Lesbarkeit:
Und als wir implementieren
getSomeResult()
basierend aufSomeComplicatedFunctionCall()
undOtherComplicatedFunctionCall()
konnten wir zerlegen, diese rekursiv, wenn Sie immer noch kompliziert.InformationsquelleAutor der Antwort songyuanyao
Nein, Sie nicht, aber es ist anders angewendet:
Hier der compiler nicht selbst ausführen
OtherComplicatedFunctionCall()
wennSomeComplicatedFunctionCall()
true zurück.Hier beide Funktionen wird laufen, weil Sie für die Speicherung in
b1
undb2
. Ffb1 == true
dannb2
nicht ausgewertet werden (SCE). AberOtherComplicatedFunctionCall()
wurde, laufen bereits.Wenn
b2
wird verwendet, nirgendwo sonst ist der compiler könnte intelligent genug, um inline-Funktionsaufruf innerhalb der, wenn wenn die Funktion hat keine sichtbaren Nebenwirkungen.Das hängt davon ab.
Tun Sie müssen
OtherComplicatedFunctionCall()
zu laufen, weil Nebenwirkungen oder Leistungseinbußen von der Funktion minimal ist, dann sollten Sie mit dem zweiten Ansatz für die Lesbarkeit. Ansonsten, halten Sie sich an SCE, die durch den ersten Ansatz.InformationsquelleAutor der Antwort Sombrero Chicken
Andere Möglichkeit, Kurzschluss und hat die Bedingungen in einem Ort:
Könnte man die Schleife in eine Funktion und lassen Sie die Funktion akzeptiert eine Liste von Bedingungen und die Ausgabe ist ein boolean-Wert.
InformationsquelleAutor der Antwort levilime
Sehr seltsam: Sie sprechen über die Lesbarkeit, wenn keiner erwähnt die Verwendung von Kommentar im code:
In oben auf, dass ich immer preceed meine Funktionen mit einigen Bemerkungen, über die Funktion selbst, über dessen Eingang und Ausgang, und manchmal habe ich ein Beispiel setzen, wie man hier sehen kann:
Offensichtlich die Formatierung zu verwenden ist, für Ihre Kommentare können, hängt von Ihrer Entwicklungsumgebung (Visual studio, JavaDoc unter Eclipse, ...)
Soweit SCE betrifft, ich nehme an, diese meinst du, die folgenden:
InformationsquelleAutor der Antwort Dominique
Lesbarkeit ist notwendig, wenn Sie in einem Unternehmen arbeiten und Ihr code wird gelesen, indem jemand anderes. Wenn Sie ein Programm schreiben, für sich selbst, es ist bis zu Ihnen, wenn Sie wollen, zu opfern Leistung für das wohl der verständlichen code.
InformationsquelleAutor der Antwort br0lly