Ich kann ja Daniel die Mine nicht ganz alleine überlassen, allerdings steckt mein nächster großer Artikel erst in den Kinderschuhen und wird demnächst nicht fertig. Daher hier ein Happen für zwischendurch.
Einer meiner liebsten Quälgeister in Ruby und allen anderen Sprachen, die Zuweisungen in Bedingungen erlauben, ist folgender:
1 2 3 |
if action = :pass #something end |
Und plötzlich wundert man sich, warum die Aussage immer wahr ist... Klar, kleiner Fehler, schnell korrigiert, aber manchmal nervig zu finden. Aber warum in die Gefahr begeben, wenn es doch so eine einfach Lösung dafür gibt?
1 2 3 |
if :pass = action #something end |
Das ist nicht nur ein Laufzeit-, sondern gleich ein Syntaxfehler. Gleichzeitig find ichs schöner, weil der wichtige Teil (der erwartete Wert) vorne steht. Obendrein unterscheidet es sich sofort von diesem Pattern, in dem die Zuweisung bewusst geschieht (wir nehmen mal an, dass die Berechnung von full_name unakzeptabel lang dauert):
1 2 3 |
if name = object.full_name puts name end |
Kommentar schreiben
Kommentare
Ich finde, das ist keine gute Idee. Zum einen ist der “wichtige Teil” nicht der Wert, sondern die Variable. Häufig ist in einer Methode ein Objekt bzw. eine Variable das, was gerade untersucht wird, und die sollte dann auch immer am Anfang stehen: name.blank?, name.changed?, name 'troll'. Vom Lesen her (in Deutsch, Englisch) liest es sich wesentlich natürlicher in der üblichen Form: Variable Wert. Die Frage lautet “hat A den Wert B” und nicht “ist B der Wert von A”. Das Subjekt kommt zuerst. Zum anderen muss man daran denken, dass die Reihenfolge in Ruby nicht egal ist: Das Objekt sollte entscheiden können, zu was es == ist, und nicht die Konstante. ruby -w gibt einem meistens auch schon eine Warnung, wenn man sich an so einer Stelle vertippt hat.
Du musst beachten, dass ich hier nur über Literale rede. Der Fall, das Objekte sich durchmogeln und :pass sind, wäre mir nicht wirklich recht. Wenn ich mit einem Literal vergleiche, ist in 99% der Fälle echte Gleichheit gewünscht, sollte sich ein Objekt da anders verhalten, würde ich das als ganz dicken Code Smell markieren. Insofern könnte man das logische Argument auch umdrehen: wenn ich strikt prüfen will (was ich bei Prüfungen gegen Literale meist will), muss das Literal sogar vorne stehen.
Die Reihenfolge in der natürlichen Sprache ist mir recht egal, ich schreibe weder Englisch noch Deutsch, sondern logische Ausdrücke. Und die sind auch gerne mal invers. Inwiefern die natürliche Sprache "Variable Wert" vorgibt, erschließt sich mir auch nicht: "Wenn :pass die auszuführende Aktion ist...". Die Gewohnheit mag anders reden.
ruby -w gibt da keine Warnung, weil = an (fast) jeder Stelle verwendet werden kann, an der erlaubt ist.
Kleiner Nachtrag: Die Blogsoftware schluckt (gleich)(gleich). Also jetzt (gg) ;).
Noch ein logisches Argument: (gg) ist nebenbei eh die strikte Prüfung Gleichheit und (ggg) die mit etwas mehr Luft. In jeder sinnvollen Codebasis sollte “A (gg) B” die Aussage “B (gg) A” implizieren.
Aber wie dem auch sei: ich sehe kein praktisches Problem damit (und auch kein philosophisches). Welchem Codestandard man folgt, ist allerdings natürlich Geschmacksache und bleibt jedem selbst überlassen.