Seminario de DSLs con Groovy

401 views

Published on

Seminario de Groovy y DSL impartido por Alberto Vilches, de Paradigma Tecnológico http://www.paradigmatecnologico.com/ y coorganizado por javaHispano http://www.javahispano.org celebrado el 11 noviembre de 2010 en Madrid.

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
401
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Seminario de DSLs con Groovy

  1. 1. CREACIÓN DE DSLSCON GROOVYpor Alberto Vilcheshttp://albertovilches.comTwitter: @albertovilches
  2. 2. INTRODUCCIÓN¿QUÉ ES UN DSL?
  3. 3. QUÉ ES Y PARA QUÉ SIRVE•  DSL = Domain Specific Language•  Resuelve un tipo particular de problema•  Definición•  Modelado•  Representación•  Comunmente llamados mini lenguajes
  4. 4. QUÉ NO ES•  Lo opuesto a un DSL es:•  General Purpose Language (como Java o Erlang)•  General Purpose Modeling Language (como UML)•  No se puede usar paraprogramar/modelar cualquiercosa•  No necesariamente TuringCompleto
  5. 5. XML, EL ANTEPASADO DEL DSLEN 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 LCSpring
  6. 6. CARACTERÍSTICAS DE UN DSL•  Sintaxis específica•  Limitados en ámbito ycapacidad•  Pequeños y simples
  7. 7. PORQUÉ SON ÚTILES•  Contextuales•  Más expresivos = más claros•  Mejor usar varios DSL que un únicoGPL
  8. 8. CUANDO USARLOS•  Lógica o reglas de negociocambian a menudo•  Solución separada del resto delcódigo de la aplicación
  9. 9. TIPOS DE DSL•  Externos•  Los usamos día a día desde hace tiempo•  Internos•  Viven entre nosotros
  10. 10. 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
  11. 11. EJEMPLOS DE DSLS EXTERNOSCascading Style Sheet
  12. 12. EJEMPLOS DE DSLS EXTERNOSScript Apache Ant (XML)
  13. 13. EJEMPLOS DE DSLS EXTERNOS•  StructuredQueryLanguage•  Expresiones regularesPatrón para buscar emails
  14. 14. EJEMPLOS DE DSLS EXTERNOSDSL Dominio UsoSQL BBDD Consulta ymanipulaciónExpresiónregularCadenas de texto Búsqueda porpatronesCSS Estilo (fuentes,colores, tamaños,etc)Cambiar lapresentación de unHTMLAnt Recursos (clases yotros ficheros)Compilación ygeneración deartefactos JAR,WAR
  15. 15. TIPOS DE DSL: INTERNOS•  Se hospedan en un GPL paradescribirlos•  Aprovechan el compilador/intérprete•  Reutilizan parte de la sintaxis•  Como anotaciones u otras ventajas (¡Groovy!)•  Heredan las limitaciones del lenguajeanfitrión
  16. 16. DSLS INTERNOS GRAILSConfig.groovy / DataSource.groovy
  17. 17. DSLS INTERNOS GRAILSUrlMappings.groovy
  18. 18. DSLS INTERNOS GRAILSCriteria, Hibernate, SQL
  19. 19. DSLS INTERNOS GRAILSGORM
  20. 20. QUE HACE FALTA PARA CREARUN DSL
  21. 21. 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
  22. 22. SINTAXIS FLUIDA•  Primera aproximación“Method chaining”Todos los métodos devuelven this
  23. 23. METHOD CHAINING•  Javascript jQuery
  24. 24. METHOD CHAINING•  JavascriptjQuery•  Contextual, ligeramente extensible
  25. 25. METHOD CHAINING•  Apache Commons CLI
  26. 26. METHOD CHAININGNo vale siempre(aunque es mejor que nada)•  No es fácil anidar•  Todo en una misma línea
  27. 27. EJEMPLO: SIN CONTEXTO•  ¿Construcción o reutilización de recursos?•  ¿Importa el orden? ¿Qué hago si falla?
  28. 28. EJEMPLO: METHOD CHAINING•  Único objeto, única línea, único contexto•  ¿Control de errores y recursos?
  29. 29. SOLUCIÓN: DSL•  DSLAPI vsDSL
  30. 30. QUIERO CREAR UN DSL¿INTERNO...? ¿EXTERNO…?
  31. 31. DSLS EXTERNOS•  Jet Brains Metra Programming Systemhttp://www.jetbrains.com/mps/index.html•  Eclipse Modeling Framework Projecthttp://www.eclipse.org/modeling/emf/•  Microsoft DSL Tools Visualization&Modeling SDKhttp://code.msdn.microsoft.com/DSLToolsLab•  XML•  ANTLR http://www.antlr.org/
  32. 32. DSLS INTERNOS•  No todos los lenguajes lo permitenfacilmente•  Metraprogramación es esencial•  Ruby•  Groovy
  33. 33. CARACTERÍSTICAS DE GROOVY(QUE LO HACEN IDEAL PARA CREAR DSLS)
  34. 34. 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
  35. 35. SCRIPTS
  36. 36. COLECCIONES
  37. 37. ALGUNAS MEJORASGettersSettersConstructorescon mapasParéntesis ycorchetesOpcionalesNo primitivos
  38. 38. EXPANDOMETACLASS•  Se pueden añadir métodos/atributos a cualquierclase•  ¡Incluso reescribir!•  y mucho más..
  39. 39. CATEGORIES•  Sobreescritura de métodos temporal
  40. 40. SOBRECARGA DE OPERADORES
  41. 41. CALL() SHORTHAND•  Se puede invocar acualquier objetocomo si fuera unmétodo•  Solo es necesarioimplementar call()
  42. 42. MOP•  Se pueden capturar las llamadas a métodos queno existen
  43. 43. CLOSURESJavaGroovy
  44. 44. CLOSURES•  Variables invocables como métodos•  Atributos invocables como métodos
  45. 45. CLOSURES•  Owner: instancia donde se crea el closure•  Delegate: contexto donde se ejecuta el closure•  Por defecto es la misma (delegate = owner)
  46. 46. CLOSURES•  El contexto por defecto es owner•  Accediendo a variable de owner funciona
  47. 47. CLOSURES•  El contexto por defecto es owner•  Accediendo a variable de otro sitio NO funciona 
  48. 48. CLOSURES•  Contexto nuevo (delegate): config•  Accediendo a variable del contexto SI funciona
  49. 49. CLOSURES•  With simplemente cambia el contexto
  50. 50. ESTRUCTURAS PERSONALIZADAS•  En un método dado, si el último parámetro es unclosure, se puede dejar fuera del paréntesis queengloba los parámetros de la llamada
  51. 51. COMO CREAR UN DSL
  52. 52. MI PRIMER DSL
  53. 53. MI PRIMER DSL
  54. 54. MI PRIMER DSL
  55. 55. DSL EN UN SCRIPTsrc/script.groovy
  56. 56. PERO…
  57. 57. PERO…
  58. 58. PERO…
  59. 59. PERO…
  60. 60. BUILDER SUPPORT•  Los builders procesan DSLs mediante eventos•  La clase BuilderSupport nos permite crear nuestrospropios builders•  Admite cualquier nombre de método ycombinación de parámetros
  61. 61. BUILDER SUPPORT
  62. 62. ALGUNOS BUILDERS
  63. 63. MARKUP BUILDER
  64. 64. SWING BUILDER
  65. 65. JMX BUILDER•  Creando un cliente JMX•  Exportando un objeto mediante JMX
  66. 66. ANT BUILDER
  67. 67. ALGUNOS FRAMEWORKS YHERRAMIENTAS CON SU PROPIODSL
  68. 68. GANT•  http://gant.codehaus.org/
  69. 69. GRIFFON•  http://griffon.codehaus.org/
  70. 70. EASYB•  http://www.easyb.org/download.html
  71. 71. GRADLE•  http://gradle.org/
  72. 72. GMETRICS•  http://gmetrics.sourceforge.net/
  73. 73. SPOCK•  http://code.google.com/p/spock/
  74. 74. ¿HACEMOS UNO?¡GRACIAS!PREGUNTAS

×