greach 2013 - todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

32
Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails Iván López - @ilopmar Iván López - @ilopmar “Oh finally, I can feel the power”

Upload: ivan-lopez

Post on 02-Jul-2015

4.681 views

Category:

Technology


1 download

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-grails

TRANSCRIPT

Page 1: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

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

● 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

Agenda

Page 4: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

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

...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

Domain

Page 7: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

Controllers

Page 9: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

Servicios

Page 11: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

Vistas

Page 13: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

TagLibs

Page 15: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

I18N

Page 17: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

URL Mappings

Page 19: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

Tests

Page 21: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

Configuración

Page 23: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

Logs

Page 25: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

Apps complejas

Page 27: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

● 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

Miscelánea

Page 30: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

● 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

Scaffolding

Page 32: Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrollar con grails

““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