Posted by: Camilo Torres | August 23, 2013

java code

java code with a meaningless condition

Encontré esta pieza de código Java, sólo es un condicional:

if (banda.getField55().containsKey(“5F34”)
&& (!(banda.getElementValue(“5F34”).equals(“4E50”) && BcdLib
.hexStr_ascii(banda.getElementValue(“5F34”))
.equalsIgnoreCase(“NP”)))) {

En la primera parte de la condición se evalúa si algún campo contiene un valor (una clave). Creo que está bien, porque esta primera parte impide que el acceso a la “clave” en la segunda parte de la condición genere una excepción de null pointer típica de Java, esto es para evitar que el acceso a un campo inexistente genere un error.

Vamos a deshacernos de la primera parte y quedarnos sólo con la segunda parte de la condicion:

(!(banda.getElementValue(“5F34”).equals(“4E50”) &&
BcdLib.hexStr_ascii(banda.getElementValue(“5F34”)).equalsIgnoreCase(“NP”)))

Creo que siempre devuelve true por lo que esta parte de la condición es inútil. Lo peor es que introduce confusion al código porque el lector cree que este código hace algo realmente útil. Esta parte de la condición es una negación, por lo que si siempre devuelve true, la parte interior siempre debe devolver false, vamos a ver si eso ocurre:

banda.getElementValue(“5F34”).equals(“4E50”) &&
BcdLib.hexStr_ascii(banda.getElementValue(“5F34”)).equalsIgnoreCase(“NP”)

Para que esta parte de dos condiciones sea verdad, ambas condiciones deben ser verdaderas (es una “y” condicional). Pero aquí están evaluando si un solo valor es igual a dos valores diferentes al mismo tiempo, tal condición no puede suceder nunca, por lo que esta parte de la frase siempre devuelve false. Esto demuestra el punto de que esta parte de la condición carece de sentido.

Esto me lleva a pensar que el desarrollador original no tenía mucha idea de las reglas que él estaba tratando de escribir en su código. O puede ser que esto es un error en la condición que debe ser un “o” en lugar de una “y”? No hay manera de saber la respuesta al día de hoy.

Hay otros problemas sutiles en el código: ¿Por qué un acceso a la clave a través de getField55, en primer lugar, a continuación, acceder a la misma clave a través del objeto banda directamente? Además, están utilizando estos valores mágicas hexadecimales como 5F34, 4E50 y ese string NP, ¿Cuál es el significado de esos valores? Bueno, esto es sólo una pequeña parte de un sistema hecho de código espagueti, así que no me sorprendió encontrar este tipo de cosas, puede ser que empiece a escribir sobre esos trozos de malos códigos o errores …


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Categories

%d bloggers like this: