Refactorización/Reemplazar número mágico con constante simbólica

Reemplazar número mágico por una constante simbólica

Que es un Número mágico editar

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

Por qué se debe evitar un número mágico editar

El número mágico de término también se refiere a la mala práctica de programación de utilizar números directamente en código fuente sin explicación. En la mayoría de los casos esto hace más difícil de leer, comprender y mantener programas. Aunque la mayoría de guías hacen una excepción para los números cero y uno, es una buena idea para definir todos los demás números en código como constantes con nombre. A continuación algunos factores que lleven al uso de un número mágico por parte de las personas.

1. El programador no tiene formación adecuada.
2. Aún teniendo formación, el programador no tiene la experiencia suficiente para aplicar proactivamente lo aprendido.
3. La presión de tiempo por una entrega del producto puede hacer que se programe "como sea".
4. Se programa en un entorno cultural indisciplinado y caótico.
5. No existen referencias externas que induzcan a una programación adecuada en el entorno cultural (programadores de mayor experiencia).

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

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

Esto debe ser repartido 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. Imaginemos el caso donde configuro el tamaño del campo de contraseña en la GUI. Si utilizo un número mágico, cada vez que cambia el tamaño máximo, tengo que cambiar en dos ubicaciones de código. Si se me olvida uno, esto conducirá a incoherencias.

Constante simbólica editar

Una constante simbólica representa (sustituye) a una secuencia de caracteres, en vez de representar a un valor (dato almacenado en memoria).

Para declarar una constante simbólica, en lenguaje C, se utiliza una nueva directiva del preprocesador:

  1. define <constante> <secuencia_de_caracteres>

La directiva #define indica al preprocesador que debe sustituir, en el código fuente del programa, todas las ocurrencias del <nombre_de_la_constante> por la <secuencia_de_caracteres>, antes de la compilación. Dos constantes muy habituales son:

  1. define PI 3.141592 #define

NUMERO_E 2.718281

En programación es una buena práctica escribir los identificadores de las constantes en mayúsculas, de esta forma es más fácil localizarlos en el código de un programa. Nótese que, después de la declaración de una constante simbólica no se escribe un carácter punto y coma (;), cosa que sí se debe hacer al declarar una variable.

Por otra parte, no se puede declarar más de una constante simbólica en una misma línea de código.

Reemplazamos un número mágico por una constante simbólica, Ejemplo editar

Número mágico

            double energiaPotencial(double masa, double altura){
              return masa * 9.81 * altura;             
            }

Constante simbólica

       double energiaPotencial(double masa, double altura){
          return masa * INTENSIDAD_DE_GRAVEDAD * altura;
       }
       static const double INTENSIDAD_DE_GRAVEDAD = 9.81;

Referencias editar

http://es.softuses.com/5106 http://www.refactoring.com/catalog/replaceMagicNumberWithSymbolicConstant.html http://sourcemaking.com/refactoring/replace-magic-number-with-symbolic-constant