En la jerga de programación , las condiciones de Yoda (también llamadas notación Yoda ) es un estilo de programación donde las dos partes de una expresión se invierten respecto del orden típico en una declaración condicional . Una condición de Yoda coloca la parte constante de la expresión en el lado izquierdo de la declaración condicional.
Las condiciones de Yoda son parte de los estándares de codificación para Symfony [1] y WordPress . [2]
El nombre de este estilo de programación se deriva del personaje de Star Wars , Yoda , que habla inglés con una sintaxis no estándar [3] (por ejemplo, "Cuando tengas 900 años, lucirás tan bien como no." [4] [ 5] ). Thomas M. Tuerke afirma haber acuñado el término notación Yoda y lo publicó por primera vez en línea en 2006. [6] Según él, el término condición Yoda fue popularizado más tarde por Félix Cloutier en 2010.
Normalmente una declaración condicional se escribiría como:
if ( $value == 42 ) { /* ... */ } // Se lee como: "Si el valor es igual a 42..."
Las condiciones de Yoda describen la misma expresión, pero al revés:
if ( 42 == $valor ) { /* ... */ } // Se lee como: "Si 42 es igual al valor..."
Algunos lenguajes, como Python , admiten operadores de comparación "encadenados" ("comparadores") en su sintaxis. [7] Así, las siguientes líneas son lógicamente equivalentes:
# Usando comparadores encadenados: si 3.14 < y <= 42 : ...# Lógicamente equivalente a: si ( 3.14 < y ) y ( y <= 42 ): ...
Observe que la segunda forma usa naturalmente la sintaxis de Yoda en la comparación de la izquierda ( 3.14 < y
). Considere la misma línea sin la sintaxis de Yoda:
si ( y > 3.14 ) y ( y <= 42 ): ...
Al escribir a mano matemáticas, muchos autores prefieren la notación "encadenada" (ejemplo, ejemplo). Al programar en un lenguaje que no admite literalmente la notación encadenada, el autor puede preferir la sintaxis de Yoda, ya que al menos evoca visualmente la familiar notación encadenada.
Colocar el valor constante en la expresión no cambia el comportamiento del programa (a menos que los valores se evalúen como falsos; consulte a continuación). En los lenguajes de programación que utilizan un único signo igual ( =
) para expresiones de asignación y no para comparación, un posible error es asignar un valor sin querer en lugar de escribir una declaración condicional.
if ( myNumber = 42 ) { /* ... */ } // Esto asigna 42 a myNumber en lugar de evaluar la condición deseada
Usando las condiciones de Yoda:
if ( 42 = myNumber ) { /* ... */ } // Esto es un error de sintaxis y no se compilará
Dado que 42 es una constante y no se puede cambiar, el compilador detectará este error .
Booleano miBooleano = nulo ; if ( myBoolean == true ) { /* ... */ } // Esto provoca una NullPointerException en Java Runtime, pero es legal en la compilación. // Esto sucede porque Java intentará llamar a myBoolean.booleanValue() en un objeto nulo.
Las condiciones de Yoda ayudan con comportamientos inseguros en algunas situaciones.
Cadena miCadena = nulo ; if ( myString .quals ( "foobar" ) ) { /* ... */ } // Esto provoca una NullPointerException en Java
Con condiciones de Yoda:
Cadena miCadena = nulo ; if ( "foobar" .quals ( myString )) { /* ... */ } // Esto se resuelve en falso sin generar una excepción NullPointerException
Las condiciones de Yoda son criticadas por comprometer la legibilidad al aumentar la carga cognitiva de leer el código. [8] [9] [10]
Algunos lenguajes de programación (como Swift , Kotlin y versiones de Python inferiores a 3.8) no permiten asignaciones de variables dentro de condicionales; por ejemplo, al exigir que las asignaciones no devuelvan un valor o al definir como parte de su gramática la invariante que las condiciones no pueden contener. declaraciones de asignación, en cuyo caso es imposible encontrar este error (es decir, el analizador lo detectaría como un error de sintaxis antes de que se le permitiera al programa ingresar al tiempo de ejecución ). [11] Muchos compiladores producen una advertencia para código como if (myNumber = 42)
(por ejemplo, la opción GCC advierte , sugiere paréntesis alrededor de la asignación utilizada como valor de verdad ), que alerta al programador sobre el posible error. En lenguajes dinámicos como JavaScript , linters como ESLint pueden advertir sobre una asignación dentro de un condicional. [12] Python 3.8 introdujo expresiones de asignación, pero usa el operador morsa en lugar de un signo igual normal (=) para evitar errores que simplemente confunden con . [13]-Wall
:=
==
=
La ventaja de evitar el comportamiento nulo también puede considerarse una desventaja, ya que los errores de puntero nulo pueden ocultarse y aparecer sólo mucho más tarde en el programa.
Otra desventaja aparece en C++ al comparar tipos no básicos, ya que == es un operador y es posible que no haya definida una función de operador sobrecargada adecuada . Ejemplo: una CComBSTR
comparación de Microsoft con un literal de cadena , escrito como if (L"Hello" == cbstrMessage)
, no se asigna a una función de sobrecarga. [14]
Una forma de ver la sintaxis de Yoda es que muestra signos de favorecer la sintaxis OSV (Objeto-Sujeto-Verbo) como orden básico en la cláusula simple.
Cuando cumplas novecientos años, lucirás tan bien como no lo serás.
Cuando *tú* alcances los novecientos años, lucirás igual de bien *tú* no, ¿eh?