greach 2013 - todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails
DESCRIPTION
Slides de mi charla de Greach 2013: "Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails" Video de la charla: http://greach.es/sessions-2013/ivan-lopez-martin-todo-lo-que-me-hubiera-gustado-saber-cuando-empece-a-desarrollar-con-grailsTRANSCRIPT
![Page 1: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/1.jpg)
Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails
Iván López - @ilopmarIván López - @ilopmar “Oh finally, I can feel the power”
![Page 2: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/2.jpg)
● Iván López Martín @ilopmar
● Uso Grails/Groovy desde hace 3 años y Java desde hace muchos más.
● Creador de www.bokzuy.com
● Creador de plugins de grails (ducksboard-api y slug-generator)
● 3º en hackaton Grails48 con confspot.com
● Geek, Padre, Desarrollador, Sysadmin, Linuxero y Pro-Software libre
● Trabajo en Kaleidos
¿Quién soy?
![Page 3: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/3.jpg)
Agenda
![Page 4: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/4.jpg)
Si, pero esto de qué va...
Google Stack Overflow Grails-user/Blogs
Noches sin dormir
Trabajo efectivo
Tiem
po
![Page 5: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/5.jpg)
...de esto!
Google Stack Overflow Grails-user/ Blogs
Noches sin dormir
Trabajo efectivo
Porno
Tiem
po
![Page 6: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/6.jpg)
Domain
![Page 7: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/7.jpg)
● Poner toda la lógica relacionada con el objeto que estamos tratando en su clase de dominio.
● Modelos anémicos vs Modelos Ricos.
● Usar namedQueries.
● No utilizar booleanos nullables: crear enums.
● Validadores personalizados en constraints.
Domain
![Page 8: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/8.jpg)
Controllers
![Page 9: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/9.jpg)
● No poner lógica de negocio en controllers.
● Responsabilidades: - Recibir una petición. - Verificar los parámetros. - Llamar a un servicio (o varios) para obtener los datos. - Renderizar una respuesta (html, xml, json) o redirect.
● CommandObjects para data binding complejo.
● Los CommandObjects pueden heredar de otros.
Controllers
![Page 10: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/10.jpg)
Servicios
![Page 11: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/11.jpg)
● Lógica de negocio no implementada en domain.
● Si no es necesaria transaccionalidad static transactional = false
● Si es transaccional, no utilizar flush:true
● Tipos de los parámetros en los métodos y en valor de retorno.
● No closures porque no hay transaccionalidad.
● src/groovy
Servicios
![Page 12: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/12.jpg)
Vistas
![Page 13: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/13.jpg)
● KISS.
● Templates para las partes comunes de las páginas.
● Templates para elementos que se repitan.
● No intentar reutilizar templates con if's y pequeños hacks porque acaban siendo inmantenibles.
● No inyectar servicios: usar TagLib, Controller o Modelos Ricos.
Vistas
![Page 14: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/14.jpg)
TagLibs
![Page 15: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/15.jpg)
● Namespace específico para el proyecto o pluginstatic namespace = 'myNs' --> <myNs:myMethod />
● Cálculos relativamente complejos para listas con renderización común.
● Generar respuesta HTML con template.
● Un TagLib se puede llamar desde un controller con myNs.myMethod
TagLibs
![Page 16: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/16.jpg)
I18N
![Page 17: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/17.jpg)
● Política de claves para messages.properties.Por ejemplo: pantalla.módulo.objeto-del-dominio.atributo
● Agrupar las claves por pantallas.
● ¡Respetar la política definida!
● ¡En serio! :-)
● Plurales:
my.msg = {0,choice,0#No hay resultados|1#Sólo un resultado|1<{0} resultados}
<g:message code='my.msg' args="[numResults]" />
I18N
![Page 18: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/18.jpg)
URL Mappings
![Page 19: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/19.jpg)
● Usar namedUrls.
● Filtrar los métodos aceptados (GET, POST,...) en url y no en static allowedMethods: 404 en lugar de 405.
name oneProposal: "/proposal/$proposalId" { controller = 'proposal'; action = [GET:'showProposal', POST:'updateProposal']}
<g:link mapping="oneProposal" params="[proposalId:entry.id]">
redirect mapping:'oneProposal',params:proposalId:proposal.id]
url = grailsLinkGenerator.link(absolute:true, mapping:'oneProposal', params:[proposalId:timeline.id])
URL Mappings
![Page 20: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/20.jpg)
Tests
![Page 21: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/21.jpg)
● Hay que hacer tests, obvio ¿no? ;-)
● Spock.
● Servidor de Integración Continua: p.e. Jenkins.
● Plugins Fixtures y Build Test Data.
● Mejor Test Unitarios son más rápidos pero hay que mockear más.
● Usar BD final y no H2 en Integración.
● Vistas difíciles de testear, aproximación en Integración con controllers que hacen render template.
Tests
![Page 22: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/22.jpg)
Configuración
![Page 23: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/23.jpg)
● Utilizar correctamente los entornos en Config.groovy.● No subir a control de versiones archivos con configuración personal (usuarios, contraseñas,...). DataSource.groovy DataSource.groovy.sample→
● Crear archivo properties (aunque esté vacío inicialmente) para cambiar parámetros generar un nuevo war (p.e: producción).En Config.groovy:grails.config.locations = ["classpath:myconfig.properties"]
● No ejecutar grails install-plugin xxxxx, definir la dependencia en BuildConfig.groovy
Configuración
![Page 24: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/24.jpg)
Logs
![Page 25: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/25.jpg)
● Es necesario que haya logs en la aplicación.
● No hay nada más frustante que una aplicación en producción en la que falla y no tenemos información en los logs para analizar el error.
● println está prohibido. Mejor log.debug, log.info,...
● Política de severidad de los mensajes y respetarla.
● Configurar por entorno el nivel mínimo de log mostrado.
Logs
![Page 26: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/26.jpg)
Apps complejas
![Page 27: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/27.jpg)
● La clave es Modularizar.
● El core en plugin común con clases de dominio y servicios comunes.
● Una aplicación diferente por “funcionalidad”: - Página web - Página para dispositivos móviles - API
● En estas aplicaciones importar el plugin inline.
Apps complejas (I)
![Page 28: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/28.jpg)
● Ventajas: - Distribuir la carga. - Separación clara de funcionalidades.● Inconvenientes: - Más consumo de memoria - Aplicación más compleja - Despliegues más complejos - Ejecución de tests en varios proyectos ● ¡Aún así merece la pena!
Apps complejas (II)
![Page 29: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/29.jpg)
Miscelánea
![Page 30: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/30.jpg)
● Relaciones xxx-to-many “automáticas” o “a mano”.● Filtrar siempre que sea posible en la base de datos:def data = User.list().find { it.name == 'pepe' } // No def data = User.findAllByName('pepe') // Sídef data = User.findAllByName('pepe', [cache:true])
● Igual para obtener sólo el primer elemento, el último, los 3 últimos,...def data = (Company.list() as List).first() // Nodef data = Company.withCriteria { // Sí order('date', 'desc') maxResult(1) cache true // si queremos cachear}
● Métodos específicos que hagan con count en la bd en lugar de list.size()
Rendimiento
![Page 31: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/31.jpg)
Scaffolding
![Page 32: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails](https://reader034.vdocuments.site/reader034/viewer/2022042521/559458401a28ab4c2f8b471f/html5/thumbnails/32.jpg)
““Un gran poder conlleva una gran Un gran poder conlleva una gran responsabilidad”responsabilidad”
http://lopezivan.blogspot.comhttp://lopezivan.blogspot.com
@ilopmar@ilopmar
https://github.com/lmivanhttps://github.com/lmivan
Iván López MartínIván López Martín
Benjamin Parker (Tío Ben)Benjamin Parker (Tío Ben)
[email protected]@gmail.com