Was sind Yoda Conditions und warum sollten wir sie nutzen?

Ich bin ein mittelmäßiger Entwickler. So, jetzt ist es raus.

Aber dafür habe ich mich viele Jahre mit anderen Themen beschäftigt. Ich habe einen Magister in Soziologie und manchmal geht es mehr darum, den Kunden oder den Kunden des Kunden zu verstehen als die Technik zu beherrschen. Als Autodidakt kenne ich mich also nur in den Bereichen aus, die ich mal „am Wickel“ hatte. In anderen Bereichen bereitet mir meine Ahnungslosigkeit manchmal schlaflose Nächte, wenn ich scheinbar einfache PHP-Skripte nicht verstehe, weil ich zum Beispiel nur die Schreibweise (noch) nicht kenne.

Wenn das passiert, dann lerne ich aber dazu. Und das ist gut so. In diesem Fall sagten mir die WordPress Coding Standards ich sollte bitte die Yoda Conditions benutzen.

Daher machte ich mich auf die Suche: Was sind Yoda Conditions und warum sollte ich sie nutzen?

Starten wir direkt mit einem Beispiel. So sieht eine Yoda Condition oder auch Yoda Notation aus:

if ( true === $the_force ) {
    $victorious = you_will( $be );
}

Anstatt zu prüfen ob $the_force === true ist, wird geprüft, ob true der Variabel $the_force entspricht und das klingt gelesen, also ob eben Yoda mit einem spricht.

Warum ist das die empfohlene Schreibweise? Nun, sollte ich aus Versehen nur ein Gleichheitszeichen tippen, dann ergibt es einen Fehler, denn true kann nicht ein Wert zugewiesen werden:

if ( true = $the_force ) {
    // Erzeugt Fehler!
}

In der klassischen Notation wäre das ohne Probleme möglich, die If-Bedingung wäre immer true und würde immer ausgeführt werden.

if ( $the_force = true ) {
    // Wird immer ausgeführt!
}

Da keine Fehler im Error Log landen wäre dieser Fehler schwer zu entdecken, sofern keine Unit Tests zu dieser Funktion existieren.

Da die Schreibweise auf den ersten Blick schlechter zu lesen ist, sollte sie nur dann benutzt werden, wenn sie wirklich gebraucht wird, also dann, wenn Variablen und Werte (Konstanten oder Funktionsaufrufe) auf Gleichheit (== bzw. ===) oder Ungleichheit (!= bzw. !==) geprüft werden.

Vergleiche mit größer (>) / kleiner (<) oder größer oder gleich (>=) bzw. kleiner oder gleich (<=) sind in der Yoda Notation schwer zu lesen und sollten eher klassisch geschrieben werden.

Bei einem Vergleich zwischen zwei Variablen ist ist das Umdrehen der Reihenfolge auch nicht nötig, da das Problem ja in beide Richtungen existiert. Auch bei Vergleichen zwischen Funktionsaufruf und Konstante ist die Yoda Notation nicht nötig, da die Zuweisung ja mit einer Funktion sowieso nicht klappen und auch einen Fehler produzieren würde.

Neben den oben verlinkten englischsprachigen Erklärungen auf WordPress.org habe ich gute Erklärungen noch bei Florian Simeth gefunden:
https://wp-plugin-erstellen.de/#cp2.5

Und bei Tonya Mork:
https://knowthecode.io/yoda-conditions-yoda-not-yoda

Beide bieten Kurse/Bücher zum Thema an.

Falls du ebenfalls ein mittelmäßiger Entwickler bist, so wie ich, dann gebe ich dir den Tipp einen PHP-Linter und Coding Standards in deinem Editor zu nutzen. Beides zusammen hat meine Fähigkeiten enorm gesteigert. Der Linter prüft beim Speichern auf Syntax-Fehler, so dass ich zeitnah über das Problem informiert werden. Kein umständliches Suchen mehr. Ich bekomme Zeile und Problemtyp direkt nach dem Speichern genannt. (Vielleicht suche ich irgendwann ob es eine Einstellung gibt, die das Speichern auch verhindert …) Und die Coding Standards merken jede Abweichung vom Standard an. Da ich das Subset für WordPress nutze, bekomme ich zudem reihenweise hilfreiche Hinweise, wie den Hinweis auch nicht escapte Ausgaben. Verstehe ich etwas nicht, habe ich nun dank der Infos eine Chance zu recherchieren und dazu zu lernen. Ein wichtiger Aspekt, wenn einem als Solo-Selbständiger ein Mentor oder Senior-Entwickler:in fehlt.

Wie haltet ihr euch auf dem Laufenden? Blogs? Video-Kurse (offline/online)? Bücher? Ich freue mich über Tipps in den Kommentaren. 🙂

Update:
Nach einer spannenden Twitter-Diskussion würde ich nun meine Aussage revidieren und sagen, dass es nicht zwangsweise nötig ist in Yoda Conditions zu schreiben. Aber nur, wenn die Coding Standards auch geprüft werden, denn dann greift die bereits existierende Regel „Assignments must not be placed in placed in conditionals“. Sollten keine Coding Standards geprüft werden, dann hilft die Schreibweise den Tippfehler mit nur einem „=“ auch direkt als Fehler zu finden.


Herzlichen Dank an Tonya Mork, Juliette Reinders Folmer und Hendrik Lührsen für die Twitter-Diskussion

6 Antworten auf Was sind Yoda Conditions und warum sollten wir sie nutzen?

  1. Wie du schreibst, ist die Yoda Schreibweise schwerer zu lesen. Dies empfinde ich auch so und bin schon öfter beim Lesen drüber gestolpert und musste es 2-3 mal lesen. Daher habe ich diese Überprüfung in meinen Projekten deaktiviert.

    Viel sinnvoller ist es doch Zuweisungen in if-Bedingungen ganz zu verbieten und nur Vergleiche zuzulassen. Das unterbindet diesen Fehler ebenfalls und macht den Code lesbarer. Ich empfehle in diesem Zusammenhang den Neutron PHP Standard sich anzusehen. Da sind einige Überprüfungen drin, die zusätzlich zu den WPCS die Entwicklung von modernen PHP Code unterstützen: https://github.com/Automattic/phpcs-neutron-standard

    Neben Pair programming und Code Reviews schaue ich regelmäßig bei https://laracasts.com/ vorbei. Die Tutorials kann ich sehr empfehlen, dort findet man auch sehr viele allgemein gehaltene Videos rund um PHP, Testing und Refactoring. Als PHP Blog kann ich noch https://stitcher.io/ empfehlen.

    • Vielen Dank für die ganzen Tipps und Links!

      Zu der Sache: Ich finde auch, dass es häufig viel übersichtlicher ist, bestimmte Zustände vorher konkret in eine „sprechende“Variable zu setzen und dann abzufragen, als einen kryptischen Vergleich in die Bedingung zu setzen.

    • Danke für den Tipp mit dem Neutron Standard, den kannte ich noch gar nicht! Abgesehen von den strict type declarations ist mein aktueller Code sogar schon konform damit. Die kann man aber dann wohl auch langsam mal in öffentlichen Plugins verwenden, wenn nun bald alle auf einen PHP 7.x Version angekommen sind.

  2. Bei so guten Erklärungen wünsche ich mir, dass du dich noch lange Zeit als „mittelmäßiger Entwickler“ ausgibst (auch wenn andere sicher gerne das Gegenteil behaupten). 😉

    Ich empfinde die WordPress-Coding-Standards (und die Autokorrektur beim Speichern in Visual Studio Code) als große Hilfe.

  3. Dein Beitrag war eine gute Erinnerung, endlich die WP Coding Standards bei mir im Editor auch zu aktivieren 🙈

    Mir war der Begriff der Yoda Conditions auch nicht bekannt, von daher spannend, davon zu lesen.
    Ich habe mich zu Anfang gefragt, wie hoch die Wahrscheinlichkeit ist, dass man versehentlich zwei Gleichheitszeichen vergisst, und wie viel höher die Wahrscheinlichkeit ist, eben nur eines zu vergessen, sodass via == verglichen wird.

    Aber unter den Umständen ist ja hinsichtlich der Condition selbst auch alles soweit gut, außer dass „nur“ der Typ nicht geprüft wird. Nicht schön, aber immer noch funktional.

    Hinsichtlich des Lernens mag ich es, von anderen abzuschauen: Ich nehme mir den Code vor und versuche zu verstehen, wie er strukturiert und aufgebaut ist, um es selbst zu adaptieren. Dabei ist der WordPress-Codex durchaus eine Anlaufstelle. Zwar sollte der nun nicht die einzig wahre Anlaufstelle darstellen, ist aber eben doch ein Projekt, wo viele Menschen mit vielen Erfahrungen mitarbeiten.

    Tendentiell bin ich dann aber aber ein Mensch, der sich mit Blogs oder ganz normalen Handbüchern behilft. Coding-Tutorials via Video finde ich ganz schwierig. Da muss ich immer an folgendes Video denken, das die Problematik für mich mit einem Augenzwinkern gut auf den Punkt bringt: https://www.youtube.com/watch?v=MAlSjtxy5ak

    • Lernen durch andere ist auch bei mir ganz weit oben. Inzwischen lese ich auch Core-Code und wühle mich in komplexe Plugins ein. Am Anfang der Karriere habe ich mich hauptsächlich im Theme-Code bewegt. Und es ist spannend mehr zu Wissen, weil es Türen öffnet und dann helfen manchmal kleine Tipps, wie das „guter Code steht links“ und „früh raus, wenn die Bedingung nicht zutrifft“, um enorme Qualitätssprünge zu machen.

      Das Video trifft mich hart. Genau das. Auch in Büchern geht es mir häufig so. Am Anfang denke ich mir, ja ja, das weiß ich ja schon alles. Das schreibst du nur, um die Grundlagen zu legen und dann geht es irgendwann mit dem richtigen Kram los und ich verstehe nichts mehr …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.