Facebook
Twitter
Google+
Kommentare
25

Yoda Conditions

Kann mir jemand mal sagen, warum Wochenende immer so kurz sein müssen? Da stimmt doch was nicht. Aber wenn man auf den Kalender schaut, dann steht das wirklich, dass schon wieder Montag ist. Sollte man mal was gegen tun. MondayHatesMe gründen zum Beispiel. Aber gehen wir mal davon aus, dass die Woche gut wird, wenn wir heute nen guten Artikel schreiben. Fangen wir also an.

Wir wollen heute mal über ein Thema sprechen, dass alle schon irgendwie kennen, aber vielleicht nicht unter diesem Namen. Yoda war ja bekanntlich ein PHP-Meister. Zumindest hab ich das so in Erinnerung. Aber am bekanntesten war er wohl für seinen geschmeidigen Satzbau.

Wenn ich programmiere, dann verwende ich häufig Konditionen, also IFs. Intuitiv sieht so eine Abfrage dann wie folgt aus:

if ( $x == 5 ) {

}

Das liest sich einfach gut. Wenn X 5 ist. Die Meisten, die ich kenne, benutzen diese Reihenfolge einen logischen Ausdruck aufzuschreiben. Eigentlich macht es andersrum aber viel mehr Sinn. Drehen wir den Ausdruck mal um:

if( 5 == $x) {

}

Ist zwar nicht ganz so toll auszusprechen, aber egal. Also erstmal verliert man gar nichts, wenn man seine Ausdrücke so rum schreibt. Ist einfach nur Gewöhnungsache. Was einem so aber nicht mehr passieren kann ist das Verwechseln von = und ==. Ist wohl jedem schon mal passiert, dass er sowas wie:

if( $x = 5 ) {

}

geschrieben hat. Dummerweise ist das immer wahr. Aber wem sag ich das. 5 ist eine Konstante und somit kann ich ihr keinen Wert zuweisen, deswegen würde das in der Yoda Syntax auch zu einem richtigen PHP-Error produzieren und das wollen wir ja haben, denn es ist ja schließlich ein Fehler.

Ach ja, den Namen Yoda Condition hab ich übrigens von dieser Webseite.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

25 Comments

  1. Coole sache!

    Ist schon lustig, wie viele Dinge einfach hingenommen werden ohne darüber nachzudenken. Man hat sich halt daran gewöhnt, dass man $x == 5 schreibt und darum machts man so 🙂

    Gibt es denn irgend einen Grund warum man nicht 5 == $x schreibt? Gibt es da irgendwelche Nachteile?

    Ansonsten hat ja diese Art der Notation genau den Vorteil mit dem Erkennen von Errors.

    Reply
  2. IDEs, wie z.B. NetBeans, warnen ja wenigstens, wenn man eine Zuweisung in einer Bedingung zu stehen hat.

    Der Grund warum diese Schreibweise seltener verwendet wird, ist vermutlich der falsch wirkende Satzbau. Einen Nachteil kann ich daran nicht erkennen.

    Reply
  3. In welchen Fällen ist es sauber, in der Bedingung einer if-Anweisung eine Zuweisung zu verwenden? Der einzige Fall, den ich mir vorstellen kann, ist es, weniger Codezeilen zu schreiben. Weshalb sollte also so was überhaupt erlaubt werden?
    Aber immerhin ein schöner Kniff, um die Schwächen der Programmiersprache zu kompensieren. 🙂

    Reply
  4. @Andre: Es ist ganz einfach deshalb erlaubt, weil Zuweisungen selbst eine Rückgabe besitzen und es demnach korrekte Syntax ist. Anders herum wäre es eine Sonderbehandlung, wenn es verboten wäre, also wieso dann verbieten? 😉 Ausserdem sind damit schöne Konstruktionen möglich

    Ich nutze die Schreibweise nicht, weil es für mich die Aussage verdreht. Frei nach „Subjekt-Verb-Objekt“ steht am Anfang das, was ich prüfe. Ich finde es unübersichtlich und schlechter lesbar, wenn der wichtige Teil erst am Ende auftaucht. Ich kann auch nicht behaupten, dass es mir so schwer fällt Zwei Gleichheitszeichen „==“ zu schreiben 😉

    Reply
  5. @KingCrunch: Ich formuliere die Frage anders: Warum ist eine Zuweisung eine Expression und kein Statement? Wenn ich davon absehe, dass es in der Grammatik irgendwann so festgelegt wurde, sehe ich keinen anderen Grund, weshalb Zuweisungen einen Rückgabewert benötigen.
    Kannst du mir eine schöne Konstruktion zeigen? Denn ich glaube, dass unsere Schönheitsideale voneinander abweichen. 😉

    Reply
  6. Meister Yoda benutzt übrigens vorzugsweise Do-While Schleifen und verzichtet auf try/catch Blöcke, wie folgendes Zitat belegt: „Do or do not. There is no try“

    Reply
  7. Danke für das schöne Beispiel. Alternativ könnte man das auch mit einem DirectoryIterator erledigen, aber die SPL gibt es ja erst seit einiger Zeit. Meine Frage hat sich damit also erklärt.

    Reply
  8. @Daniel: Das ist zwar eine Konstruktion, aber a) keine schöne und b) nicht mehr nötig.

    Dafür gibt es Iteratoren und ich will mal meinen das der DirectoryIterator da noch wesentlich schöner für ist, als solch ein Konstrukt.

    Reply
  9. Recht du hast 😉 Um die typischen Tippfehler zu umgehen, ist es eine wirksame Methode. Allerdings bezweifele ich ernsthaft, das einer, der schon einiges an Programmiererjahren drauf hat, sich dahingehend noch groß ändern wird. Und der Satzbau ist dadurch auch zerstört. Ich denke, wenn man im Kopf die Bedingung dann mal umstellt, wird man den Fehler schon bemerken.

    Reply
  10. Wenn die Condition etwas komplexer wird, finde ich persönlich es mit Yoda schwerer, die Logik schnell zu erfassen. Ich empfinde den falschen Satzbau beim Lesen des Yoda-Konstrukts sehr wohl als Nachteil, da ich im Geiste die Bedingung wieder umdrehen muss, um sie zu verstehen.
    Im heutigen Zeitalter der Step-by-Step-Debug-Möglichkeiten inklusive Variablenüberwachung moderner IDEs scheint mir das Mikro-Optimierung zu Lasten des Verständnisses zu sein. Wer einmal darauf reingefallen ist und solch einen Fehler (Direktzuweisung anstelle eines Vergleichs) gesucht hat, der kennt das als potentielle Fehlerquelle und identifiziert sowas künftig ratzfatz, bzw. achtet automatisch darauf. Immerhin sollte ein Programmierer sein Werkzeug ja kennen und die Syntax sicher anwenden können. 🙂

    Reply
  11. Mit ‚while‘ oder ‚do-while‘ machts mehr Sinn

    Etwas konstruiert, aber: Erste Zahl größer 0
    | while (($i = array_shift($zahlen) !== null) && ($i <=0));
    Wenn man dabei das Array selbst nicht ändern will
    | $x = -1;
    | while (isset($zahlen[++$x]) && ($zahlen[$x] @KingCrunch: Ich formuliere die Frage anders: Warum ist eine Zuweisung eine
    > Expression und kein Statement? Wenn ich davon absehe, dass es in der
    > Grammatik irgendwann so festgelegt wurde, sehe ich keinen anderen Grund,
    > weshalb Zuweisungen einen Rückgabewert benötigen.
    Gegenfrage: Warum sollten sie _keinen_ haben? Jede Operation hat einen Rückgabewert, da wäre es inkonsistent, wenn Zuweisungen eine Ausnahme bilden würden. Das würde im PHP-Source eine Sonderbehandlung einführen, die nur dazu dient, Entwickler daran zu hindern eine Fähigkeit zu nutzen, die sie garnicht nutzen müssen.

    Wenn ich mir mein (nicht ganz gelungenes) Beispiel anschaue, dann wäre die Alternative
    | foreach ($zahlen as $i) {
    | if ($i > 0) break;
    | }
    Ich persönlich finde ‚break‘ hässlicher 😉

    Reply
  12. @Andre Warum Zuweisungen einen Rückgabewert haben?
    Na, genau deshalb: $a = $b = $c + 1;

    Oder ein besseres Beispiel:
    while ($row = mysql_fetch_row($result))

    Reply
  13. @KingCrunch: Ich hoffe, du meinst nicht ernst, dass du deine „obfuscated“-Variante besser findest als die foreach-Variante. 😉
    Deine Gegenfrage hat einen Schwachpunkt: Was ist eine Operation? Ist eine if-Anweisung eine Operation? Es könnte eine Operation sein, die abhängig vom Parameter, d.h. der Bedingung, entweder den linken oder den rechten Zweig ausführt. Zwar ändert die Codeausführung dabei vor allem den Zustand (z.B. Variablenbelegungen), aber Rückgabewert ist denkbar, z.B. der zuletzt verwendete Ausdruck. Konstruiert? Möglicherweise. Zurück zur Zuweisung: Sie verändert den Zustand und hat als Rückgabewert den verwendeten Ausdruck.
    Kannst du mir auch ohne die Begriffe „inkonsistent“ und „Ausnahme“ erklären, warum eine Zuweisung eine Expression ist? Denn die Inkonsistenz sehe ich in der aktuellen Umsetzung!

    Reply
  14. @Andre
    Was issn daran verschleiert? 😕

    > Deine Gegenfrage hat einen Schwachpunkt: Was ist eine Operation? Ist eine
    > if-Anweisung eine Operation? Es könnte eine Operation sein, die abhängig vom
    > Parameter, d.h. der Bedingung, entweder den linken oder den rechten Zweig ausführt.
    > Zwar ändert die Codeausführung dabei vor allem den Zustand (z.B.
    > Variablenbelegungen), aber Rückgabewert ist denkbar, z.B. der zuletzt verwendete
    > Ausdruck. Konstruiert? Möglicherweise. Zurück zur Zuweisung: Sie verändert den
    > Zustand und hat als Rückgabewert den verwendeten Ausdruck.

    Mir sind tatsächlich schon Sprachen untergekommen, wo selbst Kontrollstrukturen Rückgabewerte liefern können, aber ‚if‘ ist auch keine Operation, sondern eine Kontrollstruktur.

    http://de.wikipedia.org/wiki/Operation_%28Informatik%29
    http://de.wikipedia.org/wiki/Kontrollstruktur

    > Kannst du mir auch ohne die Begriffe “inkonsistent” und “Ausnahme” erklären, warum
    > eine Zuweisung eine Expression ist? Denn die Inkonsistenz sehe ich in der aktuellen
    > Umsetzung!
    Hab ich doch geschrieben: JEDE Operation hat einen Rückgabewert, da bildet der Zuweisungsoperator nun mal _keine_ Ausnahme.

    http://php.net/manual/en/language.operators.php

    Erster Absatz:
    > An operator is something that you feed with one or more values (or expressions, in
    > programming jargon) which yields another value (so that the construction itself
    > becomes an expression). So you can think of functions or constructions that return
    > a value (like print) as operators and those that return nothing (like echo) as any
    > other thing.

    Ich seh auch ernsthaft nicht wirklich ein Problem. Wers garnicht mag, solls nicht nutzen. Ich nutz es auch nur vereinzelt, dann aber in erster Linie um mich vor noch hässlicheren Konstrukten (‚break‘ ;)) zu bewahren.

    Reply
  15. Seit ich vor Jahren irgendein PHP-Buch gelesen habe, nutze ich auch Yoda Conditions. Damals machte es Sinn, heute IMHO nicht mehr. Mit einer ordentlichen IDE passiert es schlichtweg nicht, dass man ein „if ($x = 5)“ übersieht. Bei Gleichheitsoperatoren sinkt die Leserlichkeit zwar nicht, bei Grösser/Kleiner-Operatoren aber schon. Kann es mir aber nicht mehr abgewöhnen… damnit. 😉

    Kenne den Ausdruck übrigens von StackOverflow. :]

    Reply
  16. @Andre Moelle

    Es sollte in keinem Fall sauberer sein, auf diese Weise Codezeilen zu sparen. Okay, mit einem C-Guru kann man darüber bestimmt heftig streiten, aber im Jahre 2010 sollte man sowas nicht mehr in Quellcodes sehen.

    Reply
  17. @Daniel

    Dein Beispiel mit dem Codeschnipsel für Verzeichnisse ist ein leider weitverbreiteter Schweinkram, von dem ich mich selbst nicht ausnehme.

    Reply
  18. Ich hab das auch mal eine Tag lang probiert, aber dann wieder sein lassen, da ich damit sowieso nicht wirklich in Berührung komme, weil ich auch in PHP auf die automatische Typ-Konversion verzichte und type safe programmiere, also immer === verwende statt ==.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen