Download - Creación de DSLs con Groovy
![Page 1: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/1.jpg)
CREACIÓN DE DSLSCON GROOVY
por Alberto Vilcheshttp://albertovilches.com
Twitter: @albertovilches
![Page 2: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/2.jpg)
INTRODUCCIÓN¿QUÉ ES UN DSL?
![Page 3: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/3.jpg)
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
![Page 4: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/4.jpg)
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 para programar/modelar cualquier cosa
• No necesariamente Turing Completo
![Page 5: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/5.jpg)
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
![Page 6: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/6.jpg)
CARACTERÍSTICAS DE UN DSL
• Sintaxis específica
• Limitados en ámbito y capacidad
• Pequeños y simples
![Page 7: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/7.jpg)
PORQUÉ SON ÚTILES
• Contextuales
• Más expresivos = más claros
• Mejor usar varios DSL que un único GPL
![Page 8: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/8.jpg)
CUANDO USARLOS
• Lógica o reglas de negocio cambian a menudo
• Solución separada del resto del código de la aplicación
![Page 9: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/9.jpg)
TIPOS DE DSL
• Externos
• Los usamos día a día desde hace tiempo
• Internos
• Viven entre nosotros
![Page 10: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/10.jpg)
TIPOS DE DSL: EXTERNOS
Có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
![Page 11: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/11.jpg)
EJEMPLOS DE DSLS EXTERNOS
Cascading Style Sheet
![Page 12: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/12.jpg)
EJEMPLOS DE DSLS EXTERNOS
Script Apache Ant (XML)
![Page 13: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/13.jpg)
EJEMPLOS DE DSLS EXTERNOS
• StructuredQuery Language
• Expresiones regulares
Patrón para buscar emails
![Page 14: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/14.jpg)
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
![Page 15: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/15.jpg)
TIPOS DE DSL: INTERNOS
• Se hospedan en un GPL para describirlos
• Aprovechan el compilador/intérprete
• Reutilizan parte de la sintaxis
• Como anotaciones u otras ventajas (¡Groovy!)
• Heredan las limitaciones del lenguaje anfitrión
![Page 16: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/16.jpg)
DSLS INTERNOS GRAILS
Config.groovy / DataSource.groovy
![Page 17: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/17.jpg)
DSLS INTERNOS GRAILS
UrlMappings.groovy
![Page 18: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/18.jpg)
DSLS INTERNOS GRAILS
Criteria, Hibernate, SQL
![Page 19: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/19.jpg)
DSLS INTERNOS GRAILS
GORM
![Page 20: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/20.jpg)
QUE HACE FALTA PARA CREAR UN DSL
![Page 21: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/21.jpg)
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
![Page 22: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/22.jpg)
SINTAXIS FLUIDA
• Primera aproximación
“Method chaining”
Todos los métodos devuelven this
![Page 23: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/23.jpg)
METHOD CHAINING
• Javascript jQuery
![Page 24: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/24.jpg)
METHOD CHAINING
• Javascript jQuery
• Contextual, ligeramente extensible
![Page 25: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/25.jpg)
METHOD CHAINING
• Apache Commons CLI
![Page 26: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/26.jpg)
METHOD CHAINING
![Page 27: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/27.jpg)
EJEMPLO: SIN CONTEXTO
• ¿Construcción o reutilización de recursos?• ¿Importa el orden? ¿Qué hago si falla?
![Page 28: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/28.jpg)
EJEMPLO: METHOD CHAINING
• Único objeto, única línea, único contexto• ¿Control de errores y recursos?
![Page 29: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/29.jpg)
SOLUCIÓN: DSL
• DSL
API vs DSL
![Page 30: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/30.jpg)
QUIERO CREAR UN DSL
¿INTERNO...? ¿EXTERNO…?
![Page 31: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/31.jpg)
DSLS EXTERNOS
• Jet Brains Metra Programming System http://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/
![Page 32: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/32.jpg)
DSLS INTERNOS
![Page 33: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/33.jpg)
CARACTERÍSTICAS DE GROOVY
(QUE LO HACEN IDEAL PARA CREAR DSLS)
![Page 34: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/34.jpg)
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
![Page 35: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/35.jpg)
SCRIPTS
![Page 36: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/36.jpg)
COLECCIONES
![Page 37: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/37.jpg)
ALGUNAS MEJORAS
GettersSetters
Constructores con mapas
Paréntesis ycorchetesOpcionales
No primitivos
![Page 38: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/38.jpg)
EXPANDOMETACLASS
• Se pueden añadir métodos/atributos a cualquier clase
• ¡Incluso reescribir!• y mucho más..
![Page 39: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/39.jpg)
CATEGORIES
• Sobreescritura de métodos temporal
![Page 40: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/40.jpg)
SOBRECARGA DE OPERADORES
![Page 41: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/41.jpg)
CALL() SHORTHAND
• Se puede invocar acualquier objetocomo si fuera unmétodo
• Solo es necesarioimplementar call()
![Page 42: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/42.jpg)
MOP
• Se pueden capturar las llamadas a métodos que no existen
![Page 43: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/43.jpg)
CLOSURES
Java
Groovy
![Page 44: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/44.jpg)
CLOSURES
• Variables invocables como métodos
• Atributos invocables como métodos
![Page 45: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/45.jpg)
CLOSURES
• Owner: instancia donde se crea el closure• Delegate: contexto donde se ejecuta el closure
• Por defecto es la misma (delegate = owner)
![Page 46: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/46.jpg)
CLOSURES
• El contexto por defecto es owner• Accediendo a variable de owner funciona
![Page 47: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/47.jpg)
CLOSURES
• El contexto por defecto es owner• Accediendo a variable de otro sitio NO funciona
![Page 48: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/48.jpg)
CLOSURES
• Contexto nuevo (delegate): config• Accediendo a variable del contexto SI funciona
![Page 49: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/49.jpg)
CLOSURES
• With simplemente cambia el contexto
![Page 50: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/50.jpg)
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
![Page 51: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/51.jpg)
COMO CREAR UN DSL
![Page 52: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/52.jpg)
MI PRIMER DSL
![Page 53: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/53.jpg)
![Page 54: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/54.jpg)
MI PRIMER DSL
![Page 55: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/55.jpg)
MI PRIMER DSL
![Page 56: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/56.jpg)
DSL EN UN SCRIPT
src/script.groovy
![Page 57: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/57.jpg)
PERO…
![Page 58: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/58.jpg)
PERO…
![Page 59: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/59.jpg)
PERO…
![Page 60: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/60.jpg)
PERO…
![Page 61: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/61.jpg)
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
![Page 62: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/62.jpg)
BUILDER SUPPORT
![Page 63: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/63.jpg)
ALGUNOS BUILDERS
![Page 64: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/64.jpg)
MARKUP BUILDER
![Page 65: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/65.jpg)
SWING BUILDER
![Page 66: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/66.jpg)
JMX BUILDER
• Creando un cliente JMX
• Exportando un objeto mediante JMX
![Page 67: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/67.jpg)
ANT BUILDER
![Page 68: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/68.jpg)
ALGUNOS FRAMEWORKS Y HERRAMIENTAS CON SU PROPIO
DSL
![Page 75: Creación de DSLs con Groovy](https://reader033.vdocuments.net/reader033/viewer/2022052613/55a0dadf1a28ab235a8b45fc/html5/thumbnails/75.jpg)
¿HACEMOS UNO?
¡GRACIAS!
PREGUNTAS