Secciones

Algo de metaprogramación en tus proyectos Groovy

Inicio » Artículos » Algo de metaprogramación en tus proyectos Groovy
La categoría del artículo es
Escrito el 22 September 2015, 20:02


Digamos que la metaprogramación no es más que extender la funcionalidad de determinadas clases Java en tiempo de ejecución. Por ejemplo, imagina que necesitas que la clase String tenga un método llamado urlize() el cual transforme una cadena cualquiera en una cadena que se pueda utilizar como parte de una url de nuestra aplicación. Por ejemplo, si tenemos la frase “Año 2015: el año del cambio.”, nuestro método debería devolver algo así como “ano-2015-el-ano-del-cambio”, esto es, eliminando todo tipo de carácter acentuado, espacios, comas y demás que tanto nos complican la vida en las urls.


Digamos que la metaprogramación no es más que extender la funcionalidad de determinadas clases Java en tiempo de ejecución. Por ejemplo, imagina que necesitas que la clase String tenga un método llamado urlize() el cual transforme una cadena cualquiera en una cadena que se pueda utilizar como parte de una url de nuestra aplicación. Por ejemplo, si tenemos la frase “Año 2015: el año del cambio.”, nuestro método debería devolver algo así como “ano-2015-el-ano-del-cambio”, esto es, eliminando todo tipo de carácter acentuado, espacios, comas y demás que tanto nos complican la vida en las urls.

Pues bien, para conseguir esto, por supuesto que podríamos crear una clase llamada MiString que extienda la clase String y ahí añadir nuestro método urlize(), pero ¿y qué pasa si añadimos directamente ese método urlize() a todas las instancias de la clase String?

En primer lugar, veamos como podemos utilizar metaprogramación directamente sobre nuestro código Groovy. Para ello podemos abrir una terminal de groovyConsole y ejecutar el siguiente código:

Groovy:
String.metaClass.urlize = {
    delegate.toLowerCase().replaceAll("\\p{Punct}","").replaceAll("ñ","n").replaceAll("[^(a-z0-9)]","-")
}

assert "ano-2015-el-ano-del-cambio" == "Año 2015: el año del cambio.".urlize()
 

Como podemos observar, la clase String automáticamente ha creado un nuevo método urlize() con la funcionalidad que le hemos especificado.


Espero tus comentarios...

Ayuda Textile