En el libro de Clean Code de Robert C. Martin (Uncle Bob) nos recomienda que las variables deben tener un buen nombre, un nombre que revele las intenciones de nuestro código.

No se trata sólo de que el nombre sea acorde al contenido de la variable, si no que hay que buscar la intención.

Mira este trozo de código:

public boolean isSS(int r, int hc, int e) {
    if (r != 3) {
        return false;
    }
    if (hc != 0xFFFFFF00) {
        return false;
    }
    if (e < 1000000) {
        return false;
    }
    return true;
}

¿Qué se supone que hace la función isSS? ¿Qué son los parámetros de entrada? Los nombres de las variables no son nada claros, y los valores contra los que se comparan tampoco ayudan, sólo podemos intuir que algo es SS cuando cumple las 3 condiciones.

Probemos de nuevo:

public boolean isSS(int race, int hairColor, int energy) {
    if (race != 3) {
        return false;
    }
    if (hairColor != 0xFFFFFF00) {
        return false;
    }
    if (energy < 1000000) {
        return false;
    }
    return true;
}

Algo mejor, aunque aún se hace dificil entender la intención. Parece que hay 3 parámetros a tener en cuenta: raza, color del pelo y energía… Bueno, está claro que parece una especie de clasificación racial con características específicas como el color del pelo, muy entendedor el entero hexadecimal por cierto #sarcasmo.

Vamos a mejorarlo aún más:

private static final HUMAN = 1;
private static final NAMEKIAN = 2;
private static final SAIYAN = 3;

private static final MINIMUM_ENERGY_REQUIRED = 1000000;

public boolean isSuperSaiyan(int race, int hairColor, int energy) {
    if (race != SAIYAN) {
        return false;
    }
    if (hairColor != Color.Yellow) {
        return false;
    }
    if (energy < MINIMUM_ENERGY_REQUIRED) {
        return false;
    }
    return true;
}

Y por fin descubrimos el nombre de la función, la que desvela el misterio (si sabes algo de Dragon Ball). Vayamos sin embargo al detalle:

  1. Comparar race con una constante con nombre descubre la intención de la comparación
  2. Lo mismo para el hairColor que además podemos aprovechar colecciones que ya nos da el framework o lenguaje.
  3. energy se podría mejorar, currentEnergy, personEnergy… pero al compararlo con la constante MINIMUN_ENERGY_REQUIRED y con el nombre de la función, se vuelve auto explicativa´. Aún así esa constante podría tener mejores nombre, si incluímos distintos niveles para distitas transformaciones: MINIMUM_ENERY_FOR_SUPERSAYAN, MINIMUM_ENERY_FOR_SUPERSAYAN2, MINIMUM_ENERY_FOR_KAITO_ATTACK, etc…

Podríamos darle unas vueltas más, pero de momento lo dejamos aquí, puedes ver el código completo en:

Agradecimientos

Gracias a mis compañeros y compañeras de Basetis por el acceso a este libro y la flexibilidad para escribir este contenido que comparto con vosotras.