Saltar al contenido

¿Qué es un número mágico y por qué es malo?

Te damos el hallazgo a esta incógnita, al menos eso pensamos. Si continuas con inquietudes puedes dejarlo en el apartado de comentarios, que para nosotros será un gusto responderte

Solución:

Un número mágico es un uso directo de un número en el código.

Por ejemplo, si tiene (en Java):

public class Foo 
    public void setPassword(String password) 
         // don't do this
         if (password.length() > 7) 
              throw new InvalidArgumentException("password");
         
    

Esto debe ser refactorizado a:

public class Foo 
    public static final int MAX_PASSWORD_SIZE = 7;

    public void setPassword(String password) 
         if (password.length() > MAX_PASSWORD_SIZE) 
              throw new InvalidArgumentException("password");
         
    

Mejora la legibilidad del código y es más fácil de mantener. Imagine el caso en el que configuro el tamaño del campo de contraseña en la GUI. Si uso un número mágico, cada vez que cambia el tamaño máximo, tengo que cambiar en dos ubicaciones de código. Si me olvido de uno, esto conducirá a inconsistencias.

El JDK está lleno de ejemplos como en Integer, Character y Math clases

PD: Las herramientas de análisis estático como FindBugs y PMD detectan el uso de números mágicos en su código y sugieren la refactorización.

Un número mágico es un valor codificado que puede cambiar en una etapa posterior, pero que, por lo tanto, puede ser difícil de actualizar.

Por ejemplo, supongamos que tiene una página que muestra los últimos 50 pedidos en una página de resumen “Sus pedidos”. 50 es el Número Mágico aquí, porque no está establecido a través de un estándar o convención, es un número que usted inventó por las razones descritas en la especificación.

Ahora, lo que hace es tener los 50 en diferentes lugares: su secuencia de comandos SQL (SELECT TOP 50 * FROM orders), su sitio web (sus últimos 50 pedidos), el inicio de sesión de su pedido (for (i = 0; i < 50; i++)) y posiblemente muchos otros lugares.

Ahora bien, ¿qué pasa cuando alguien decide cambiar de 50 a 25? o 75? o 153? Ahora tiene que reemplazar el 50 en todos los lugares, y es muy probable que lo pierda. Buscar/Reemplazar puede no funcionar, porque 50 puede usarse para otras cosas, y reemplazar ciegamente 50 con 25 puede tener otros efectos secundarios negativos (es decir, su Session.Timeout = 50 llamada, que también se establece en 25 y los usuarios comienzan a informar tiempos de espera demasiado frecuentes).

Además, el código puede ser difícil de entender, es decir, "if a < 50 then bla" - si encuentra eso en medio de una función complicada, otros desarrolladores que no están familiarizados con el código pueden preguntarse "¿¿¿WTF es 50???"

Por eso es mejor tener números tan ambiguos y arbitrarios exactamente en 1 lugar -"const int NumOrdersToDisplay = 50", porque eso hace que el código sea más legible ("if a < NumOrdersToDisplay", también significa que solo necesita cambiarlo en 1 lugar bien definido.

Los lugares donde los Números Mágicos son apropiados es todo lo que se define a través de un estándar, es decir SmtpClient.DefaultPort = 25 o TCPPacketSize = whatever (No estoy seguro si eso está estandarizado). Además, todo lo que solo se define dentro de 1 función puede ser aceptable, pero eso depende del Contexto.

¿Has echado un vistazo a la entrada de Wikipedia para el número mágico?

Entra en un poco de detalle sobre todas las formas en que se hace la referencia del número mágico. Aquí hay una cita sobre el número mágico como una mala práctica de programación

El término número mágico también se refiere a la mala práctica de programación de usar números directamente en el código fuente sin explicación. En la mayoría de los casos, esto hace que los programas sean más difíciles de leer, comprender y mantener. Aunque la mayoría de las guías hacen una excepción con los números cero y uno, es una buena idea definir todos los demás números en el código como constantes con nombre.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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