Taller	  de	  DSLs	  en	  Groovy	                               Alberto Vilches                  http://albertovilches.com...
QUÉ ES UN DSL   DSL = Lenguaje con un propósito                  VSGPS = lenguaje con múltiples propósitos
XML, EL ANTEPASADO DEL DSL EN JAVA•  ejb-jar.xml  –  Define la estructura para desplegar EJBs en SA•  struts-config.xml  –...
CARACTERÍSTICAS DE UN DSL•  Sintaxis específica•  Limitados en ámbito y   capacidad•  Pequeños y simples
POR QUÉ SON ÚTILES•  Contextuales•  Más expresivos = más claros•  Mejor usar varios DSL que un único   GPL
CUANDO USARLOS•  Lógica o reglas de negocio   cambian a menudo•  Solución separada del resto del   código de la aplicación
TIPOS DE DSL•  Externos     •  Los usamos día a día desde hace tiempo•  Internos     •  Viven entre nosotros
TIPOS DE DSL: EXTERNOSCómo definen su formato y sintaxis:Aprovechan una sintaxis existente como XML…   …o poseen su propio...
EJEMPLOS DE DSLS EXTERNOS       Cascading Style Sheet
EJEMPLOS DE DSLS EXTERNOS    Script Apache Ant (XML)
EJEMPLOS DE DSLS EXTERNOS•  Structured   Query   Language•  Expresiones regulares            Patrón para buscar emails
EJEMPLOS DE DSLS EXTERNOSDSL         Dominio                     UsoSQL         BBDD                        Consulta y man...
TIPOS DE DSL: INTERNOS•  Se hospedan en un GPL para   describirlos•  Aprovechan el compilador/intérprete•  Reutilizan part...
DSLS INTERNOS GRAILSConfig.groovy / DataSource.groovy
DSLS INTERNOS GRAILS   UrlMappings.groovy
DSLS INTERNOS GRAILS  Criteria, Hibernate, SQL
DSLS INTERNOS GRAILS       GORM
QUÉ DEFINE UN DSL•  Contexto   –  El dominio está implícito porque…   –  … sistema, autor y lector saben de qué se está   ...
SINTAXIS FLUIDA•  Primera aproximación           “Method chaining”    Todos los métodos devuelven this
METHOD CHAINING•  Javascript jQuery
METHOD CHAINING•  Javascript   jQuery•  Contextual, ligeramente extensible
METHOD CHAINING•  Apache Commons CLI
METHOD CHAINING                  	       No	  vale	  siempre	  (aunque	  es	  mejor	  que	  nada)	                    	   ...
EJEMPLO: SIN CONTEXTO•  ¿Construcción o reutilización de recursos?•  ¿Importa el orden? ¿Qué hago si falla?
EJEMPLO: METHOD CHAINING•  Único objeto, única línea, único contexto•  ¿Control de errores y recursos?
SOLUCIÓN: DSL•  DSL                  API vs                           DSL
DSLS EXTERNOS•  Jet Brains Metra Programming System   http://www.jetbrains.com/mps/index.html•  Eclipse Modeling Framework...
DSLS INTERNOS•  No	  todos	  los	  lenguajes	  lo	  permiten	     facilmente	  •  Metraprogramación	  es	  esencial	      ...
GROOVY•  Lenguaje dinámico para JVM   –  Atributos y métodos se resuelven en Runtime   –  Meta Object Protocol (MOP)   –  ...
SCRIPTS
COLECCIONES
ALGUNAS MEJORAS             Getters             Setters             Constructores               con mapas             Paré...
EXPANDOMETACLASS•  Se pueden añadir métodos/atributos a   cualquier clase•  ¡Incluso reescribir!•  y mucho más..
CATEGORIES•  Sobreescritura de métodos temporal
SOBRECARGA DE OPERADORES
CALL() SHORTHAND•  Se puede invocar a   cualquier objeto   como si fuera un   método•  Solo es necesario   implementar cal...
MOP•  Se pueden capturar las llamadas a   métodos que no existen
CLOSURESJavaGroovy
CLOSURES•  Variables invocables como métodos•  Atributos invocables como métodos
CLOSURES•  Owner: instancia donde se crea el   closure•  Delegate: contexto donde se ejecuta el   closure                 ...
CLOSURES•  El contexto por defecto es owner•  Accediendo a variable de owner   funciona                            þ
CLOSURES•  El contexto por defecto es owner•  Accediendo a variable de otro sitio   NO funciona               þ          ...
CLOSURES•  Contexto nuevo (delegate): config•  Accediendo a variable del contexto SI   funciona                           ...
CLOSURES•  With simplemente cambia el contexto
ESTRUCTURAS PERSONALIZADAS•  En un método dado, si el último parámetro es un   closure, se puede dejar fuera del paréntesi...
MI PRIMER DSL
MI PRIMER DSL
MI PRIMER DSL
MI PRIMER DSL
DSL EN UN SCRIPTsrc/script.groovy
PERO…
PERO…
PERO…
PERO…
BUILDER SUPPORT•  Los builders procesan DSLs mediante   eventos•  La clase BuilderSupport nos permite   crear nuestros pro...
BUILDER SUPPORT
MARKUP BUILDER
SWING BUILDER
JMX BUILDER•  Creando un cliente JMX•  Exportando un objeto mediante JMX
ANT BUILDER
GANT•  http://gant.codehaus.org/
GRIFFON•  http://griffon.codehaus.org/
EASYB•  http://www.easyb.org/download.html
GRADLE•  http://gradle.org/
GMETRICS•  http://gmetrics.sourceforge.net/
SPOCK•  http://code.google.com/p/spock/
Taller!	  
Upcoming SlideShare
Loading in...5
×

Taller DSLs en Groovy - SpringIO 2011

1,588

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,588
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
24
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Taller DSLs en Groovy - SpringIO 2011

  1. 1. Taller  de  DSLs  en  Groovy   Alberto Vilches http://albertovilches.com Twitter @albertovilches
  2. 2. QUÉ ES UN DSL DSL = Lenguaje con un propósito VSGPS = lenguaje con múltiples propósitos
  3. 3. XML, EL ANTEPASADO DEL DSL EN JAVA•  ejb-jar.xml –  Define la estructura para desplegar EJBs en SA•  struts-config.xml –  Mapea las acciones y forms del fw MVC Struts•  spring-config.xml –  Define cómo crear e inyectar objetos en LC Spring
  4. 4. CARACTERÍSTICAS DE UN DSL•  Sintaxis específica•  Limitados en ámbito y capacidad•  Pequeños y simples
  5. 5. POR QUÉ SON ÚTILES•  Contextuales•  Más expresivos = más claros•  Mejor usar varios DSL que un único GPL
  6. 6. CUANDO USARLOS•  Lógica o reglas de negocio cambian a menudo•  Solución separada del resto del código de la aplicación
  7. 7. TIPOS DE DSL•  Externos •  Los usamos día a día desde hace tiempo•  Internos •  Viven entre nosotros
  8. 8. TIPOS DE DSL: EXTERNOSCómo definen su formato y sintaxis:Aprovechan una sintaxis existente como XML… …o poseen su propio compilador/interprete… …o son diseñados con una herramienta
  9. 9. EJEMPLOS DE DSLS EXTERNOS Cascading Style Sheet
  10. 10. EJEMPLOS DE DSLS EXTERNOS Script Apache Ant (XML)
  11. 11. EJEMPLOS DE DSLS EXTERNOS•  Structured Query Language•  Expresiones regulares Patrón para buscar emails
  12. 12. EJEMPLOS DE DSLS EXTERNOSDSL Dominio UsoSQL BBDD Consulta y manipulaciónExpresión Cadenas de texto Búsqueda por patronesregularCSS Estilo (fuentes, colores, Cambiar la presentación de tamaños, etc) un HTMLAnt Recursos (clases y otros Compilación y generación ficheros) de artefactos JAR,WAR
  13. 13. TIPOS DE DSL: INTERNOS•  Se hospedan en un GPL para describirlos•  Aprovechan el compilador/intérprete•  Reutilizan parte de la sintaxis•  Heredan las limitaciones del lenguaje anfitrión
  14. 14. DSLS INTERNOS GRAILSConfig.groovy / DataSource.groovy
  15. 15. DSLS INTERNOS GRAILS UrlMappings.groovy
  16. 16. DSLS INTERNOS GRAILS Criteria, Hibernate, SQL
  17. 17. DSLS INTERNOS GRAILS GORM
  18. 18. QUÉ DEFINE UN DSL•  Contexto –  El dominio está implícito porque… –  … sistema, autor y lector saben de qué se está hablando•  Estructura, gramática, sintaxis es: –  Reducida è fluida è agrupada è encadenada
  19. 19. SINTAXIS FLUIDA•  Primera aproximación “Method chaining” Todos los métodos devuelven this
  20. 20. METHOD CHAINING•  Javascript jQuery
  21. 21. METHOD CHAINING•  Javascript jQuery•  Contextual, ligeramente extensible
  22. 22. METHOD CHAINING•  Apache Commons CLI
  23. 23. METHOD CHAINING   No  vale  siempre  (aunque  es  mejor  que  nada)     •  No  es  fácil  anidar   •  Todo  en  una  misma  línea  
  24. 24. EJEMPLO: SIN CONTEXTO•  ¿Construcción o reutilización de recursos?•  ¿Importa el orden? ¿Qué hago si falla?
  25. 25. EJEMPLO: METHOD CHAINING•  Único objeto, única línea, único contexto•  ¿Control de errores y recursos?
  26. 26. SOLUCIÓN: DSL•  DSL API vs DSL
  27. 27. DSLS EXTERNOS•  Jet Brains Metra Programming System http://www.jetbrains.com/mps/index.html•  Eclipse Modeling Framework Project http://www.eclipse.org/modeling/emf/•  Microsoft DSL Tools Visualization&Modeling SDK http://code.msdn.microsoft.com/DSLToolsLab•  XML•  ANTLR http://www.antlr.org/
  28. 28. DSLS INTERNOS•  No  todos  los  lenguajes  lo  permiten   facilmente  •  Metraprogramación  es  esencial   •  Ruby   •  Groovy  
  29. 29. GROOVY•  Lenguaje dinámico para JVM –  Atributos y métodos se resuelven en Runtime –  Meta Object Protocol (MOP) –  Genera clases 100% Java•  Sintaxis Java + sintaxis específica para colecciones + otras ideas de Ruby, Python, Smalltalk•  Closures, scripts, sobrecarga operadores, MOP, Gstrings, Categorías, metaClass
  30. 30. SCRIPTS
  31. 31. COLECCIONES
  32. 32. ALGUNAS MEJORAS Getters Setters Constructores con mapas Paréntesis y corchetes Opcionales No primitivos
  33. 33. EXPANDOMETACLASS•  Se pueden añadir métodos/atributos a cualquier clase•  ¡Incluso reescribir!•  y mucho más..
  34. 34. CATEGORIES•  Sobreescritura de métodos temporal
  35. 35. SOBRECARGA DE OPERADORES
  36. 36. CALL() SHORTHAND•  Se puede invocar a cualquier objeto como si fuera un método•  Solo es necesario implementar call()
  37. 37. MOP•  Se pueden capturar las llamadas a métodos que no existen
  38. 38. CLOSURESJavaGroovy
  39. 39. CLOSURES•  Variables invocables como métodos•  Atributos invocables como métodos
  40. 40. CLOSURES•  Owner: instancia donde se crea el closure•  Delegate: contexto donde se ejecuta el closure þ•  Por defecto es la misma (delegate = owner)
  41. 41. CLOSURES•  El contexto por defecto es owner•  Accediendo a variable de owner funciona þ
  42. 42. CLOSURES•  El contexto por defecto es owner•  Accediendo a variable de otro sitio NO funciona þ ý
  43. 43. CLOSURES•  Contexto nuevo (delegate): config•  Accediendo a variable del contexto SI funciona þ
  44. 44. CLOSURES•  With simplemente cambia el contexto
  45. 45. ESTRUCTURAS PERSONALIZADAS•  En un método dado, si el último parámetro es un closure, se puede dejar fuera del paréntesis que engloba los parámetros de la llamada
  46. 46. MI PRIMER DSL
  47. 47. MI PRIMER DSL
  48. 48. MI PRIMER DSL
  49. 49. MI PRIMER DSL
  50. 50. DSL EN UN SCRIPTsrc/script.groovy
  51. 51. PERO…
  52. 52. PERO…
  53. 53. PERO…
  54. 54. PERO…
  55. 55. BUILDER SUPPORT•  Los builders procesan DSLs mediante eventos•  La clase BuilderSupport nos permite crear nuestros propios builders•  Admite cualquier nombre de método y combinación de parámetros
  56. 56. BUILDER SUPPORT
  57. 57. MARKUP BUILDER
  58. 58. SWING BUILDER
  59. 59. JMX BUILDER•  Creando un cliente JMX•  Exportando un objeto mediante JMX
  60. 60. ANT BUILDER
  61. 61. GANT•  http://gant.codehaus.org/
  62. 62. GRIFFON•  http://griffon.codehaus.org/
  63. 63. EASYB•  http://www.easyb.org/download.html
  64. 64. GRADLE•  http://gradle.org/
  65. 65. GMETRICS•  http://gmetrics.sourceforge.net/
  66. 66. SPOCK•  http://code.google.com/p/spock/
  67. 67. Taller!  
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×