Best Practice beim Beenden von if ... else-Anweisung ohne else-Bedingung

8

Was ist die beste Vorgehensweise, um eine if ... else-Anweisung ohne eine else-Bedingung zu beenden? Betrachten Sie den folgenden Code:

%Vor%

Wie Sie sehen können, gibt es nur zwei Bedingungen; entweder hoch oder runter und die else-Anweisung hat keinen Sinn, es sei denn, Sie möchten eine Fehlermeldung anzeigen.

Meistens sehe ich Programmierer einfach die else-Bedingung dort, aber fügt einen Kommentar ein, anstatt irgendeinen funktionierenden Code wie diesen.

%Vor%

oder einfach nur annehmen, wenn es nicht "oben" ist, dann sollte alles andere "unten" sein, da es nur zwei Bedingungen gibt. Wenn ein Benutzer "links" oder "rechts" eingibt, wird dies immer noch als "nach unten" betrachtet. Ich denke, das ist etwas unpassend.

%Vor%

Ich weiß, dass PHP immer noch funktionieren würde, wenn wir es ohne weitere Bedingung machen würden. Aber was, wenn es eine andere Bedingung gibt? Was ist in solchen Fällen die beste Vorgehensweise, wenn wir eine strikte if ... else-Anweisung beibehalten möchten, wenn wir keine Fehlermeldungen oder andere Bedingungen hinzufügen möchten?

Vielen Dank im Voraus.

    
John Citizen 15.03.2011, 15:06
quelle

6 Antworten

19

es gibt keine if...else Anweisung.
Es gibt if Anweisung, die mit den Operatoren else und elseif erweitert werden kann.

Best Practice für if -Anweisung ohne else Bedingung ist also if -Anweisung ohne else condition:

%Vor%

Ehrlich gesagt gibt es kein best practice . Die beste Vorgehensweise ist nur eine, die der Programmlogik folgt.
Das ist alles

    
Your Common Sense 15.03.2011 15:11
quelle
6

Schreiben Sie nicht leer else s. Dies würde nur den Code überfluten, und es ist völlig klar, was du meintest.

In vielen Fällen können Sie die Switch-Anweisung verwenden:

%Vor%     
phihag 15.03.2011 15:13
quelle
1

Dies ist nicht etwas, das eine definitive Antwort geben kann. Hier ist meine Meinung, es wäre interessant zu sehen, welche anderen Meinungen existieren.

Szenario 1: Testen einer booleschen Bedingung

Dies ist der einfachste Fall:

%Vor%

Die Angabe einer Bedingung als else if wäre überflüssig, und für den Leser ist es wirklich offensichtlich, was der Code tut. Es gibt kein Argument für die Verwendung von else if in diesem Fall.

Szenario 2: Testen auf eine Teilmenge von unendlichen Zuständen

Hier sind wir daran interessiert, die Bedingungen A und B (und so weiter) zu testen, und vielleicht interessiert uns oder nicht, was passiert, wenn keiner von ihnen gilt:

%Vor%

Der wichtige Punkt hier ist, dass es keine endliche Anzahl von gegenseitig ausschließenden Zuständen gibt, zum Beispiel: conditionA könnte $num % 2 == 0 und conditionB könnte $num % 3 == 0 sein.

Ich denke, es ist natürlich und wünschenswert, hier eine angemessene Anzahl von Zweigen zu verwenden; Wenn die Verzweigungen zu viele werden, könnte dies ein Hinweis darauf sein, dass eine vernünftige Verwendung des OO-Designs zu großen Verbesserungen der Wartbarkeit führen würde.

Szenario 3: Testen auf eine Teilmenge von endlichen Zuständen

Dies ist der Mittelgrund zwischen den ersten beiden Fällen: Die Anzahl der Zustände ist endlich, aber mehr als zwei. Das Testen auf die Werte eines enumartigen Typs ist das archetypische Beispiel:

%Vor%

In solchen Fällen ist die Verwendung von switch wahrscheinlich besser, weil es dem Leser sofort mitteilt, dass die Anzahl der Zustände endlich ist und gibt einen starken Hinweis darauf, wo eine Liste aller möglichen Zustände gefunden werden könnte (in diesem Beispiel). Konstanten beginnend mit CONSTANT_ ). Meine persönlichen Kriterien sind die Anzahl der Staaten, gegen die ich teste: Wenn es nur eins ist (nein else if ), verwende ich if ; Andernfalls switch . Auf jeden Fall werde ich in diesem Szenario keine else if schreiben.

Hinzufügen von else als leerer Fangfehlerblock

Dies steht in direktem Zusammenhang mit Szenario 2 oben. Wenn die möglichen Zustände zur Kompilierzeit nicht endlich und bekannt sind, können Sie nicht sagen, dass "in jedem anderen Fall" bedeutet, dass ein Fehler aufgetreten ist. Wenn man in Szenario 2 sieht, dass sich ein switch natürlicher anfühlt, habe ich das Gefühl, dass die Verwendung von else auf diese Weise einen schlechten Code-Geruch hat.

Verwenden Sie stattdessen einen switch mit einem Zweig default . Es wird Ihre Absicht viel deutlicher kommunizieren:

%Vor%

Dies ist vielleicht etwas ausführlicher, aber dem Leser ist klar, wie der Code funktionieren soll. Meiner Meinung nach würde ein leerer else Block hier unnatürlich und rätselhaft aussehen.

    
Jon 15.03.2011 15:25
quelle
0

Ich denke, wenn es an else nichts zu tun gibt, dann ist es nicht notwendig, dass else block im Code existiert. Wenn else block enthalten ist, bedeutet das, dass es einen Zweck hat, dort zu sein, also ist der Code noch unvollständig, wenn er leer ist.

    
binaryLV 15.03.2011 15:12
quelle
0

Manchmal mache ich das so. Ich mache mir keine Sorgen, dass "left"  wird als "down" interpretiert, da ich immer meine Eingabe validiere, in diesem Fall mit preg_match('{^up|down$}', $direction) . Unbestreitbar ist ein switch passender ... aber ich mag die ausführliche Syntax nicht.

%Vor%     
Core Xii 15.03.2011 15:17
quelle
0

Ich versuche nicht else zu schreiben. Je. Meiner Erfahrung nach führt die Verwendung von else zu weniger lesbarer Logik, insbesondere wenn / elns geschachtelt werden.

Um eine Variable entweder true oder false (oder irgendeinen anderen einfachen This-oder-That-Wert) zuzuweisen, verwende ich immer:

%Vor%

Wenn ich einen größeren Teil der Logik habe, die im if / else als "gehört" betrachtet werden kann, sorge ich dafür, dass mein Code so strukturiert wird, dass die Funktion beendet wird, wenn die Bedingung erfüllt ist, normalerweise:

%Vor%

Wie Phihag erwähnt; Verwenden Sie eine switch -Anweisung, wenn Sie elseif berücksichtigen.

Und wie Ihr gesunder Menschenverstand bereits gesagt hat, gibt es keine Best Practice, aber es gibt gute Praktiken, und ich denke, das ist eine.

    
Jasper Kennis 22.07.2016 08:58
quelle

Tags und Links