domingo, 7 de marzo de 2010

Envidias...


Fotografía de JC Olivera

Los compañeros del laboratorio utilizamos o hemos utilizado muchos lenguajes de programación teniendo cada uno nuestras preferencias personales más o menos pasajeras. Esto da bastate pie a la comparación y a comprobar y desmentir tópicos.

Una comparación típica es Java vs lenguajes de scripting (Python, JavaScript, Perl) y qué cosas se echan de menos o se envidian cuando se programa en Java. Pongamos como ejemplo la cantidad de líneas que hacen falta para solucionar cualquier problema en Java comparadas con un poco de hacking en Python o Perl. Como explican en el Schneide Blog:

Quiz: Whats one of the most heard flaws of Java compared to other languages?
Bad Performance? That’s a long overhauled myth. Slow startup? OK, this can be improved… It’s verbosity, right? Right but wrong. Yes, it is one of the most mentioned flaws but is it really inherit to the language Java?

La entrada, que es muy interesante, termina concluyendo que la culpa no es del lenguaje Java sino del diseño de las bibliotecas. Quizás Python y Perl le deben tanto a sus bibliotecas oficiales y al CPAN como a su sintaxis.

Una característica my envidiable es la facilidad pasmosa con la que se crean hashes de hashes en los lenguajes de scripting y para muestra un JSON:

var a = {
    "rojo": { "fichas": [1, 3, 4], "nombre": "juan" },
    "amarillo": { "fichas": [22], "nombre": "pedro" }, 
}

Lo más parecido que tenemos en Java son las clases derivadas anónimas, también conocidas como Double Brace Initialization (suena a jugada de los hermanos Derrick).Para utilizarlo, tras invocar al constructor se añade código de inicialización entre dos pares de llaves. El efecto es una clase anónima derivada de la clase cuyo constructor se invoca y que lleva adosado al constructor las líneas extra que se quiera. Repitiendo el ejemplo anterior:

Map a = new HashMap() {{
    put("rojo", new HashMap() {{
        put("fichas", new int[] {1, 3, 4});
        put("nombre", "juan");
    }});
    put("amarillo", new HashMap() {{
        put("fichas", new int[] {22});
        put("nombre", "pedro");
    }});
}};

La verdad es que sigue siendo bastante más verboso que en JavaScript, pero es un avance... Además, podemos utilizar los generics para tener tipado estático mucho más concreto que en un JSON. ¿Tenéis alguna forma más cómoda de hacerlo? ¿Y otros trucos parecidos? Los comentarios son bienvenidos.

No hay comentarios:

Publicar un comentario