stringtranslate.com

Condiciones de Yoda

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]

Origen

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.

Ejemplo

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..."      

Ventaja

Legibilidad de comparaciones encadenadas lógicamente

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.

Detecciones de errores

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.         

Evitar algunos tipos de comportamiento nulo inseguro

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       

Crítica

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 CComBSTRcomparación de Microsoft con un literal de cadena , escrito como if (L"Hello" == cbstrMessage), no se asigna a una función de sobrecarga. [14]

Referencias

  1. ^ "Estándares de codificación (que contribuyen a Symfony)". Symfony.com . Consultado el 12 de noviembre de 2016 .
  2. ^ "Estándares de codificación PHP | Manual de estándares de codificación". Recursos para desarrolladores de WordPress . Consultado el 25 de julio de 2021 .
  3. ^ Pullum, Geoffrey K. (18 de mayo de 2005). "La sintaxis de Yoda que analiza el Tribune; ¡proporcionaré más detalles, lo haré!". Itre.cis.upenn.edu . Registro de idioma . Consultado el 22 de diciembre de 2014 . 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.
  4. ^ "StarWars.com 10: mejores citas de Yoda". starwars.com . Lucasfilm, Ltd. 26 de noviembre de 2013 . Consultado el 22 de diciembre de 2014 . Cuando cumplas novecientos años, lucirás tan bien como no lo serás.
  5. ^ "Citas de Yoda (personaje)". imdb.com . Amazonas . Consultado el 22 de diciembre de 2014 . Cuando *tú* alcances los novecientos años, lucirás igual de bien *tú* no, ¿eh?
  6. ^ "Notación Yoda (también conocida como condición Yoda): origen del término". 17 de abril de 2013 . Consultado el 26 de diciembre de 2020 .
  7. ^ "Comparaciones". Referencia de la biblioteca de Python . Fundación de software Python. 2008.
  8. ^ París, Grégoire (24 de enero de 2020). "Por qué probablemente no deberías usar las condiciones de Yoda". Comunidad DEV . Consultado el 30 de enero de 2022 .
  9. ^ Clásico, Mike (16 de agosto de 2017). "Condiciones de Yoda: por qué no debería utilizarlas". mikeclassic.ca . Consultado el 30 de enero de 2022 .
  10. ^ Contieri, Maxi (7 de febrero de 2023). "Code Smell 195 - Condiciones de Yoda". Maximiliano Contieri - Diseño de Software . Consultado el 22 de mayo de 2024 .
  11. ^ "Operadores básicos: el lenguaje de programación Swift (Swift 5.6)". docs.swift.org . Manzana . Consultado el 30 de enero de 2022 .
  12. ^ "no permitir operadores de asignación en declaraciones condicionales". eslint.org . Consultado el 29 de enero de 2022 .
  13. ^ Angélico, Chris; Peters, Tim; van Rossum, Guido (28 de febrero de 2018). "PEP 572 - Expresiones de asignación". Python.org . Consultado el 18 de julio de 2021 .
  14. ^ "Clase CComBSTR". docs.microsoft.com . Microsoft. 3 de agosto de 2021 . Consultado el 30 de enero de 2022 .

enlaces externos