Yoda conditions

Summary

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 edit

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 edit

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 == $value) { /* ... */ }
// Reads like: "If 42 equals the value..."

Advantage edit

Readability of logically-chained comparisons edit

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

# Using chained comparators:
if 3.14 < y <= 42: ...

# Logically equivalent to:
if (3.14 < y) and (y <= 42): ...

Notice that the second form naturally uses Yoda syntax in the left-hand comparison (3.14 < y). 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.

Error detections edit

Placing the constant value in the expression does not change the behavior of the program (unless the values evaluate to false—see below). In programming languages that use a single equals sign (=) for assignment expressions and not for comparison, a possible mistake is to assign a value unintentionally instead of writing a conditional statement.

if (myNumber = 42) { /* ... */ }
// This assigns 42 to myNumber instead of evaluating the desired condition

Using Yoda conditions:

if (42 = myNumber) { /* ... */ }
// A syntax error this is and compile it will not

Since 42 is a constant and cannot be changed, this error will be caught by the compiler.

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.

Avoiding some types of unsafe null behavior edit

Yoda conditions help with unsafe behavior in some situations.

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

With Yoda conditions:

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

Criticism edit

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

Some programming languages (such as Swift, Kotlin and versions of Python below 3.8) do not allow variable assignments within conditionals—for 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 statements—in 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).[10] 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.[11] Python 3.8 introduced assignment expressions, but uses the walrus operator := instead of a regular equal sign (=) to avoid bugs which simply confuse == with =.[12]

The advantage of avoiding null behavior can also be considered a disadvantage, as null pointer errors can be hidden and only appear much later in the program.

Another disadvantage appears in C++ when comparing non-basic types as the == is an operator and there may not be a suitable overloaded operator function defined. Example: a Microsoft's CComBSTR compare against a string literal, written as if (L"Hello" == cbstrMessage), does not map to an overload function.[13]

References edit

  1. ^ "Coding Standards (Contributing to Symfony)". Symfony.com. Retrieved 12 November 2016.
  2. ^ "PHP Coding Standards | Coding Standards Handbook". WordPress Developer Resources. Retrieved 25 July 2021.
  3. ^ Pullum, Geoffrey K. (18 May 2005). "Yoda's Syntax the Tribune Analyzes; Supply More Details I Will!". Itre.cis.upenn.edu. Language Log. Retrieved 22 December 2014. 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. ^ "The StarWars.com 10: Best Yoda Quotes". starwars.com. Lucasfilm, Ltd. 26 November 2013. Retrieved 22 December 2014. When nine hundred years old you reach, look as good you will not.
  5. ^ "Quotes for Yoda (Character)". imdb.com. Amazon. Retrieved 22 December 2014. When nine hundred years old *you* reach, look as good *you* will not, hmm?
  6. ^ "Yoda Notation (aka Yoda Condition)—Origin of the term". 17 April 2013. Retrieved 26 December 2020.
  7. ^ "Comparisons". Python Library Reference. Python Software Foundation. 2008.
  8. ^ Paris, Grégoire (24 January 2020). "Why using Yoda conditions you should probably not be". DEV Community. Retrieved 30 January 2022.
  9. ^ Classic, Mike (16 August 2017). "Yoda Conditions: Why You Shouldn't Use Them". mikeclassic.ca. Retrieved 30 January 2022.
  10. ^ "Basic Operators — The Swift Programming Language (Swift 5.6)". docs.swift.org. Apple. Retrieved 30 January 2022.
  11. ^ "disallow assignment operators in conditional statements". eslint.org. Retrieved 29 January 2022.
  12. ^ Angelico, Chris; Peters, Tim; van Rossum, Guido (28 February 2018). "PEP 572 -- Assignment Expressions". Python.org. Retrieved 18 July 2021.
  13. ^ "CComBSTR Class". docs.microsoft.com. Microsoft. 3 August 2021. Retrieved 30 January 2022.

External links edit

  • united-coders.com: What are Yoda Conditions? Examples in Java
  • Yoda conditions very harmful seems to be Criticism of this technique, arguing that it can do more harm than good