26.4.10

Groovy on Grails (II): Tecnologías asociadas :: Groovy

Groovy

En este apartado, se va a profundizar en los aspectos más relevantes de Groovy mediante descripciones y ejemplos. No se puede considerar este apartado como un manual de usuario de Groovy, más bien  como un pequeño tutorial de introducción a éste potente lenguaje de scripting.

En algunos de estos ejemplos se hará una comparativa directa con Java con el objetivo de demostrar la disminución de código entre uno y otro.

  1. Primeros pasos: “Hola Mundo”
Queremos que Groovy imprima por pantalla una cadena de caracteres con la información “Hola Mundo”. Gracias a la compatibilidad de  Groovy con el lenguaje  Java se podría implementar este problema de la misma manera que lo haríamos en Java, pero al ser un lenguaje de Scripting no sería necesaria la creación de una clase, con solo introducir la instrucción de imprimir por pantalla  sería suficiente.
public class HolaMundo{
     public static void main(String[] args){
        System.out.println(“Hola Mundo”);
     }
}


-----------------------------------------------


println “Hola Mundo” 

La diferencia de cantidad de código es abrumadora,  pero existen otras implementaciones con el mismo objetivo. 
class HolaMundo{
    def hiWorld(name){
       “Hola ${name}”
    }
}


def hW = new HolaMundo()
println hW.hiWorld(“Mundo”)
Con esta implementación podemos observar algunas de las características de Groovy:
  • El valor de retorno no es específico, por lo que usamos la palabra reservada  def (muy parecida a la palabra var de JavaScript)   
  • No es necesario utilizar la palabra reservada return, la última sentencia ejecutada determina el valor de retorno.   
  • La cadena de caracteres no es un java.lang.string, se trata de un GString. Los GStrings permiten la evaluación de expresiones, al igual que con Perl

  1. Tipos de datos
Groovy soporta todos los tipos de datos de  Java, sin primitivos, y además define listas y mapas como tipos básicos, así como los arrays y hashs de  Perl PHP. Erealidad las listas son en el fondo java.util.ArrayList y los mapas java.util.HashMap, por lo que se podrán utilizatodos los métodos ya conocidos en Java relacionados conlistas y mapas. Además, Groovy permite que los índices llaves sean manipulados a través del operador ‘[]’, y en elcaso de los mapas también mediante ‘.’.
<-- Números -->


def x = 12
def y = 10.0e4


<-- Caracteres y Strings -->
def c = “a”


def s = “hi World!”


<-- Listas y Mapas -->


def list = [1,2,3,4]


def map= [“Jon”:”Matthers”, “1”:”Mark”]  


<-- Rangos -->


def rg = (0..9)


<-- Impresión de rangos -->
rg.each{num -> print num}
Como podemos observar, la definición de variables en Groovy no implica una definición primitiva, el contenido de la variable especifica el tipo de dicha variable. En la última descripción, podemos observar el método de recorrido de los rangos, el cuál puede ser aplicado en más tipos de variables, además nos introduce en un nuevo concepto de  Groovy, que ha sido adoptado por la nueva implementación de Java 7, las closures. 

  1. Closures
Una closure se podría describir como un bloque de código reutilizable, que retiene la información entorno donde fueron definidos.

Esta forma de trabajo es muy parecida a JavaScript, ya que es muy parecido a la definición de una función anónima en un script. Las closures pueden recibir parámetros, puesto que los tipos de Groovy son opcionales, sólo es necesario escribir el nombre del parámetro. El uso de closures es tan común, que si no se ha definido un parámetro específico de todos modos estará disponible una variable it que representa el valor del parámetro.
def printOut = {item -> print item}
(0..9).each(printout)


-----------------------------------------------


def printOut = {print it}
(0..9).each(printout)
La implementación de las closures implica un gran avance en el mundo de la programación, ya que no es necesario crear un nuevo método fuera del actual pudiendo utilizar las variables locales del actual.

  1. Expresiones regulares
Como muchos lenguajes de scripting, Groovy también ofrece la posibilidad de utilizar expresiones regulares, es decir, declarar y utilizar dichas expresiones sin necesidad de construcciones complexas o añadir sintaxis adicionales a las construcciones básicas del lenguaje.

Basta con declarar la expresión de búsqueda entre barras diagonales y usar uno de los tres operadores disponibles:
  • =~ búsqueda de ocurrencias   
  • ==~ coincidencias   
  • ~ patrón  
def text = “At school, Harry had no one. Everybody know


that Dudley’s gang hated that odd Harry


Potter” + “ in his baggy old clothes and
broken glasses, and nobody liked to disagree


with Dudley’s gang.”


matcher = (text =~ /Harry Potter/)


-----------------------------------------------


matcher = (text ==~ /Harry/)


-----------------------------------------------


matcher = (text ~ /H.*y/) 

  1. POJOs to POGOs
En los últimos años Sun a dominado el sector de JavaBeans gracias al resurgimiento de los  POJOs (Plain Old Java Objects), es decir, un subconjunto de la convención JavaBeans. Los  POJOs son un subconjunto puesto que los JavaBeans deben notificar cualquier cambio que se realice en alguna de sus propiedades, mientras que los POJOs no lo hacen. Spring y Hibernate no dudaron sobre las ventajas de uso, y no tardaron en incorporarlo en su implementación. El único pero que tenían los  POJOs era su complicada implementación, este apartado fue resuelto gracias a que algunos Ambientes de Desarrollo Integrados (IDE) comenzaron a proporcionar herramientas para generar este tipo de código.

Pero los POGOs van más allá, simplemente con declarar las propiedades según la convención, los métodos de acceso se generarán. Dichas propiedades se declaran con tipo  y nombre, sin modificador de acceso, ya que de tenerlo dejan de ser una propiedad para pasar a ser un campo.

La creación de  POGOs implica una definición de un  POGO propiamente dicho, la definición de cómo mínimo 1 propiedad y campos. En el momento de la creación descubrimos otra de las ventajas de Groovy, en el momento de la llamada al constructor mediante un mapa extendido debido a que Groovy anexa un constructor por omisión a los POGOs. En el momento del acceso a campos se puede realizar mediante el operador ‘.’ o ‘[]’ lo cuál hace que parezca que se ha roto la encapsulación del POGO, pero en realidad es todo lo contrario, ya que existe la posibilidad  de obtener y modificar el valor de un campo mediante el operador ‘.@’ que tampoco rompe la encapsulación.
class Person{
    String name  #Property
    String firstName #Property
    private int id  #Field
    String toString() {“${name} ${firstName}”}
}


Person person = new Person(name:’Matthew’, firstName:’McMag’)
assert “Matthew McMag” == person.toString()
person.firstName = “McGam”
assert “Matthew McGam” == person.toString()
person[‘firstName’] = “McMag”
assert “Matthew McMag” == person.toString()


assert person.name == “Matthew”
assert person.@name == “Matthew”
assert person.completName == “Matthew McMag”


try{
    assert person.completName == “Matthew McMag”
}match(MissingFieldException e){
    println “Error, completName isn’t a field
Gracias a los  POGOs podemos descubrir otra de las peculiaridades de Groovy, es el segundo lenguaje, después de Java, que soporta anotaciones, aunque el soporte para tipos genéricos aún está en desarrollo.
class Person{
    @BoundProperty String name
    @BoundProperty String firstName
}

  1. Desarrollo web con Groovy
Como pequeña introducción en el desarrollo web con Groovy antes de las definiciones y ejemplos de  Grails, introduciremos el sustituto de los  Servlets de  Java por los  Groovlets. La simplicidad de código y la posible inclusión de tags de html en el mismo código en Groovy representa grandes ventajas que los Servlets no disponen. A continuación introducimos un ejemplo de un Groovlet ya que es la forma más sencilla de entender este tipo  de implementación.
import java.util.Date


if (session == null) {
    session = request.getSession(true);
}


if (session.counter == null) {
    session.counter = 1
}


println """
<html>
    <head>
         <title>Groovy Servlet</title>
    </head>
    <body>   
        Hello, ${request.remoteHost}: ${session.counter}! ${new Date()}
    </body>
</html>
"""
session.counter = session.counter + 1 
Leer más...

12.4.10

Groovy on Grails (I): Introducción

En los últimos años Internet ha ido evolucionando poco a poco hacia un entorno colaborativo entre usuarios, hasta llegar a la actualidad y a la Web 2.0, donde el entorno colaborativo ha culminado con la aparición de Blogs, Wikis, el e-commerce, … Esto último implica el estudio e investigación de nuevas tecnologías que hagan más sencillo el desarrollo de nuevas aplicaciones web tanto para el desarrollador como para el usuario llano.

El desarrollo de frameworks web ha ido evolucionando constantemente, desde los struts, framework que implementa el patrón de arquitectura Modelo Vista-Controlador en Java, hasta, por ejemplo, “Groovy on Grails”, buscando siempre una simplificación de código pero sin comprender una reducción de la calidad del producto final.


El problema abordado por este proyecto es la creación de una aplicación web de e-commerce, concretamente una tienda virtual de mascotas, utilizando la nueva tecnología basada en Groovy, Grails. Para la implementación de esta aplicación han sido necesarios varios estudios previos de cada una de las tecnologías que comprenden el mundo de “Groovy on Grails”, los cuales podriamos dividir en:
  • Estudio del lenguaje de programación Groovy
  • Estudio del framework basado en Groovy, Grails
  • Análisis, diseño e implementación de la aplicación web propiamente dicha
Groovy como lenguaje de programación


El 2 de Enero de 2007 aparecía la versión 1.0 de Groovy, un nuevo lenguaje de programación orientado a objetos desarrollado por Guillaume Laforge, Jefe de Proyecto y JSR-241 Spec Lead.
La implementación de Groovy se realiza sobre la plataforma Java además, tiene características similares a Python, Ruby, Perl y Smalltalk. Gracias a la especificación JSR-241, se busca su estandarización para una futura inclusión como componente oficial de la plataforma Java.
Groovy utiliza una sintaxis muy parecida a Java, compartiendo el mismo modelo de objetos, de hilos y de seguridad. Mediante importaciones, Groovy puede acceder a todas las API de Java ampliando la compilación, ya que el bytecode generado es totalmente compatible con el que Java genera para la Java Virtual Machine.


Para Groovy, Java no es un lenguaje incompatible con su código, todo lo contrario, todo el código escrito en Java es válido en Groovy. Este aspecto hace su aprendizaje mucho más sencillo a programadores Java que otros lenguajes que se ejecutan sobre la Java Virtual Machine, como Jython o Jruby

Java es totalmente compatible con Groovy, pero esto no hace que Groovy pierda todas las ventajas de un lenguaje de scripting, ya que también se puede ejecutar de forma dinámica. Por ejemplo, en Java la salida estándar de “Hello World” hace necesaria la escritura de una clase, un método main con una serie de argumentos, etc… Pero en Groovy, no es necesario escribir todo el código, te puedes ahorrar la declaración de la clase y el método main, y sólo escribir una línea de código que muestre por pantalla “Hello World”.
El contenido del archivo HelloWorld.groovy sería:
println “Hello World”
Como podemos observar, el dinamismo de un lenguaje de scripting se encuentra presente en Groovy, pero, ¿y la compatibilidad con Java?


Groovy da soporte a listas, mapas, etc… y aún podemos demostrar
la simplicidad de Groovy y su capacidad para ejecutar código en
Java:
//Printamos una fecha utilizando codigo Java
def mydate = new java.util.Date()
println mydate
//Iteración sobre un hash map
def numbersMAP = ['1':'ONE', '2':'TWO']
for (entry in numbersMAP) {
println "${entry.key} = ${entry.value}"
}
//Introducimos un rango
def range = 'a'..'d'
//Listas
def numberlist = [1, 2, 3, 4, 5, 6, 7, 8]
println numberlist;
println "Maximum value: ${numberlist.max()}"
Como podemos observar en el código, utilizamos directamente
java.util.Date y no importamos un soporte para colecciones para
trabajar con listas, mapas y rangos. Aunque no es necesario,como en el ejemplo, podemos exportar librerías Java para que el
proceso de desarrollo sea más cómodo.
En el apartado de tecnologías asociadas, profundizaremos más en
el mundo de Groovy mediante explicaciones y ejemplos.


Grails como framework Web


Grails es un framework para aplicaciones Web de libre distribución, que tiene como base el lenguaje de programación Groovy. Grails es un framework de alta productividad que viene distribuido bajo el paradigma del “código por convención” (MVC), el cuál proporciona un entorno de desarrollo independiente y unos detalles de configuración escondidos para el desarrollador.


Grails se llamó previamente “Groovy on Rails” (nombre que se le
puso en como homenaje a David Heinemeier Hansson, fundador de
Ruby on Rails, otro framework web). El trabajo de desarrollo
comenzó en Julio de 2005 que dio como fruto la versión 0.1 el 29
de Marzo de 2006 i la versión 1.0 el 18 de Febrero de 2008.


En el momento de su implementación, se estudiaron varios
conceptos a favor de Grails entre los que destacaban:
Proporcionar una alta productividad basándose en la
plataforma de Java.
  • Utilizar de manera más simple tecnologías de Java como Hibernate y Spring, mediante una interface consistente.
  • Un framework sencillo y fácil de aprender.
  • Documentación con participación de los usuarios.
  • Proporcionar simplicidad en áreas donde antes solo podían adentrarse usuarios expertos:
    • Framework persistente potente y consistente.
    • Uso sencillo pero potente de las templates de vista utilizando GSP (Páginas de Servidor Groovy).
    • Librerías de tags dinámicas para una creación de componentes web sencilla.
    • Buen soporte a Ajax pero simple de ampliar personalizar.
  • Proporcionar ejemplos de aplicaciones con los que demostrar la potencia de este nuevo framework.
  • Proporcionar un modo de desarrollo completo, incluyendo un servidor web y un sistema de carga de ficheros automática.
Dichos objetivos se han conseguido en mayor o menor grado, entre los logros más relevante, cabe destacar:
  • Framework sencillo y simple
Gracias a la implementación de Grails basandose en el paradigma del “código por convención” (MVC), se han conseguido realizar nuevas implementaciones, ya sea en la mejora del código o en su funcionalidad. Las más relevantes son:
    • Controllers: sustitutos naturales de los Servlets tal y como los conocemos, ya que siguiendo la convención de Grails crearemos una Closure de Groovy cada vez que queramos realizar una acción sobre una clase de la aplicación web. La creación de un controlador vendría dado por:
$> groovy create-controller
----------------------------------------------------
def list = {
if(!params.max) params.max = 10
[ petList: Pet.list( params ) ]
}
    • Soporte a Ajax y uso de librerías dinámicas para poder implementar plugins con el fin de facilitar la implementación de la nueva aplicación web.
  • Persistencia y alta productividad
    • La alta productividad viene dada por el uso del lenguaje de scripting Groovy como base de programación, ya que sobre este lenguaje se podría aplicar un famoso dicho, “Nunca tan poco a dado tanto”, ya que con poca cantidad de código se puede realizar una pequeña aplicación en Grails.
    • La persistencia en Grails viene dada por la simplicidad de creación de sus clases de dominio:
$> groovy create-domain-class
----------------------------------------------------
class Cart {
String status
String payment
String numberTarget
Float total
Map contentBuy=[1 : 1]
}
    • Implementación del soporte más importante para las operaciones CRUD (Create, Read, Update, Delete), el Scaffolding. Scaffolding es un método para construir aplicaciones basadas en bases de datos, esta técnica está soportada por algunos frameworks del tipo MVC en el cuál el programador escribe una especificación que describe cómo debe ser usada la base de datos. Luego el compilador utiliza esa especificación para generar el código que la aplicación usará para crear, leer, actualizar y eliminar registros de la base de datos. En Grails la activación del Scaffolding es tan sencilla como la mayoría de implementaciones en Grails.
class cartController {
scaffold = true
}
Como podemos observar, Grails es un framework potente pero a la par sencillo, ahora sólo hemos nombrado los aspectos más relevantes por lo que a continuación, en el apartado de tecnologías asociadas, profundizaremos más en el mundo de Grails mediante explicaciones y ejemplos, posteriormente realizaremos una implementación completa de una aplicación web de e-comerce.
Leer más...

11.4.10

Proximamente: Groovy on Grails

Después de mucho tiempo, me he decido a reflotar el Blog reorientando una série de posts de manera didáctica, ya que en breve comenzaré a introducir el bonito, pero complicado mundo de Groovy on Grails.

No se lo pierdan!

Leer más...