Reutilizar un custom validator en Grails

En estos momentos ando colaborando con Sergio del Amo en un producto propio para su empresa Softamo, un producto que estamos desarrollando con Grails.

El tema es que teníamos un puñado de clases de dominio que están relacionadas con un propietario, una clase User. Cada instancia de esa clase de dominio debía tener un nombre único por propietario, por lo que debíamos usar un custom validator. Al final, tras varias refactorizaciones llegamos a una solución que creo que quedó bastante elegante.

Las clases de dominio heredan de una clase padre con varios métodos comunes, además de una clausura estática que contiene la lógica de la validación uniqueByUser, que es lo que nos interesa para esto.

static uniqueByUser = { value, object ->
   propertyName = propertyName[0].toUpperCase() + propertyName[1..propertyName.size()-1]
   def methodName = "findByUserAnd${propertyName}"
   def obj = object.class."$methodName"(object.user, value)
   if(obj && (obj.id != object.id)) {
     return 'unique'
   }
}

Vale, por si no queda del todo claro, intento detallar que hace el código:

  • propertyName, es el nombre de la propiedad/atributo sobre la que se ejecutará la validación, variable que está implícita en la clausura.
  • propertyName[0].toUpperCase() + propertyName[1..propertyName.size()-1], ponemos en mayúscula el primer carácter del nombre del atributo (por ejemplo "name" pasa a "Name").
  • def methodName = "findByUserAnd${propertyName}", ponemos el método al que vamos a llamar para saber si ya existe un valor con mismo usuario y atributo buscado (por ej: findByUserAndName).
  • def obj = object.class."$methodName"(object.user, value), ejecutamos ese findBy* estático sobre la clase del objeto instanciado que se está validando, pasándole el usuario relacionado y el valor del atributo (algo que podría ser equivalente por ejemplo a Drink.findByUserAndName(drink.user, "vodka")).
  • if(obj && (obj.id != object.id)), comprobamos que si se devuelve un valor, no sea el mismo que la instancia del actual.
  • return 'unique', en este caso devolvemos el código de mensaje de validación como unique, por lo que aprovecharemos los mismos mensajes i18n del unique estándar de grails.

Entonces, en nuestras clases de domino que hereden de ahí, para el atributo donde queramos utilizar ese constraint simplemente deberemos indicar validator: uniqueByUser. Algo como:

static constraints = {
   name blank: false, validator: uniqueByUser
   description blank: false
}

Lo único que no contempla ahora mismo esta solución es tener más de un custom validator, principalmente porque no nos ha hecho falta. Si lo llegamos a necesitar, veremos como lo hacemos, claro :P.

Mejoras y propuestas bienvenidas.

ACTUALIZACIÓN: Mejor que darle tantas vueltas como hicimos nosotros, es utilizar el soporte multi-column de la constraint unique (Nota mental: No dar por supuestas según que cosas, e ir a verlo a la documentación). Gracias al comentario de @jneira.

Open Space. Código como Expresión.

Este fin de semana estuve en Valencia en el open space convocado por agilismo.es, que llevaba por nombre Código como Expresión. La verdad que hacía tiempo que me apetecía asistir a un open space exclusivo sobre código, además de volver a visitar Valencia, conocer un poco la escena de desarrolladores y ver las oficinas de beCode (aún tengo pendiente pasar unos días con ellos).

Finalmente fui desde Zaragoza con Miguel Ángel Baztan y Fernando Pérez, 2 de los habituales del grupo Agile Aragón. En el evento también había gente llegada desde Castellón, Madrid, Segovia... incluso Pepe que se pegó una auténtica paliza de viajes desde Santiago de Compostela. Entre unos y otros, estuvimos algo más de 30 personas.

A niveles generales, me gustó bastante el evento, salvo un par de detalles/sensaciones que tuve durante algunos debates. He intentado hacer un pequeño resumen de cada sesión, pero por el formato del evento y mi torpeza, no he sido capaz.

Tablón. Open Space Código como Expresión

¿De qué se habló?, en las conversaciones y debates que estuve yo:

  • De la (poca) expresividad de las APIs REST, aunque para exponer e integrar sistemas diferentes, hasta el momento, es habitualmente la mejor alternativa.
  • Del spaghetti code relacionado con el uso de javascript asíncrono y algunas buenas prácticas para mejorar ese código.
  • De lenguajes y paradigmas de programación (orientado a objetos, funcional, procedimental); y como conocer varias opciones nos hacen enfocar soluciones desde más puntos de vista.
  • De la nomenclatura y expresividad en los tests. De frameworks de testing tipo BDD para diferentes lenguajes.
  • De identación y comentarios en el código.
  • De herramientas: IDEs, editores, tableros tipo kanban, software para hacer pair programming...

Os dejo las fotos que ha publicado Emma del evento.

#Developars: Miriam Muros

-Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?…

Soy Miriam Muros (@miriammuros) y soy de Madrid. Siempre he vivido en Madrid aunque estoy deseando vivir en otros lugares. Ahora mismo dedico mi tiempo a diferentes proyectos propios. Soy freelance, desarrollando algunos proyectos propios que espero que vean pronto la luz, intento levantar un centro de coworking y en ocasiones hago de advisor para otros proyectos. Pero en mi curriculum están empresas como Tuenti y Grupo Prisa.

- ¿Desde cuando y cómo te picó el gusanillo de la informática?

Recuerdo tener un ordenador en casa desde siempre, y estar trasteando con el. Jugar a Prince of persia y siempre perder por lo que en los ratos que me aburría lo dedicaba a otras cosas. Pero a programar y a saber que realmente este era mi campo, a los 12 años, cuando realicé mi primera web! Y desde entonces ya sabía a que me iba a dedicar en el futuro.

- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?

Aunque mucha gente me critique por decir esto: php. Todo el mundo se mete con el porque no es un lenguaje estructurado, y blabla, pero se olvidan de que todas las grandes empresas de internet que han triunfado prácticamente todas tenían base en php y de echo, es de lo que más se pide trabajo… por algo será! y.. aparte de php, javascript ;) Soy una programadora web en toda regla!

- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones…)

Netbeans, git, jquery, firebug, vi creo que no podría vivir sin estos cinco...

- Recomienda alguna lectura técnica que no nos deberíamos perder.

He de decir que no soy una gran lectora sobre todo de lecturas técnicas, me parece que no tiene mucho sentido leer un libro técnico de principio a fin, ya que realmente son manuales, y los manuales sirven para instruirte en los puntos que tu necesitas ;) pero… ya que me lo preguntáis… The pragmatic programmer

- Añade lo que quieras.

Invito a todas las chicas developars, a que entren en BetaBeers, es una reunión de programadores para hablar de programación y de proyectos que se realiza cada mes y están por casi toda España! Es muy interesante, e incluso ahora han empezado a hacer concursos de programación, y... me gustaría no ser siempre la única chica! :D

#Developars: Lucía Manescau

- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?...

Soy Lucía Manescau García, tinerfeña de 31 años (aunque nací en Las Palmas de Gran Canaria, pero vivo en Tenerife desde los 3 añitos) e Ingeniera Superior Informática por la Universidad de La Laguna. Actualmente trabajo en GMR Canarias, una empresa pública de la Consejería de Agricultura, Ganadería, Pesca y Aguas, como analista desarrolladora en Java y jefa de proyectos.

- ¿Desde cuando y cómo te picó el gusanillo de la informática?

La verdad es que siempre me llamó la informática. Tengo incluso una curiosa foto a los 5 añitos frente a un ordenador, un MSX, que lo demuestra :), y recuerdo también, pocos años después, incluso hacer mis pinitos con el DOS. Pero la decisión final de estudiar informática llegó algo tarde. Curiosamente, hasta COU (sí, soy del viejo sistema, e incluso lo digo con orgullo jeje), estaba decidida a estudiar Bellas Artes, una carrera bastante diferente, lo admito. Pero cuando en COU nos llevaron a visitar las facultades, quedé prendada por informática, y en ese último año cambié de opinión y me matriculé en informática. Aunque los primeros años fueron algo decepcionantes (me faltaba verle la parte práctica), cuando empecé a hacer la Ingeniería Superior empecé a ilusionarme más y ,una vez trabajando, me di realmente cuenta de que la decisión había sido la correcta, hasta convertirme en una apasionada de mi trabajo.

- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?

Sin duda alguna, Java. Realmente me encanta trabajar con ese lenguaje. Me resulta muy práctica las posibilidades que da para la estructuración de los programas, para su modularización, me resulta muy sencillo en ese lenguaje entender la abstracción (lo cual en si puede parecer una frase algo rara, pero, no se por qué, en Java lo veo más claro que en otros lenguajes),... en definitiva, me siento cómoda y más imaginativa trabajando en Java. Además, otra gran ventaja que pienso que tiene, son la cantidad de frameworks y librerías que hay en ese lenguaje, la cantidad de colaboración que permite entre desarrolladores, lo cual, en los tiempos que corren, creo que es indispensable, pues ha quedado más que claro que el sistema completamente cerrado de "yo programo mis cosas y que nadie sepa como las he hecho ni pueda trabajar sobre ellas" ya no sirve (si hasta Apple, que siempre abogó por sistemas cerrados, tuvo que dejar abierta la posibilidad de que programas de desarrolladores externos se pudieran ejecutar en sus sistemas como el IPad, sería ilógico que otras empresas o desarrolladores siguieran pensando que los sistemas cerrados tienen futuro).

- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones...)

Como IDE soy completamente fan de Eclipse, y especificando más, de MyEclipse (que vale que tiene la desventaja de ser de pago, pero siendo sincera entre uno y otro no hay color). En cuanto a frameworks me gusta mucho Spring, porque cubre una gran cantidad de necesidades del desarrollo y lo facilita muchísimo (el uso de anotaciones con Spring, desde que empecé a utilizarlo, me pareció una verdadera gozada :) ), además de permitir una muy cómoda integración con otras herramientas como JUnit a la hora de hacer los tests unitarios (aunque en este aspecto he de confesar que hace poco, gracias a una charla de Yeray Darias, conocí los Specs de Scala, y me han dado muchas ganas de ahondar más en ellos, pues me ha parecido que tienen muy buena pinta ). No me gustaría terminar este apartado sin nombrar por una parte Maven, que me parece una herramienta realmente genial y completa tanto para el tratamiento de librerías, como para empaquetar, deployar o publicar librerías propias; por otra parte Git como control de versiones pues, aunque el paso de SVN a Git cuesta un poco por tener que "cambiar el chip", la gran utilidad de poder controlar tus propios versionados, tus propias ramas, me encanta; y por último las herramientas de Atlassian (Jira, GreenHopper, Fisheye, Crucible), que pienso que facilitan muchísimo la organización de proyectos.

- Recomienda alguna lectura técnica que no nos deberíamos perder.

Si tuviera que recomendar alguna lectura, me decantaría por "Java Puzzlers", quizá no tanto porque enseñe en sí, ni desde luego por ser novedoso, sino porque te hace pensar un poquito más allá de aquellas cosas con las que te enfrentas diariamente como desarrollador, y te hace plantearte si a veces no nos adentramos lo suficiente en qué está haciendo realmente nuestro código. De todas formas, lo que realmente recomendaría como lectura es Google, y con esto me refiero a búsquedas continuas, a estar pendiente de qué es lo nuevo que sale, de qué nuevas posibilidades tenemos,... Desde mi punto de vista, más importante que "una lectura obligatoria", es no dejar de leer nunca.

- Añade lo que quieras.

En este apartado, en primer lugar, me gustaría darte las gracias Daniel por esta iniciativa de "developars", porque creo que las mujeres desarrolladoras en parte somos como las meigas, "haberlas haylas", aunque muchas veces estemos algo más escondidas, seguramente porque siendo sincera seguimos siendo minoría. Pero la pasión por la informática no tiene sexo, o la sientes o no la sientes :). Yo personalmente me siento afortunada por sentirlo, por disfrutar por mi trabajo, por que me nazca gritar un "ole, ole" mientras aplaudo cuando resuelvo un problema complejo, tengo una "idea feliz", pruebo un nuevo framework que me sorprende gratamente o veo un gran trabajo de un compañero. Sobre todo porque hace poco tuve una temporada algo de "bajón" de la que resurgí con ganas renovadas y con más pasión que nunca. De aquí ha salido mi twitter @luciamanescau (con el que aún me estoy peleando un poco :) ) y mi blog Renacer de una informática, que aunque aún esté en pañales, pues lleva poquito tiempo, espero que poco a poco vaya creciendo y madurando.

#Developars: Fátima Casaú

- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?...

Soy Fátima Casaú Pérez, extremeña, de un pueblo de Badajoz llamado Talarrubias (lo tenía que decir). Me vine a Madrid a estudiar Ingeniero Técnico en Informática y antes de terminar empecé a trabajar en Salenda, dónde continúo. En Salenda he aprendido todo lo que sé sobre desarrollo de aplicaciones web sobre la plataforma Java y sobre todo, en Groovy & Grails, además de seguir de cerca el mundo del "agilismo". Pues a eso me dedico, al desarrollo de aplicaciones web, gestiono algunos proyectos en Salenda y algo de formación.

- ¿Desde cuando y cómo te picó el gusanillo de la informática?

Pues... no sabría decir, desde siempre me ha llamado mucho la atención, quizá más atraída por los sistemas aunque, en la universidad, y sobre todo al empezar a trabajar me diese cuenta de que lo que realmente me gustaba era el desarrollo.

- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?

Pues, en un principio Java y ahora, claramente Groovy, ya que te da toda la robustez de Java pero con una sintaxis mucho más sencilla e intuitiva lo que le da una gran potencia al lenguaje.
Por otro lado, JavaScript me gusta bastante por todas las posibilidades que da del lado del cliente, más cuando nos ayudamos de algunas librerías como jQuery.

- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones...)

Cuando llego al trabajo, lo primero que hago es abrir el Chrome con el correo (Gmail), Hootsuite y Google Reader, para intentar no perderme nada, HipChat para comunicarme con todos mis compañeros, JIRA y GreenHopper para la gestión de los proyectos, y Confluence para guardar y compartir cualquier información relevante que lea o que haya que tener en cuenta para cualquier proyecto.
A la hora de desarrollar utilizo el IDE Springsource Tool Suite ya que, a día de hoy, se podría decir que es el mejor, gratuito, para el desarrollo con Groovy & Grails. Los frameworks y librerías, ya los he dicho, Groovy & Grails con todo lo que hay por debajo, Hibernate, Spring, Java.... también con JavaScript, con librerías como jQuery, YUI,.... HTML, CSS. Como sistema de control de versiones, utilizo SVN y como servidor de CI, Bamboo. Ah! y FireBug, no podría vivir sin él.

- Recomienda alguna lectura técnica que no nos deberíamos perder.

Groovy in Action :D Realmente yo leo más en blogs y twitter que en los libros.

- Añade lo que quieras.

Últimamente estoy muy interesada en el desarrollo de aplicaciones móviles, en HTML5 y CSS3.
Suelo estar presente en todos los eventos sobre TIC que puedo. También intento asistir a algunas reuniones de grupos locales como Madrid GUG (Madrid Groovy User Group), AUG Spain (Atlassian User Group of Spain) y MadridJS. En internet, me gustaría estar más presente de lo que estoy ahora mismo, pero me podéis encontrar en twitter @fatimacasau.

Por último, decir que estoy orgullosa de ser una de las pocas chicas con un perfil técnico en el mundo de la informática, aunque ojalá y fuéramos más.