domingo, 7 de noviembre de 2010

La maldición de la Perla Negra: perla 1.

Entre las cosas que pretendo tratar aquí habrá discusiones sobre algunas técnicas de desarrollo en Java, ejemplos de cosas que se suelen hacer y son incorrectas, patrones, idiomas y trucos, y, en general, lo que se me vaya ocurriendo o se me vaya proponiendo.

He pensado que cierta variedad de todo esto puede tener entidad propia: esas piezas de código que uno se encuentra a veces y que deberían estar en un museo o en algún tipo de centro de exposiciones. Al menos, deberían estar en cualquier sitio menos donde están. Son lo que llamo “perlas”: magníficos ejemplos de la inventiva humana que demuestran que las aptitudes del autor están llamadas a más altas metas, como sembrar patatas o vaciar papeleras. Evidentemente, no son perlas de gran brillo; más bien son perlas negras. He pensado también que podríamos hacer una especie de encuesta para elegir la más espantosa, digo espectacular. Por supuesto, esto no dejaría de ser una maldición para el autor.

Y todo esto para justificar el título.

Para abrir el juego, he seleccionado una que he encontrado recientemente en el código que está en uso actualmente en una importante entidad pública de nuestro país. Así nos va. Simple, pero sustanciosa. Creo que es una buena candidata al triunfo final. En una de las clases me encontré el siguiente método:

public static String NEWLINE() {
    char salto = '\r';
    char retorno = '\n';
    char saltoRetorno[] = { salto, retorno };
    return new StringBuffer().append(saltoRetorno).toString();
}
Para empezar, tardé un buen rato en entender lo que el genio que lo escribió pretendía. Después, se dio uno de esos casos raros en que, durante unos instantes, me quedé sin palabras. No sé muy bien en qué estaba pensando el programador, si es que pensaba (aquí, haciendo amigos). Quizá trataba de demostrar su dominio técnico, y lo consiguió: éste no estaba en condiciones de afrontar una tarea técnica más compleja que manejar el mando de la tele (y según qué tele).

Dejando a un lado cómo encaja el nombre del método en las convenciones de codificación Java y que le haya colocado el public cuando el método solo se usaba en esa clase (a ver quién iba a ser el guapo que lo usara en otro sitio), no se le escapa ni al becario más inepto que este método podría escribirse tal que así:
public static String NEWLINE() {
   return "\r\n";
}
Al menos, acertó con el static. Teniendo en cuenta que una constante String es una instancia única, lo suyo era usarla directamente, si no se coloca en una variable final y estática. La cosa hubiera quedado ahí de no ser que el método se invocaba solo de la siguiente manera:
writer.write(NEWLINE());
…Donde writer es un BufferedWriter. El autor se hubiera ahorrado trabajo y aparecer aquí sustituyendo la invocación por:
writer.newLine();
Ahora bien, si realmente quería hacer notar su dominio de Java, yo le propondría esta otra solución:
public static String NEWLINE() {
    Vector lista = new Vector(); // ya puestos...
    char actual = '\r';
    while(actual!='z') {
        for(int i = 0; i<500; i++) { // Lo del 500 es por poner algo
            if(i==actual)
                lista.add((char) i);
        }
        if(actual=='\r')
            actual = '\n';
        else if(actual=='\n')
            actual = 'z';
    }
    StringBuffer buffer = new StringBuffer();
    for(int i = 0; i<lista.size(); i++)
        buffer.append(lista.get(i));
    return buffer.toString();
}
Con esfuerzo, se me podría ocurrir algo peor, pero esto ha sido suficiente para que me duela la cabeza. Me voy tomar unas aspirinas.

Salud.

No hay comentarios:

Publicar un comentario