Frage

Eine Diskussion hat sich in meinem Büro über die Verwendung von ternären Operatoren kommen. Es gibt zwei Seiten zu dieser Diskussion.

Seite 1) Die ternären Operatoren sind einfach zu schreiben und zu lesen, also Bequemlichkeit ist eine Netto-Kosteneinsparungen.

Seite 2) Die ternäre Betreiber schwierig zu warten ist, weil sie überschüssigen Code-Churn benötigen sollte sie jemals geändert werden müssen, die geringste etwas komplexer zu sein, auch.

Extra-Nerd Punkte, wenn Sie irgendwelche tatsächlichen Studien, die von einer Top-Tier-Institution zu diesem Thema gemacht zitieren können ... Ich bin sehr daran interessiert, auf diesem harte Daten zu sehen.


Meine Theorie ist, dass der beste Code Code, der leicht ändern und anpassen kann, und dass die weniger Komplexität, die Änderung erfordert, desto geringer die Chance es für eine Pause ist. Beispiel:

$id = $user->isRegistered() ? $user->id : null;

Ok, so ist dies in vollem Umfang gültig, aber was passiert, wenn der Code geändert werden muss etwas etwas komplexer werden?

$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
    $id = $user->id;
}

Jeder vernünftige Programmierer an der ternären aussehen würde und auf Standard-if / else konvertieren. Dies erforderte jedoch eine 4-zeilige Veränderung gegenüber beginnend mit:

if ($user->isRegistered()) {
    $id = $user->id;
}

, die nur würde eine 1-line Änderung.

War es hilfreich?

Lösung

Ich finde, dass, wenn Sie auf die Syntax gewöhnen beiden Optionen genauso lesbar sind (vorausgesetzt, Sie gehen nicht über Bord mit entweder) und das ist so kein Problem für mich.

Wie, für die zeiteffizienter, ich werde mit einer widerwärtigen Frage beantworten - Warum interessieren Sie sich? In beiden Fällen umfassen dauert weniger als 20 Sekunden in einem äquivalenten if-Anweisung zu konvertieren.

Persönlich finde ich, dass, wenn ich Wege zu finden bin Sekunden Meißel weg von meiner Programmierzeit ist es eine Form der Verschleppung. Ich arbeite am besten, wenn ich die Konzentration auf Dinge zu erledigen und lassen Sie die kleinen Details Lesbarkeit selbst ausrechnen durch Erfahrung.

Andere Tipps

Ich würde Stick mit dem ternery Operator in Ihrem Beispiel.

   $id = ($user->isRegistered() ||  $user->hasEmail())? $user->id : null;

Solange die einzige „Zweig“ entscheiden ist, welcher Wert einer Variablen zugewiesen werden soll, ist der ternery Betreiber besser lesbar als if-else-Klauseln, weil es möglicherweise nicht die tatsächliche Funktion duplizieren, durchgeführt wird (in dieser Fall - das ist der Code "$ id =")      Wenn die logischen Bedingungen komplexer werden, vereinfachen sie.

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;

Ich mag den ternären Operator verwenden, wann immer ich einen einzeiligen Ausdruck, wo der Wert auf einem geeigneten boolean Zustand abhängt. In der Tat muß, wenn ich zwischen der Zuordnung zu einer Variablen wählen, und ich kann zwischen Ausdruck 1 und Ausdruck 2, dann habe ich oft ein ternären verwenden wählen.

Wenn jedoch die Ausdrücke eine Nebenwirkung hat, dann umschreiben werde ich sofort die ganze Sache als if () Aussage. Unter Verwendung des ternären Operator für die Ablaufsteuerung ist ziemlich verwirrend für die meisten Menschen.

Ternary Operationen haben ihren Platz; es ist in der Regel um den Code zu vereinfachen, wenn eine triviale Aufgabe. Irgendwann jedoch müssen Sie Ihre Strategie zu überdenken, wenn die bedingte Anweisung zu komplex wird. Es ist festzustellen, wann dieser Punkt ist , dass die Herausforderung wird. Nur die Erfahrung kann Sie dann.

Also, ich glaube nicht, dass es eine „richtige“ so lange beantworten, wie das Endergebnis ist sauber, gut lesbaren und wartbaren Code. Die zusätzlichen Codezeilen für die if Anweisung sollten nicht einmal in Erwägung gezogen werden, wenn diese Bestimmung (da die Anzahl der Codezeilen nicht notwendigerweise 1-zu-1 auf die Komplexität des Codes korrelieren.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top