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.
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…