Vamos con otra de Clean Code de Robert C. Martin esta está muy relacionada con la de Nombres que se puedan pronunciar

Hay que usar nombres que se puedan buscar. Veamos un ejemplo:

private class Message {
    Integer level;
    String text;

    public Message();
}

private class Scouter extends ScouterBase {
    public Scouter();

    public void showMessages(ArrayList<Message> mm) {
        for (Message m : mm){
            this.Console.show(m);
        }
    }

    public void explode() {
        return null;
    }

    public void readEnergy(EnergyBufferReader energyBufferReader) {
        Integer i = 0;
        while (energyBufferReader.read()) {
            i += 1;
            if (i > 9000) {
                Message m = new Message();
                m.level = 2;
                m.text = "OVER NINE THOUSAND!!!!";
                mm.add(m);
            }
            if (i > 24000) {
                scouter = scouter.explode();
            }
            i++;
        }

        if (scouter != null) {
            scouter.showMessages(mm);
        }
    }
}

Este código está sacado de la v1 de los Scouters que utiliza el ejército de Freezer para medir la energía de un oponente.

Esta versión era bastante limitada, ya que cuando pasa de 24000 unidades, explota ¯_(ツ)_/¯.

Si habéis leído los artículos anteriores, ya habréis empezado a adquirir una sensibilidad para detectar nombres poco adecuados. Esta vez no los revisaremos todos, sólo aquellos relacionados con que los nombres sea fáciles de buscar.

Integer i = 0;
while (energyBufferReader.read()) {
    i += 1;
    if (i > 9000) {
        Message m = new Message();
        m.level = 2;
        m.text = "OVER NINE THOUSAND!!!!";
        mm.add(m);
    }
    if (i > 24000) {
        scouter = scouter.explode();
    }
    i++;
}

Las variables i, m y mm ya huelen mal: code smells pero os dejaré la oportunidad de proponer mejores nombres en los comentarios del post.

Quiero centrarme en los valores 24000 y 9000.

Empieza la aventura…


Han pasado 2 años desde que lanzamos la primera versión del firmware y hemos convencido a Freezer para que nos apruebe el presupuesto de una nueva versión del Scouter que cumpla con los siguientes requerimientos:

  1. Conseguir que el Scouter admita hasta 200.000 unidades de fuerza antes de explotar.
  2. Eliminar el Warning de las 9000 unidades.

Tenemos que presentarle el prototipo en 3 segundos (aquí todos somos guerreros, volamos y corremos a velocidades supersónicas, programamos muy rápido!).

He visto en Git que eres la persona que más contribuyó al proyecto del firmware del Scouter, un proyecto que tiene más de 10.000.000 de lineas de código y miles de clases.

Te pido que me digas donde se gestiona la limitación y el mensaje, pero no recuerdas que lo escribieras tú y ya he gastado 1 segundo de los 3 haciendote la pregunta.

No parece difícil, buscas en el código 24000 y… encuentras montones de ficheros con ese valor:

int secondOfNamekianYear = 24000
...
int 2NamekianYears = 24000 + 24000
...
String randomMD5 = "adskl2345j24000reki2345h42dvgf"
...43475 matches found in 7564 files

Una gota de sudor frío recorre tu cara

Empiezo a pensar que estamos muertos

Espero que si al menos resolvemos una de las incognitas Freezer nos perdone la vida, al menos que me la perdone a mi, tú ya te apañarás.

Recuerdo que a Nappa y Vegeta les salió el Warning de los 9000, cojo mi Freezer Phone y llamo a Napa… (Vegeta no tiene móvil)

  • “El número marcado es incorrecto o no existe. Es posible que el propietario de esta línea pasara a mejor vida.”

Holy Shit, estamos muertos!

Vale, calma, tenemos una máquina del tiempo, volveré al día que programamos esos límites y les pondré nombres que se puedan buscar y cambiar nuestro desafortunado futuro.

Vamos!

private static final Integer WARNING_ENERY_VALUE = 9000;
private static final Integer MAX_ENERY_VALUE = 24000;

Integer energyValue = 0;
while (energyBufferReader.read()) {
    energyValue += 1;
    if (energyValue > WARNING_ENERY_VALUE) {
        Message m = new Message();
        m.level = 2;
        m.text = "OVER NINE THOUSAND!!!!";
        mm.add(m);
    }
    if (energyValue > MAX_ENERY_VALUE) {
        scouter = scouter.explode();
    }
    i++;
}

Seguro que puedo hacerlo mejor, pero creo que con esto vale, vuelvo al presente, justo al segundo en el que viajo al pasado, para tí sólo he desaparecido unos nanosegundos.

Fantástico, de hecho ya no necesito buscar, acabo de editar la clase ScouterEnergyManager y puedo acceder directamente a ella.

Un momento, ¿no existe? Estamos muertos!

Espera! es posible que en 2 años la clase haya cambiado de nombre? …si no han refactorizado el código aún tenemos una oportunidad!

¿Cómo se llamaba la constante que decía el valor máximo de energía aceptado? Claro! MAX_ENERGY_VALUE! Súper intuitivo! Lo tenemos!!!!


Por suerte, esta aventura ha acabado con final feliz, pero nos ha ido de un pelo, a partir de ahora cuidaremos mucho más el código.

¿Qué mejoras sugieres sobre el resto del código de este post?

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.