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.
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:
Ehrlich gesagt gibt es kein best practice
. Die beste Vorgehensweise ist nur eine, die der Programmlogik folgt.
Das ist alles
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%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:
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.
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.
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:
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.
Tags und Links php coding-style if-statement