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,444

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
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,444
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
20
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • No es lo mismo LSD LDS
  • La sintáxis está orientada al problema original por el que fue necesario diseñar el DSL. No se puede hacer cualquier cosa con ellos a propósito El creador del DSL hizo un esfuerzo significativo por simplificarlos, sacrificando funcionalidad. No suelen tener librerías, plugins.
  • Se usa para formatear páginas HTML en los navegadores, pero también se puede usar para formatear cualquier documento basado en TAGS Cada navegador debe implementar un parser/intérprete de CSS,
  • Se usa para formatear páginas HTML en los navegadores, pero también se puede usar para formatear cualquier documento basado en TAGS Cada navegador debe implementar un parser/intérprete de CSS,
  • Necesitamos pensar qué problema queremos resolver, y cual es su contexto Y necesitamos crear una sintaxis comoda que lo resuelva
  • No permite una fácil anidación Requiere usar siempre una misma linea, concatenando muchos métodos con punto, lo que puede producir errores.
  • Qué herramientas hay Con que lenguajes
  • Y buena suerte! http://martinfowler.com/articles/mdaLanguageWorkbench.html
  • Reducción de la sintaxis
  • getCOOKIES es un método, pero se puede acceder a él como una variable Es una mala práctica modificar el comportamiento de clases del JDK
  • Smalltalk y Objective C
  • Necesitamos implementar tantos métodos como secciones/estructuras tenga nuestro DSL
  • Hacer los DSLs a mano, con estructuras definidas en base a métodos cuyo último parámetro es un Closure es incómodo Ya que debemos definir todas y cada una de las estructuras con todas sus combinaciones de parámetros, además de que debemos implementar, una a una, la asignación de delegates
  • Hacer los DSLs a mano, con estructuras definidas en base a métodos cuyo último parámetro es un Closure es incómodo Ya que debemos definir todas y cada una de las estructuras con todas sus combinaciones de parámetros, además de que debemos implementar, una a una, la asignación de delegates
  • Controla el cierre de las etiquetas vacias. Indentacion
  • 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
    1. A particular slide catching your eye?

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

    ×