Condiciones Yoda

De Wikipedia, la enciclopedia libre

En la jerga de los programadores, las condiciones Yoda (también conocidas como la notación Yoda) es un estilo de programación donde las dos partes de una expresión están invertidas con respecto al orden típico en una sentencia condicional, de manera que una condición de Yoda coloca la parte constante de la expresión en el lado izquierdo de la declaración condicional.

Son parte de los estándares de codificación para aplicaciones como Symfony[1]​ y WordPress.[2]

Origen[editar]

El nombre de este estilo de programación se deriva de Yoda, un personaje de la película Star Wars que construye sus frases con un orden sintáctico particular[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 haberlo publicado en línea por primera vez en 2006.[6]​ Según él, el término condición Yoda fue popularizado más tarde por Félix Cloutier en 2010.

Ejemplo[editar]

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== $value) {/* ... */ }
// Reads like: "Si 42 es igual al valor..."

Ventajas[editar]

Detecciones de errores[editar]

Colocar el valor constante en la expresión no cambia el comportamiento del programa (a menos que los valores se evalúen como falsos; consúltense los párrafos siguientes). En lenguajes de programación que utilizan un único signo igual (=) para expresiones de asignación y no para comparación, puede aparecer un error al asignarse 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) {/* ... */ }
// Se trata de un error de sintaxis y no se compilará.

Dado que 42 es un valor constante y no se puede cambiar, este error será detectado por el compilador.

Boolean myBoolean= null;
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[editar]

Las condiciones de Yoda ayudan con comportamientos inseguros en algunas situaciones.

String myString= null;
if (myString.equals("foobar")) {/* ... */ }
// Esto provoca una NullPointerException en Java

Con condiciones de Yoda:

String myString= null;
if ("foobar".equals(myString)) {/* ... */ }
// Esto se resuelve en falso sin generar una NullPointerException

Crítica[editar]

Las condiciones de Yoda son criticadas por comprometer la legibilidad del gódigo, al aumentar la carga cognitiva.[7][8]

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 de 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 error de sintaxis antes de que se le permitiera a un programa pasar al tiempo de ejecución).[9]​ Muchos compiladores producen una advertencia para código como if (myNumber= 42) (por ejemplo, la opción GCC -Wall advierte "sugerir 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 puede advertir sobre una asignación dentro de un condicional.[10]​ 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 =.[11]

La ventaja de evitar el comportamiento nulo también puede considerarse una desventaja, ya que los errores de puntero nulo pueden ocultarse y aparecer solo mucho más tarde en el programa.

Otra desventaja aparece en C++ cuando se comparan tipos no básicos como el == es un operador y es posible que no haya una función sobrecarga de operador adecuada definida. Ejemplo: la comparación de un CComBSTR de Microsoft con una cadena de texto, escrita como if (L"Hello"== cbstrMessage), no queda asignada a una función de sobrecarga.[12]

Referencias[editar]

  1. «Coding Standards (Contributing to Symfony)». Symfony.com. Consultado el 12 de noviembre de 2016. 
  2. «PHP Coding Standards | Coding Standards Handbook». WordPress Developer Resources. Consultado el 25 de julio de 2021. 
  3. Pullum, Geoffrey K. (18 de mayo de 2005). «Yoda's Syntax the Tribune Analyzes; Supply More Details I Will!». Itre.cis.upenn.edu. Language Log. Consultado el 22 de diciembre de 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 de noviembre de 2013. Consultado el 22 de diciembre de 2014. «When nine hundred years old you reach, look as good you will not.» 
  5. «Quotes for Yoda (Character)». imdb.com. Amazon. Consultado el 22 de diciembre de 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 de abril de 2013. Consultado el 26 de diciembre de 2020. 
  7. Paris, Grégoire (24 de enero de 2020). «Why using Yoda conditions you should probably not be». DEV Community (en inglés). Consultado el 30 de enero de 2022. 
  8. Classic, Mike (16 de agosto de 2017). «Yoda Conditions: Why You Shouldn't Use Them». mikeclassic.ca (en inglés). Consultado el 30 de enero de 2022. 
  9. «Basic Operators — The Swift Programming Language (Swift 5.6)». docs.swift.org. Apple. Consultado el 30 de enero de 2022. 
  10. «disallow assignment operators in conditional statements». eslint.org. Consultado el 29 de enero de 2022. 
  11. Angelico, Chris; Peters, Tim; van Rossum, Guido (28 de febrero de 2018). «PEP 572 -- Assignment Expressions». Python.org (en inglés). Consultado el 18 de julio de 2021. 
  12. «CComBSTR Class». docs.microsoft.com (en inglés estadounidense). Microsoft. 3 de agosto de 2021. Consultado el 30 de enero de 2022. 

Enlaces externos[editar]