Otra recomendación de Uncle Bob para dar buenos nombres a variables y funciones es: no utilizar nombres con variaciones mínimas.

Sobretodo ahora que los IDEs modernos lo autocompletan todo.

Mira este ejemplo:

findDragonBall()
findDragonBalls()
findDragonBells()
findDragonWithBalls()
findDragonWithBalletSlippers()

Los nombres son descriptivos, pero he acabado con un montón de funciones con nombre muy similar y esto es un problema.

El siguiente código está sacado del radar de Dragon Balls de Bulma:

int radarMode = 0; // 0 find Dragon Balls, 1 find Dragon
ArrayList<DragonBall> dragonBalls = new ArrayList<DragonBall>();
Shenron dragon = null;
private void onClick(int numberOfClickDone) {
    if (numberOfClickDone == 1) {
        if (radarMode == 0) {
            dragonBalls = findDragonBall();  
        } else {
            dragonBalls = findDragonBells();            
        }
    } else if (numberOfClickDone == 2) {
        if (radarMode == 0) {
            dragon = findDragonWithBells();
        } else {
            dragon = findDragonWithBalletSlippers();    
        }
    } else if (numberOfClickDone > 2) {
        if (radarMode == 0)
            radarMode = 1;
        else
            radarMode = 0;
    }
}

Este código no es limpio por varios motivos, pero vamos a centrarnos sólo en el nombre de los métodos.

Si hacemos más de 2 clicks seguidos cambiamos el modo del radar de ‘Buscar Dragon Balls’ a ‘Buscar al Dragón’ que concede deseos.

¡Pero ay de mi! Por ahorrarme unos clicks copiando y pegando y autocompletando los nombres de las funciones he llevado a Goku y sus amigos al desastre!

  • Si están buscando al Dragón y hacen 1 click, verán las Campanillas del Dragón y pensarán que hay varios Dragones invocados!
  • Por suerte, si en vez de eso hacen 2 clicks, encontrarán al Dragón con Zapatillas de Ballet, que no tengo claro si cumplía deseos o no.
  • Y si están buscando las DragonBalls y hacen 2 clicks encontrarán al Dragón con sus Campanillas, y posiblemente les diga que Gracias, pero que la princesa está en otro castillo.

Vamos a mejorarlo! Aplicaremos los siguientes cambios:

findDragonBall() -> findSingleDragonBall()
findDragonBalls() -> findAllDragonBalls()
findDragonBells() -> findDragonJingleBells()
findDragonWithBalls() -> findDragonAndDragonBalls()
findDragonWithBalletSlippers() -> findDragonPracticingBallet()

Unos nombres mucho mejores, y son mejores, porque me ayudan a mi y a quien venga detrás de mi a no cometer errores por falta de atención.

En el peor de las casos, cuando Bulma me tirase el radar por la cabeza porque no funciona, sería más fácil encontrar que erróneamente he puesto la función findDragonJingleBells donde no toca que la función findDragonBells cuyo nombre es muy, muy similar a la función correcta que va en esa línea.

Gist - Clean Code: Similar Names

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.