Jan 9, 2011

Java, tricky Java: Identificadores válidos

Ultimamente he estado leyendo mucho sobre Java en mi tiempo libre, bien, bien adentro, allí donde nunca había llegado pues nunca lo había necesitado. Es increíble cuántas cosas nuevas se aprenden a pesar de haber usado el lenguaje por 7 u 8 años. Y estoy hablando de Java puro, como lenguaje, nada de bibliotecas o trucos de entorno de desarrollo, sino lo "básico" y "simple" de cada día... que en realidad ha resultado ser ni tan básico, ni tan simple.

Bajo el título de "Java, tricky Java" voy a publicar las cosas que me más interesante me han resultado. Es posible que muchas las conozcan, a lo mejor otras no, y es muy probable que más de una les quite la silla y los deje en el suelo (como a mí). De vez en cuando, pondré algún que otro código de esos horribles y super-complicados que tanto odio, del tipo "¿qué se imprime aquí?" o "¿cuál es el error?", para que busquen la respuesta y se sientan traicionados por la vista (como yo).

En el primero de todos, vamos a ver algo que me impresionó mucho pues nunca lo había visto usado: el caracter $ es completamente legal a la hora de declarar un identificador.  Esto quiere decir que el ejemplo siguiente es perfectamente válido:
public class Main {
 
    private static int $1 = 1;

    public static void main(String[] args) {
        int $ = $1 + 1 + $2();
        $3 $3 = new $3();
        System.out.println($ + $1 + $2() + $3.$3());
    }
 
    private static int $2() {
        return 2;
    }
 
    private static class $3 { 
        public int $3() {
            return 3;
        }
    }
}
El ejemplo anterior a primera vista, más que un código en Java, me da la impresión de un bulto de fórmulas matemáticas todas juntas en un mismo lugar. Por diversión, traten de ver cuánto se imprime sin utilizar un compilador, y en cuanto lo logren, prueben suerte con la siguiente obra de arte, donde se muestra otro caracter sobre-utilizado para declarar variables:
public static void main(String[] args) {
    int ___1__ = 2;
    int ____1___ = 3;
    int __1____ = 4;
  
    System.out.println(___1__ + ____1___ + ____1___);
}
El caracter _, a pesar de ser muy utilizado para la declaración de constantes separando las palabras (según las convenciones de Sun), puede destruir la legibilidad del código cuando es utilizado de forma abusiva. Si lo juntamos con el caracter $, ya pueden imaginarse los resultados.

Obviamente, códigos como estos son completamente reprochables. El hecho de que el símbolo $ sea un identificador válido, no quiere decir que debamos usarlo, pues afecta de mala manera la legibilidad del código. Del mismo modo, el caracter _ debe ser solamente utilizado como separador para evitar confusiones innecesarias. Recordemos siempre la importancia que tiene utilizar identificadores legibles para aumentar la claridad de nuestro trabajo.

4 comments:

  1. Santiago,

    Al parecer te esta bajando la audiencia en tus articulos, o quizas este no fue el mas interesante, o soy el primero en leerlo, algo de eso. :)

    Pero esta bastante interesante esos caracteres como identificadores y realmente jamas me paso por la cabeza usarlos, uno con la formacion wue le dan en la carrera, mas los estandares que se ha leido (como dice la frase: "lo bueno de los estandares es que hay bastantes" o algo parecido), pues esos quedan fuera.

    En el primero creo que imprime 10, el segundo 8.

    Saludos,
    Fidalgo.

    ReplyDelete
  2. No, en realidad lo que sucede es que siempre y cuando los artículos no sean polémicos, el número de comentarios es menor. Pero las visitas han aumentado mucho mucho. En cuanto a los resultados, es correcto lo que dices, 10 y 8.

    ReplyDelete
  3. Hola Santiago. Interesante tu artículo. He aquí algunas boberías más:

    Resulta que puedes utilizar cualquier cosa que unicode considere una letra o un número en los identificadores dentro del lenguaje:

    http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#40625

    Este interesante artículo es sobre el otro nivel, la máquina virtual de Java:

    http://blogs.sun.com/jrose/entry/symbolic_freedom_in_the_vm

    Te podrá parecer estúpido que alguien se preocupe sobre cómo poner un "+" en el nombre de un campo, cuando el lenguaje no lo admite. Puesto que Java como lenguaje podría utilizar unas cuantas mejoras, o no es idóneo para todos los fines, existe toda una familia de lenguajes de programación alternativos que corren sobre el jvm, algunos de ellos incluso con sobrecarga de operadores...

    Saludos!

    ReplyDelete
  4. Si, verdad que hay gentes que se meten bien pero bien adentro :)

    ReplyDelete

Note: Only a member of this blog may post a comment.