Yoda conditions explained

In programming jargon, Yoda conditions (also called Yoda notation) is a programming style where the two parts of an expression are reversed from the typical order in a conditional statement. A Yoda condition places the constant portion of the expression on the left side of the conditional statement.

Yoda conditions are part of the coding standards for Symfony[1] and WordPress.[2]

Origin

The name for this programming style is derived from the Star Wars character Yoda, who speaks English with a non-standard syntax[3] (e.g., "When 900 years old you reach, look as good you will not."[4] [5]). Thomas M. Tuerke claims to have coined the term Yoda notation and first published it online in 2006.[6] According to him, the term Yoda condition was later popularized by Félix Cloutier in 2010.

Example

Usually a conditional statement would be written as:if ($value

42) // Reads like: "If the value equals 42..."

Yoda conditions describe the same expression, but reversed:if (42

Advantage

Readability of logically-chained comparisons

Some languages, such as Python, support "chained" comparison operators ("comparators") in their syntax.[7] Thus, the following lines are logically equivalent:

  1. Using chained comparators:

if 3.14 < y <= 42: ...

  1. Logically equivalent to:

if (3.14 < y) and (y <= 42): ...

Notice that the second form naturally uses Yoda syntax in the left-hand comparison . Consider the same line without Yoda syntax:if (y > 3.14) and (y <= 42): ...

When handwriting math, many authors prefer the "chained" notation (example, example). When programming in a language that does not literally support the chained notation, the author may prefer the Yoda syntax, as it at least visually evokes the familiar chained notation.

Detecting programmer mistakes

For symmetric comparisons, such as equality, swapping the left and right operands does not change the behavior of the program. In programming languages that use a single equals sign (=) for assignment expressions, one might mistakenly write an assignment expression where an equality comparison was intended.

if (myNumber = 42) // This assigns 42 to myNumber instead of evaluating the desired conditionUsing Yoda conditions:if (42 = myNumber) // An error this is and compile it will not

Since literal expressions such as 42 are not assignable (they are not "lvalues"), assignment-equality confusion in Yoda conditions often manifests as a compile-time semantic error.

Boolean myBoolean = null;if (myBoolean

true) // This causes a NullPointerException in Java Runtime, but legal in compilation.// This happens because Java will try to call myBoolean.booleanValue on a null Object.

Changing the target of dynamic dispatch

In most object-oriented programming languages, the receiver of a method call is written to the left of the call's other arguments. At the same time, in non-Yoda comparisons, the variable that is the subject of comparison is written on the left-hand side. Comparison method calls are thus ordinarily dynamically dispatched on the object being compared, which is not always desirable.

String myString = null;if (myString.equals("foobar")) // This causes a NullPointerException in Java

With Yoda conditions, the call can be dispatched on a constant object instead.

String myString = null;if ("foobar".equals(myString)) // This resolves to false without throwing a NullPointerException

Criticism

Yoda conditions are criticized for compromising readability by increasing the cognitive load of reading the code.[8] [9] [10]

Some programming languages (such as Swift, Kotlin and versions of Python below 3.8) do not allow variable assignments within conditionalsfor example by requiring that assignments do not return a value, or by defining as part of their grammar the invariant that conditions cannot contain assignment statementsin which case this error is impossible to encounter (that is, it would be detected as a syntax error by the parser prior to a program ever being allowed to enter into runtime).[11] Many compilers produce a warning for code such as if (myNumber = 42) (e.g., the GCC -Wall option warns suggest parentheses around assignment used as truth value), which alerts the programmer to the likely mistake. In dynamic languages like JavaScript, linters such as ESLint can warn on assignment inside a conditional.[12] Python 3.8 introduced assignment expressions, but uses the walrus operator := instead of a regular equal sign (=) to avoid bugs which simply confuse == with =.[13]

Another disadvantage appears in C++ when comparing non-basic types as the

External links

Notes and References

  1. Web site: Coding Standards (Contributing to Symfony). Symfony.com. 2016-11-12.
  2. Web site: PHP Coding Standards Coding Standards Handbook. WordPress Developer Resources. 2021-07-25.
  3. Web site: Pullum. Geoffrey K.. Yoda's Syntax the Tribune Analyzes; Supply More Details I Will!. Itre.cis.upenn.edu. Language Log. 2014-12-22. 2005-05-18. One way to look at Yoda's syntax is that it shows signs of favoring OSV syntax (Object-Subject-Verb) as the basic order in the simple clause..
  4. Web site: The StarWars.com 10: Best Yoda Quotes. starwars.com. Lucasfilm, Ltd.. 2014-12-22. 2013-11-26. When nine hundred years old you reach, look as good you will not..
  5. Web site: Quotes for Yoda (Character). imdb.com. Amazon. 2014-12-22. When nine hundred years old *you* reach, look as good *you* will not, hmm?.
  6. Web site: Yoda Notation (aka Yoda Condition)—Origin of the term . 2013-04-17. 2020-12-26.
  7. Web site: Comparisons . Python Library Reference . Python Software Foundation . 2008.
  8. Web site: Paris . Grégoire . Why using Yoda conditions you should probably not be . DEV Community . 30 January 2022 . en . 24 January 2020.
  9. Web site: Classic . Mike . Yoda Conditions: Why You Shouldn't Use Them . mikeclassic.ca . 30 January 2022 . en . 16 August 2017.
  10. Web site: Contieri . Maxi . 2023-02-07 . Code Smell 195 - Yoda Conditions . 2024-05-22 . Maximiliano Contieri - Software Design . en.
  11. Web site: Basic Operators — The Swift Programming Language (Swift 5.6) . docs.swift.org . Apple . 30 January 2022.
  12. Web site: disallow assignment operators in conditional statements . eslint.org . 2022-01-29.
  13. Web site: PEP 572 -- Assignment Expressions . Chris . Angelico . Tim . Peters . Guido . van Rossum . 2018-02-28 . 2021-07-18 . Python.org . en.
  14. Web site: CComBSTR Class . docs.microsoft.com . Microsoft . 30 January 2022 . en-us . 3 August 2021.