Los problemas de tener un cerebro fuertemente tipado

Ayer sufrí en mis carnes una incidencia bastante curiosa. Bueno, en realidad no tan curiosa si eres un programador acostumbrado a lenguajes no tipados, como Javascript o PHP. Ese no es mi caso.

Habíamos detectado un problema en una aplicación que no tenía mucho sentido. El software cliente hace de forma periódica llamadas a un pequeño script PHP, que devuelve una serie de datos. Pero esos datos eran incorrectos. Tras repasar el script de arriba abajo, no conseguíamos dar con el problema. El flujo del programa debía comportarse según lo esperado, pero por alguna razón, no estaba siendo así.

Al final, el fallo estaba en un simple signo = que se me había olvidado. Tontuna de las gordas que te hacen perder una mañana.

Por ejemplo hacemos lo siguiente en C#:

var a = 2;

if (a = 2)
{
    //Lo que sea    
}

En este caso, el if espera un valor booleano. Pero lo que obtienes es un error de diciendo que “no se puede convertir implicitamente int en bool”. Esto ya nos da una pista de que hemos olvidado algo en el if, en concreto un signo =.

var a = 2;

if (a == 2)
{
    //Lo que sea    
}

El código anterior ya compila, y funciona sin problemas.

¿Y qué pasa por ejemplo en Javascript? Pues depende de qué pongamos en la variable a. Al poner un solo signo igual, estamos haciendo una asignación un valor a una variable. Y como el if también espera un valor booleano, Javascript lo convierte de forma automática. Si dicha asignación tiene un valor real, Javascript lo convertirá a true. Si no tiene un valor real lo convertirá a false. Podéis verlo mejor explicado aquí. En definitiva que si asignamos 0, cadena vacía, null, NaN, false, o undefined a la variable, el resultado será false. En cualquier otro caso será true.

Nota: Como dice jdonsan en los comentarios, en Javascript lo recomendable es utilizar el === para evitar estos problemas. Podéis verlo en el enlace que ha dejado. De todas formas el ejemplo está pensado para fallar, simulando lo que a mi me pasó con PHP.

En PHP, como podéis ver aquí, el comportamiento es bastante parecido.

En definitiva, que al haber olvidado un signo, estamos dependiendo del valor de la variable. La comparación no se realiza, y la entrada en el if dependerá de si el valor se convierte a false o a true. Un comportamiento, que en nuestro caso, era bastante errático.

Así que ya sabéis, cuidado con los signos.



¿Quiéres que te avisemos cuando se publiquen nuevas entradas en el blog?

Suscríbete por correo electrónico o por RSS