Deshazte de los números mágicos

Aunque en la física  y matemáticas los números mágicos molan (incluso en la informática general), dentro del mundo de la programación es muy deseable deshacerte de ellos.

 

Qué es un número mágico

Lo vamos a ilustrar con un sencillo ejemplo. Veamos la siguiente línea de código:

if(variableA < 50)

En esta línea hay un número que es 50 y se ha ganado el privilegio de ser nuestro número mágico de hoy. Tras ver el número seguramente surgirán varias preguntas en tu cabeza:

  • ¿A que tipo de «unidad» hace referencia? Para esto tendríamos que saber cual es el uso de  variableA, pero viendo esta línea no tenemos ni idea. Si incluimos otro tema de estudio, cómo dar nombres a variables y funciones, podríamos haberla llamado coordenadaX y hubiéramos podido intuir que es una posición sobre el eje X de algo (un CNC, impresora 3D, la pantalla…).
  • ¿Cual es su función? Pues el número no da ningún tipo de pista. Viendo el código que lo rodea, con la comparación (<) podemos suponer que es un límite superior a algo, pero… ¿porqué es < y no >? (¿o >=?…)
  • ¿Por qué este valor es 50 y no 73 (o 53, o 12, o 27 o …)? Aquí si que no tenemos ningún tipo de lógica que responda a esa pregunta.

 

Concluyendo, el nombre de números mágicos viene dado porque no resulta sencillo saber su origen. Por lo que se concluye que dicho valor ha sido obtenido mediante «métodos mágicos». Quizás sea obvio para quien lo escribió y en el momento que lo escribió, pero mejor dejar el código lo más legible que se pueda, ¿verdad?

La misma línea de código expresada de la siguiente manera facilitaría su lectura y clarificaría de las intenciones del programa (incluyo también a partir de ahora el nombre de la variable mejorado):

if(coordenadaX < LONGITUD_X_MAXIMA)

Donde LONGITUD_X_MAXIMA nos responde a las preguntas formuladas: es una longitud, es un máximo sobre la longitud X y es 50 porque es el máximo de dicha medida (bueno, este último caso no es una respuesta, es más bien una indicación, ya que habría que conocer el objeto al que hace referencia para saber sin duda por qué es 50).

 

Por qué evitarlos

Existen 2 razones (como poco) por las que eliminarlos:

  • La primera se deduce de la explicación anterior. Los números no  muestran claramente el uso y significado.
  • La segunda se basa en reducir el trabajo y los errores. Generalmente este número será usado en más de una ocasión, por lo que si está repetido en 15 sitios podemos equivocarnos y escribir el número erróneamente en alguno de ellos. O si hay que cambiar el valor podemos cambiarlo solo en 14 sitios. Entonces al llegar el código al sitio donde pusimos el valor equivocado su uso será erróneo.

 

Sencilla solución

La solución consiste en sustituir ese número por una palabra (o varias juntas) que aclaren su significado,  y asignarle a esa palabra el valor que hay que usar, tal y como hemos hecho en el ejemplo.

Dependiendo del lenguaje de programación y gustos existen dos formas principales de conseguirlo.

Macro

En el lenguaje de programación C y algunos derivados (como p.e. Arduino) existe lo que se denominan Macros. Esto consiste en una sustitución de texto realizada antes de compilar. De forma que el texto que nosotros escribiremos será el identificador y el número será lo que llegue al compilador tras la sustitución.

La sintaxis sería:

#define LONGITUD_X_MAXIMA 50

Y entonces el código escrito como

if(coordenadaX < LONGITUD_X_MAXIMA)

se convierte en

if(coordenadaX < 50)

al llegar al compilador, usando el valor correcto.

Constante

En muchos lenguajes de programación se permite crear variables con una característica que es «constante». Por ejemplo, el uso de la palabra const en C y derivados. Este modificador indica que el valor de esa variable no puede cambiarse.

Por lo que le damos un valor inicial a dicha variable, el que queremos usar, y ya no se le puede dar otro valor.

const int LONGITUD_X_MAXIMA = 50;

he usado aquí el mismo formato de capitalización que para la macro. Dependiendo del estilo de tu gusto (otro tema de estudio), podrías emplear otro, por ejemplo:

const int LongitudXMaxima = 50;

Uso

A partir de ahí su uso es como el de cualquier otra variable. Salvo, como ya hemos comentado, la asignación que no se permitirá.

Como se puede suponer, en caso de que haya que cambiar el número, bastará con hacerlo solo en la línea donde se ha hecho la definición. El nuevo valor será el usado en todos los sitios.

El método de usar constantes suele ser preferible sobre el de las macros.

 

Conclusión

Si habéis llegado hasta aquí y tenéis conocimiento del tema, puede que os estéis preguntando: ¿Por qué  otra entrada más sobre números mágicos habiendo ya taaaaaantas en internet?

Sencillo, porque a pesar de todo, a día de hoy, sigue existiendo mucho código que emplea estos números mágicos, por lo que nunca está de más poner otro granito de arena.

Este ha sido siempre un punto importante en el estudio y  evolución de la programación ya que, como he comentado anteriormente, el usar los número directamente en el código fuente tiene una alta probabilidad de cometer errores y dificulta la lectura del programa.

Imaginad hasta que punto esto parece importante, que incluso números famosos, que están fuera, de duda no se utilizan directamente. Por ejemplo, en math.h suele estar definido M_PI (o similar) y otros números importante (e, logaritmos…).

 

 

P.D. la imagen ha sido obtenida de clipartxtras.com

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

4 + 3 =

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.