Ersetzen von IF durch einen logischen Ausdruck in PHP

8

Ich habe einen alten Code umgestaltet, als ich auf ein ähnliches Konstrukt gestoßen bin:

%Vor%

Nun seltsam, wie es scheinen mag, das ist viel kürzer als

%Vor%

Und etwas lesbarer (zumindest nach der ersten Überraschung) dann

%Vor%

Obwohl kürzerer Code nicht unbedingt mehr lesbaren Code bedeutet, finde ich das irgendwo in der Mitte der zwei "normalen" Wege oben.

Mit anderen Worten, anstatt

%Vor%

Man könnte einfach

schreiben %Vor%

Was ist der Grund dafür, dass wir nicht viel Nutzen sehen? Kann es so einfach sein wie: "Erfinde das Rad nicht neu, schreibe das besser lesbare if / else, und wenn du es wirklich verkürzen willst, dafür ist der ternäre Operator"?

EDIT: Bitte beachten Sie, dass der obige Code schnell aus dem ursprünglichen Code abgeleitet wurde und war nur ein Beispiel für die Verwendung von "Kurzschluss" -Code. Wenn Sie können, dann zögern Sie nicht, Codeverbesserungen vorzuschlagen, da dies nicht das gewünschte Ergebnis der Frage war.

Beispiel Nr.2

%Vor%     
user1853181 24.03.2013, 21:44
quelle

5 Antworten

3

Es gibt eine alte Technik, von der ich glaube, dass sie in gehackten Perl-Skripten beliebt war, um Fehler anzuzeigen. Pseudocode:

%Vor%

Bei der Codierung auf einen Stichtag und wenn die Benutzeroberfläche nicht unbedingt stellar sein muss, ist dies ein schneller Weg, um Fehler zu vermeiden.

Der Stil ist auch in Javascript für Standard-Parameter beliebt:

%Vor%

und für Null-Checks:

%Vor%

Ich finde, dass Sie, wenn Sie einmal damit vertraut sind, sehr lesbar und oft intuitiver sind als if / else oder ?: . Aber du solltest es nur benutzen, wenn es Sinn macht. Es überall zu benutzen wird sehr verwirrend werden. In Ihrem Beispiel sollten Sie nicht verwenden. Persönlich verwende ich es für einfache Fehlerprüfung und einige Standardwerte. In großen Projekten möchten Sie fast immer viel mehr tun, wenn ein Fehler auftritt. In solchen Fällen sollten Sie das nicht verwenden.

Auch solltest du vorsichtig sein; dies funktioniert nur in Sprachen, die eine Kurzschlussauswertung haben ( Ссылка ). Und manchmal sind and und or kurzgeschlossen, während && und || nicht sind.

myfunction() or die("I'm melting!"); ist auch ziemlich befriedigend zu schreiben.

Schließlich leeren else Blöcke in der Regel ist etwas, das ich noch nie zuvor gesehen habe, oder jemand zu empfehlen. Es scheint mir sehr sinnlos. Die am besten lesbare Option für Ihr Beispiel ist ganz einfach:

%Vor%     
Dave 24.03.2013, 22:23
quelle
6

Während $foo && bar(); weniger Codezeilen enthält, ist es viel weniger lesbar. Es ist in der Regel wichtiger, den Code leicht verständlich zu machen, als den gesamten LoC zu reduzieren. Selbst wenn Sie nicht in einer Umgebung mit mehreren Programmierern arbeiten, werden Sie irgendwann in der Zukunft wieder Ihren Code lesen müssen, und Sie werden wahrscheinlich nicht in der Lage sein sich zu erinnern, was hinter jeder Zeile steht Code ( Eaglesons Gesetz ).

Im Allgemeinen sollten Sie diese Art von Anweisungen auf Fälle beschränken, in denen die Absicht des Programmierers absolut klar ist. Meiner Meinung nach ist es sehr schlecht, einen Code zu haben, der eine Bedingung und einen Code testet, der den aktuellen Zustand des Programms auf derselben Anweisung ändert.

Hier ist eine akzeptable Verwendung für diese Art von Code:

%Vor%

Hier testen beide Seiten des && -Operators eine Bedingung, die Tatsache, dass die rechte Seite eine Funktion aufruft, um dies zu tun, schadet der Lesbarkeit des Codes nicht.

    
p.s.w.g 24.03.2013 21:49
quelle
1

Bei Fehlern sollten Sie echte Ausnahmen verwenden:

%Vor%

Siehe die Dokumentation zur Fehlerbehandlung .

    
darthmaim 24.03.2013 21:55
quelle
1

Was immer dieser Code macht, die Rückgabe einer Instanz von CustomException addiert sich nicht. Warum nicht die Funktionsdefinition etwas ändern:

%Vor%

Auch diese zweite Funktion ( checkForException($foo) ) aufzurufen, ist einfach absurd. Funktionsaufrufe sind billig, aber nicht kostenlos. Sie möchten wissen, ob die Funktion eine Instanz von CustomException zurückgegeben hat? Machen Sie das nicht zu einer Funktion, sondern verwenden Sie instanceof . Kurzschlüsse zu verwenden, um die Anzahl der Zeichen (also die Parse-Zeit) niedrig zu halten, während gleichzeitig Ressourcen auf allen anderen Ebenen verschwendet werden, ist ungefähr so ​​albern wie das Auftauchen in einem V8-Mustang auf einem Hyper-Miling-Kurs / p>     

Elias Van Ootegem 24.03.2013 21:57
quelle
0

Eine weitere mögliche Lösung für Ihr Problem:

%Vor%

Aber besser ändern !checkForException für isNoException oder etwas in diese Richtung.

    
darthmaim 24.03.2013 22:14
quelle