Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
CREACIÓN DE DSLS CON GROOVY por Alberto Vilches http://albertovilches.com   Twitter: @albertovilches
INTRODUCCIÓN ¿QUÉ ES UN DSL?
QUÉ ES Y PARA QUÉ SIRVE <ul><li>DSL = Domain Specific Language </li></ul><ul><li>Resuelve un tipo particular de problema <...
QUÉ  NO  ES <ul><li>Lo opuesto a un DSL es: </li></ul><ul><ul><li>General Purpose Language (como Java o Erlang) </li></ul>...
XML, EL ANTEPASADO DEL DSL EN JAVA <ul><li>ejb-jar.xml </li></ul><ul><ul><li>Define la estructura para desplegar EJBs en S...
CARACTERÍSTICAS DE UN DSL <ul><li>Sintaxis específica </li></ul><ul><li>Limitados en ámbito y capacidad </li></ul><ul><li>...
PORQUÉ SON ÚTILES <ul><li>Contextuales </li></ul><ul><li>Más expresivos = más claros </li></ul><ul><li>Mejor usar varios D...
CUANDO USARLOS <ul><li>Lógica o reglas de negocio cambian a menudo </li></ul><ul><li>Solución  separada  del resto del cód...
TIPOS DE DSL <ul><li>Externos </li></ul><ul><ul><ul><li>Los usamos día a día desde hace tiempo </li></ul></ul></ul><ul><li...
TIPOS DE DSL: EXTERNOS <ul><li>Cómo definen su formato y sintaxis: </li></ul><ul><li>Aprovechan  una sintaxis  existente  ...
EJEMPLOS DE DSLS EXTERNOS <ul><li>Cascading Style Sheet </li></ul>
EJEMPLOS DE DSLS EXTERNOS <ul><li>Script Apache Ant (XML) </li></ul>
EJEMPLOS DE DSLS EXTERNOS <ul><li>Structured Query  Language </li></ul><ul><li>Expresiones regulares </li></ul><ul><ul><li...
EJEMPLOS DE DSLS EXTERNOS DSL Dominio Uso SQL BBDD Consulta y manipulación Expresión regular Cadenas de texto Búsqueda por...
TIPOS DE DSL: INTERNOS <ul><li>Se hospedan en un GPL para describirlos </li></ul><ul><li>Aprovechan el compilador/intérpre...
DSLS INTERNOS GRAILS <ul><li>Config.groovy / DataSource.groovy </li></ul>
DSLS INTERNOS GRAILS <ul><li>UrlMappings.groovy </li></ul>
DSLS INTERNOS GRAILS <ul><li>Criteria, Hibernate, SQL </li></ul>
DSLS INTERNOS GRAILS <ul><li>GORM </li></ul>
QUE HACE FALTA PARA CREAR UN DSL
QUÉ DEFINE UN DSL <ul><li>Contexto </li></ul><ul><ul><li>El dominio está implícito porque… </li></ul></ul><ul><ul><li>…  s...
SINTAXIS FLUIDA <ul><li>Primera aproximación </li></ul><ul><li>“ Method chaining ” </li></ul><ul><li>Todos los métodos dev...
METHOD CHAINING <ul><li>Javascript  jQuery </li></ul>
METHOD CHAINING <ul><li>Javascript  jQuery </li></ul><ul><li>Contextual, ligeramente extensible </li></ul>
METHOD CHAINING <ul><li>Apache Commons CLI </li></ul>
METHOD CHAINING
EJEMPLO: SIN CONTEXTO <ul><li>¿Construcción o reutilización de recursos? </li></ul><ul><li>¿Importa el orden? ¿Qué hago si...
EJEMPLO: METHOD CHAINING <ul><li>Único objeto, única línea, único contexto </li></ul><ul><li>¿Control de errores y recurso...
SOLUCIÓN: DSL <ul><li>DSL </li></ul>API vs  DSL
QUIERO CREAR UN DSL ¿INTERNO...? ¿EXTERNO…?
DSLS EXTERNOS <ul><li>Jet Brains Metra Programming System  http://www.jetbrains.com/mps/index.html   </li></ul><ul><li>Ecl...
DSLS INTERNOS
CARACTERÍSTICAS DE GROOVY (QUE LO HACEN IDEAL PARA CREAR DSLS)
GROOVY <ul><li>Lenguaje dinámico para JVM </li></ul><ul><ul><li>Atributos y métodos se resuelven en Runtime </li></ul></ul...
SCRIPTS
COLECCIONES
ALGUNAS MEJORAS <ul><li>Getters </li></ul><ul><li>Setters </li></ul><ul><li>Constructores con mapas </li></ul><ul><li>Paré...
EXPANDOMETACLASS <ul><li>Se pueden añadir métodos/atributos a cualquier clase </li></ul><ul><li>¡Incluso reescribir! </li>...
CATEGORIES <ul><li>Sobreescritura de métodos  temporal </li></ul>
SOBRECARGA DE OPERADORES
CALL() SHORTHAND <ul><li>Se puede invocar a cualquier objeto como si fuera un método </li></ul><ul><li>Solo es necesario i...
MOP <ul><li>Se pueden capturar las llamadas a métodos que no existen </li></ul>
CLOSURES Java Groovy
CLOSURES <ul><li>Variables invocables como métodos </li></ul><ul><li>Atributos invocables como métodos </li></ul>
CLOSURES <ul><li>Owner: instancia donde se crea el closure </li></ul><ul><li>Delegate: contexto donde se ejecuta el closur...
CLOSURES <ul><li>El contexto por defecto es owner </li></ul><ul><li>Accediendo a variable de owner funciona </li></ul>
CLOSURES <ul><li>El contexto por defecto es owner </li></ul><ul><li>Accediendo a variable de otro sitio  NO  funciona </li...
CLOSURES <ul><li>Contexto nuevo (delegate): config </li></ul><ul><li>Accediendo a variable del contexto  SI  funciona </li...
CLOSURES <ul><li>With simplemente cambia el contexto </li></ul>
ESTRUCTURAS PERSONALIZADAS <ul><li>En un método dado, si el último parámetro es un closure, se puede dejar fuera del parén...
COMO CREAR UN DSL
MI PRIMER DSL
 
MI PRIMER DSL
MI PRIMER DSL
DSL EN UN SCRIPT src/script.groovy
PERO…
PERO…
PERO…
PERO…
BUILDER SUPPORT <ul><li>Los builders procesan DSLs mediante eventos </li></ul><ul><li>La clase BuilderSupport nos permite ...
BUILDER SUPPORT
ALGUNOS BUILDERS
M ARKUP  BUILDER
SWING BUILDER
JMX BUILDER <ul><li>Creando un cliente JMX </li></ul><ul><li>Exportando un objeto mediante JMX </li></ul>
ANT BUILDER
ALGUNOS FRAMEWORKS Y HERRAMIENTAS CON SU PROPIO DSL
GANT <ul><li>http://gant.codehaus.org/   </li></ul>
GRIFFON <ul><li>http://griffon.codehaus.org/   </li></ul>
EASYB <ul><li>http://www.easyb.org/download.html   </li></ul>
GRADLE <ul><li>http://gradle.org/   </li></ul>
GMETRICS <ul><li>http://gmetrics.sourceforge.net/   </li></ul>
SPOCK <ul><li>http://code.google.com/p/spock/   </li></ul>
¿HACEMOS UNO? ¡GRACIAS! PREGUNTAS
Upcoming SlideShare
Loading in …5
×

Creación de DSLs con Groovy

1,813 views

Published on

Presentación del seminario impartido por Alberto Vilches el 11 de Noviembre de 2010 en la universidad San Pablo CEU de Madrid

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Creación de DSLs con Groovy

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

×