Éramos MAGIC NUMBER y parió la abuela

Un número mágico (magic number, de toda la vida de dios) es el término que se usa para describir un valor metido a cañón en el código, por ejemplo un entero, el cual sería más legible y mantenible si se definiese como una constante.

Wikipedia - Magic Number

Y en el fondo tiene toda la razón, ¿no? ¿NO?

Recuerdo un proyecto en el que utilizábamos Sonar, muy de moda con el rollo de la integración continua, el cual ejecuta automáticamente FindBugs y Checkstyle sobre el código fuente. Estas dos herramientas son analizadores estáticos de código, que detectan problemas y ofrecen métricas de calidad del software. Herramientas muy recomendables, por supuesto, siempre que se usen correctamente.

Y es que las métricas están muy bien para aquel al que le sirven de algo. O dicho de otro modo, ejecutando Checkstyle un desarrollador puede comprobar si tiene algún vicio a la hora de programar, y aprender soluciones más elegantes o más fáciles de mantener. Primer problema: estas reglas han sido escritas por personas, y la programación tiene un alto grado de subjetividad. Segundo problema: a estas herramientas les falta “contexto” y su análisis es exhaustivo e indiscriminado.

En este ejemplo, Checkstyle marcará como números mágicos los enteros 7 y 1024:

for (int i = 0; i < 7; i++) {
   kittens[i].meow();
}

StringBuilder sb = new StringBuilder(1024);

Me parece estupendo que el número de gatitos quede más mono definido en una constante, pero una capacidad inicial, que no va a ninguna parte y sólo se hace por rendimiento, NO. NON. NEIN. NÃO. IIE. Y es que nadie tiene la verdad absoluta, excepto yo.

Pero vale, a fin de cuentas sólo es una métrica. Te puede gustar más o menos, la puedes usar o ignorar… Hasta que alguien decide que esas métricas son un factor importantísimo y tienen que entregarse al cliente. ¡Tachán! Acabas de convertir una herramienta destinada al desarrollador en un requisito del cliente. Y además uno muy visible, así que hay que cumplirlo a rajatabla. Y como suele pasar, la pereza nos puede, siempre nos puede, y acabas hasta el gorro de extraer constantes, pensar nombres, buscar duplicados… Hasta ese punto crítico en el que aparece la primera constante mágica (término mío):

final int NUMERO_17 = 17;

Desde ahí ya es todo cuesta abajo. Las constantes pierden sentido, se tarda más tiempo en escribir y en corregir, y la calidad del código empeora (aunque el Checkstyle pase limpio).

Lo dicho, que éramos NUMERO_MIEMBROS_FAMILIA y parió la abuela…

Autor

Héctor

Viendo los bytes pasar desde mi ventana