Secciones

Artículos para tus primeros pasos

Si estás empezando a introducirte en el mundo de Groovy y Grails, no te pierdas nuestros artículos básicos: 

Entrevistas con los expertos
 

Los protagonistas te cuentan de qué van los proyectos más importantes del mundo Groovy:


Un proyecto de:
ImaginaWorks
Campus Escuela de Groovy

Introducción a Groovy

domingo 12/08/2007

1. Introducción

Probablemente hayas escuchado o leído últimamente sobre los lenguajes dinámicos, sobre el incremento de productividad de "Ruby on Rails" comparado con aplicaciones JEE, sobre características nuevas para el lenguaje Java como los "closures" o el echo de que le lenguage Java no es el único que piede ejecutarse dentro de una JVM (máquina virtual Java). Resulta que Groovy es uno de esos lenguajes dinámicos ejecutables en una JVM, que a diferencia de los otros como lo son JRuby, Jython y Scala, posee un grado muy alto de cercanía con el lenguage Java y al mismo tiempo posee características únicas. Continúa leyendo para saber mas sobre este lenguage y lo que puede ofrecerte.

2. Primeros pasos: "Hola Mundo"

Empecemos con una muestra del lenguage, usando el típico ejemplo de imprimir una cadena "Hola Mundo!"
Listado 2.1

public class HolaMundo {
   public static void main( String[] args )
      System.out.println("Hola Mundo!");
   }
}

Listo! Un momento, el listado 2.1 se parece mucho al lenguage Java, en realidad es Java! este ejemplo muestra algo muy importante sobre el lenguage Groovy y es que cualquier clase/objeto Java también es una clase/objeto Groovy. Dejemos el "truco" atrás y vamos con el siguiente ejemplo, para el cual haremos uso de las siguientes características de Groovy:

  • Groovy soporta tipos dinámicos, como JavaScript o Perl, por lo que en la declaración del método main() podemos omitir el uso de String[] e inclusive el tipo de retorno void de main().
  • La visibilidad por omisión es public así que podemos omitirla también.
  • Existe un método para salida de caracteres llamado println, como el de Perl, que se resulta mas "amigable" que llamara System.out.println.
  • Los paréntesis son opcionales cuando se hace una llamada a un método.
  • El ';' al final de cada sentencia también es opcional.

Incorporamos los cambios y obtenemos


Listado 2.2
class HolaMundo {
   static main( args ){
      println "Hola Mundo!"
   }
}

Pero aun hay mas! A pesar de que Groovy es un lenguaje dinámico esto no significa que sea un lenguaje interpretado, de nuevo como JavaScript o Perl, sino que cada clase se compila a código byte (cosa que lo diferencía mucho de los otros lenguages que se ejecutan en una JVM), y sin embargo es posible escribir y ejecutar código Groovy como scripts, de tal suerte que el código mas pequeño que podemos escribir en Groovy para solucionar el ejemplo "Hola Mundo" es el siguiente


Listado 2.3
println "Hola Mundo!"

También es posible definir clases en un script y ejecutar sentencias sobre instancias de la misma


Listado 2.4
class HolaMundo {
   def saluda( nombre ){
      "Hola ${nombre}!"
   }
}

def hm = new HolaMundo()
println hm.saluda("Groovy")

En este listado hemos hecho uso de otras 3 características de Groovy

  • El valor de retorno del método saluda no es específico, por lo que usamos la palabra reservada def, la cual para hacer una analogía es como la palabra reservada var en JavaScript.
  • No es necesario definir la palabra reservada return, la última sentencia ejecutada determinar´ el valor de retorno, en este caso la creación de una cadena de caracteres.
  • La cadena de caracteres no es un java.lang.String cualquiera, en realidad es, parafraseando la versió en Inglés, "la característica mas sexy de Groovy": GString (si no entendiste el juego de palabras, pregúntale a un miembro del sexo femenino, pero con tacto). Los GStrings permite la evaluación de expresiones, igualmente como se hace en Perl.


3. De la teoría a la práctica

Suficiente de ejemplos, he aquí la lista de pasos a seguir para instalar Groovy en tu computador para que puedas ejecutar los listados de la sección 2 y los tuyos propios

  • Dirígete a htpt://groovy.codehaus.org/Download
  • Descarga la última versión estable disponible, la cual al tiempo de escribir éste artículo es 1.1-beta-2
  • Si deseas instalar en Windows, existe un instalador disponible en esa misma página, aquí encontrarás una breve descripción sobre él. El instalador cuenta con traducciones en Inglés, Castellano, Francés y Alemán.
  • Si escogiste la ruta "manual" (paso 2), descomprime el archivo en un directori de tu elección, como por ejemplo C:\groovy (en Windows) o /usr/local/groovy en Unix.
  • Declara una variable de ambiente llamada GROOVY_HOME que apunte al directorio que escogiste en el paso anterior.
  • Asegúrate que JAVA_HOME también este definido y apunte a un directorio de instalación de JDK.
  • Aseguráte que tanto GROOVY_HOME/bin y JAVA_HOME/bin formen parte de la ruta de búsqueda de programas (la variable de ambiente PATH).

Listo! ahora podrás ejecutar clases y scripts Groovy. Existen 3 formas de hacerlo

  • La primera y mas sencilla es ejecutar el intérprete de Groovy (no que este lenguage no era interpretado?), se requiere de un interprete de código byte, de igual manera como usas java para ejecutar clases compiladas de Java. Asumiendo que existe un script llamado hola.groovy con el contenido del listado 2.3 puedes ejecutarlo con la siguiente sentencia en una línea de comandos:

               groovy hola.groovy

  • La segunda forma es através de groovysh que es un programa interactivo en el que puedes escribir sentencias de Groovy y ejecutarlas en el momento.
  • La tercera forma (y la que te recomiendo para empezar) es a través de groovyConsole la cual es una versión gráfica de groovysh, con las característica adicional que te permite guardar lo ques escribas en pantalla como un script o cargar en pantalla un script que hayas escrito anteriormente.


4. Segunda ronda: tipos de datos

Ahora que ya sabes como ejecutar código Groovy te será mas facil seguir los ejemplos y explorar a tu manera. Continuemos pues con los tipos de datos soportados por Groovy. A diferencia de Java, en Groovy todo es un objeto no existen tipos de datos primitivos, es mas, el siguiente listado es una forma válida de ejecutar ciclos


Listado 4.1
3.times {
   println "hola"
}

Al ejecutar el listado anterior verás impreso en pantalla 3 veces la palabra "hola", lo cual al leer el código en inglés es exactamente lo que ocurre (times en contexto matemático se traduce al castellano como veces a multiplicar o ejecutar). Después de la sorpresa al ver que un método es ejecutado en un número como dueño del método, la siguiente sorpresa debería ser "por que no se imprimió la cadena 'hola' en un primer instante?" la respuesta es que el bloque de código que esta entre llaves es un "closure", el cual veremos mas adelante, pero es importante que te familiarices con este concepto.
Seguimos con tipos de datos, Groovy soporta todos los tipos de datos que Java, sin primitivos, y además define listas y mapas como tipos básicos, asi como los "arrays" y "hashes" de Perl y PHP. En realidad las listas son en el fondo java.util.ArrayList y los mapas java.util.HashMap asi que podrás usar todos los métodos que ya conoces en Java relacionados con listas y mapas. Groovy anexa un poco de "azúcar sintáctica" al permitir que los índices y llaves sean manipulados através del operador '[]', y en el caso de mapas también el operador '.'


Listado 4.2
def lista = [1,2,3,4,5]
def mapa = ["llave":"valor"]

assert lista.get(0) == 1
assert lista[0] == 1
assert mapa.get("llave") == "valor"
assert mapa["llave"] == "valor"
assert mapa.llave == "valor"
assert mapa."llave" == "valor

def listaVacia = []
def mapaVacio = [:]

// las listas crecen dinámicamente
// como los arreglos en JavaScript
def lista = []
lista[9] = 10
assert lista[9] == 10
assert lista.size() == 10

Otro tipo de dato muy útil son los Rangos (Range), los cuales definen una secuencia de valores que puede ser recorrida al derecho y a la inversa, normalmente son usados para obtener sublistas, pero tiene mas uso que eso
// el operador [] usado con cadenas de caracteres
// es igual que llamar substring() o charAt() en la cadena
// depende de los parámetros que se usen
println "Groovy"[0..3]
// imprime Groo

(0..9).each { num -> print num }
// imprime 0123456789
// los rangos también funcionan con otros tipos de datos
// ademas de números
('a'..'f').each { letra -> print letra }
// imprime abcdef

Groovy agrega métodos adicionales a listas y mapas, para ser exacto en realidad agrega métodos a muchas de las clases comunmente usadas, ha esto se le conoce como el GDK, muchos de ellos hacen uso de closures, por lo que será el siguiente tema que revisaremos.


5. Bloques reusables de código

En los listados 4.1 y 4.2 podemos ver ejemplos de closures, pero que son estos propiamente? puedes interpretarlos como bloques de código reusables, que retienen la información del entorno donde fueron definidos, para muestra un botón


Listado 5.1
def nombre = "Groovy"
def saluda = {
   println "Hola ${nombre}!"
}

saluda()
// imprime Hola Groovy!

Si conoces JavaScript esta forma de trabajo se te hará conocida, es como si definieras funciones anónimas en un script. Los closures también pueden recibir parámetros, como lo demuestra el listado 4.2, dado que los tipos en Groovy son opcionales puedes escribir tan solo el nombre del parámetro o también el tipo. Observa lo que sucede si no definimos el tipo y reusamos el listado 4.2


Listado 5.2
def printout = { item -> print item }
(0..9).each printout
('a'..'f').each printout
// imprime 0123456789abcdef

El uso de closures es tan común que si no defines un parámetro específico de todos modos tendrás disponible una variable it que representa el valor del parámetro, por lo que el código anterior puede reescribirse de la siguiente manera y tiene el mismo efecto


Listado 5.3
def printout = { print it }
(0..9).each printout
('a'..'f').each printout
// imprime 0123456789abcdef

// 5 maneras distintas de imprimir 0123456789
[0,1,2,3,4,5,6,7,8,9].each printout
(0..9).each printout
10.times printout
0.upto 9, printout
for( num in [0,1,2,3,4,5,6,7,8,9]) printout.call(num)

Te darás cuenta que el ciclo for debe llamar explícitamente al método call del closure a diferencia de los otros ejemplos, dado que el cuerpo del ciclo for no es un closure, es un bloque de código normal como en Java.


6. Conclusión

A pesar de que lo expuesto en las secciones anteriores es tan solo una pequeña parte de lo que Groovy puede ofrecerte como lenguage de programación, espero haya sido lo suficiente como para interesarte en darle un vistazo y probar los ejemplos por tí mismo.

 

 

Andrés es un Programador Java certificado, Desarrollador de Aplicaciones Web certificado, con más de 7 años de experiencia en diseño y desarrollo de aplicaciones. El ha estado involucrado en muchos desarrollos de aplicaciones web y desktop seleccionando el conjunto de herramientas y tecnologías mas apropiadas. También ha sido profesor de cursos de ciencias de la computación en el instituto educativo más prestigioso de México. Sus interese actuales incluyen arquitectura de software, Developer Testing, Groovy, Spring, AOP y Swing.


Más información: http://groovy.org.es

Contenidos relacionados:



5 comentarios:

Introducción a Groovy

Sandra - miércoles 29/08/2007

Amigos de Groovy

estoy muy entusiasmada con esta herramienta pero aun no he podido hacer que funcione. He configurado las variables de entorno JAVA_HOME Y GROOVY_HOME, al igual que el path. Y cuando ejecuto groovyConsole.bat me da la siguiente excepcion:
<Exception in thread "main" java.lang.NoClassDefFound Error: de>
He analizado los bat y el main esta en la clase org.codehaus.groovy.tools.GroovyStarter.class cuando ejecuto directamente esta clase tambien me arroja el mismo error:
<Exception in thread "main" java.lang.NoClassDefFound Error: GroovyStarter>
Bien, parece que esta faltando algun classpath, pero en la documentacion no dice como configurarlo.
Me pueden ayudar??
un saludo

Re:Introducción a Groovy

fibonacci - jueves 30/08/2007

¿Has probado el instalador para Windows? igual resuelve el problema: http://groovy.codehaus.org/Windows+NSIS-Installer

Re:Re:Introducción a Groovy

AndresAlmiray - viernes 31/08/2007

Sandra, el instalador para windows (NSIS-Installer) puede ayudarte con ese problema, tal y como lo sugiere 'fibonacci'.

Re:Re:Re:Introducción a Groovy

Sandra - viernes 31/08/2007

Saben, ya lo hice andar, luego de vs intentos. Hago el comentario x q tal ves le pase a otro y esto le pueda servir. Por defecto se instala en C:\Archivos de programa\Groovy. Este era el problema. Al instalarlo directamente en C:\Groovy el problema se soluciono. ¿?

Re:Introducción a Groovy

Andres Almiray - viernes 31/08/2007

Hmm, entonces no funcionó adecudamente si existe al menos un espacio en la ruta de instalación? le haré el comentario a Joachim, para ver que puede hacerse con el instalador.

Tienes que estar registrado para iniciar sesión y poder publicar tus comentarios