SlideShare a Scribd company logo
1 of 75
Download to read offline
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
•  DSL = Domain Specific Language
•  Resuelve un tipo particular de problema
•  Definición
•  Modelado
•  Representación
•  Comunmente llamados mini lenguajes
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
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
CARACTERÍSTICAS DE UN DSL
•  Sintaxis específica
•  Limitados en ámbito y
capacidad
•  Pequeños y simples
PORQUÉ 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: 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
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 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
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
DSLS INTERNOS GRAILS
Config.groovy / DataSource.groovy
DSLS INTERNOS GRAILS
UrlMappings.groovy
DSLS INTERNOS GRAILS
Criteria, Hibernate, SQL
DSLS INTERNOS GRAILS
GORM
QUE HACE FALTA PARA CREAR
UN DSL
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
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)
•  No es fácil anidar
•  Todo en una misma línea
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
QUIERO CREAR UN DSL
¿INTERNO...? ¿EXTERNO…?
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/
DSLS INTERNOS
•  No todos los lenguajes lo permiten
facilmente
•  Metraprogramación es esencial
•  Ruby
•  Groovy
CARACTERÍSTICAS DE GROOVY
(QUE LO HACEN IDEAL PARA CREAR DSLS)
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
SCRIPTS
COLECCIONES
ALGUNAS MEJORAS
Getters
Setters
Constructores
con mapas
Paréntesis y
corchetes
Opcionales
No primitivos
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 call()
MOP
•  Se pueden capturar las llamadas a métodos que
no existen
CLOSURES
Java
Groovy
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
•  Por defecto es la misma (delegate = owner)

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éntesis que
engloba los parámetros de la llamada
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
•  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
BUILDER SUPPORT
ALGUNOS BUILDERS
MARKUP BUILDER
SWING BUILDER
JMX BUILDER
•  Creando un cliente JMX
•  Exportando un objeto mediante JMX
ANT BUILDER
ALGUNOS FRAMEWORKS Y
HERRAMIENTAS CON SU PROPIO
DSL
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/
¿HACEMOS UNO?
¡GRACIAS!
PREGUNTAS

More Related Content

Viewers also liked

Teaser #1 – «Drilling tool Bogomolov»
Teaser #1 – «Drilling tool Bogomolov»Teaser #1 – «Drilling tool Bogomolov»
Teaser #1 – «Drilling tool Bogomolov»Igor Golovin
 
Tablas de conversion circuitos logicos
Tablas de conversion  circuitos logicosTablas de conversion  circuitos logicos
Tablas de conversion circuitos logicosEnzo Craviotto
 
Rethinking Data Availability and Governance in a Mobile World
Rethinking Data Availability and Governance in a Mobile WorldRethinking Data Availability and Governance in a Mobile World
Rethinking Data Availability and Governance in a Mobile WorldHao Tran
 
4-Plantilla Introducción de LCDS
4-Plantilla Introducción de LCDS4-Plantilla Introducción de LCDS
4-Plantilla Introducción de LCDSKarina_Zamora
 
5-Plantilla Ver de LCDS
5-Plantilla Ver de LCDS5-Plantilla Ver de LCDS
5-Plantilla Ver de LCDSKarina_Zamora
 
Lorain County Fitness Walks Branded Monthly Flyers
Lorain County Fitness Walks Branded Monthly FlyersLorain County Fitness Walks Branded Monthly Flyers
Lorain County Fitness Walks Branded Monthly FlyersShea Alltmont
 
Urgencias psiquiátricas 2013
Urgencias psiquiátricas 2013Urgencias psiquiátricas 2013
Urgencias psiquiátricas 2013Lisa simpsons
 
7-Plantilla Leer de LCDS
7-Plantilla Leer de LCDS7-Plantilla Leer de LCDS
7-Plantilla Leer de LCDSKarina_Zamora
 
28 de febrero dia de andalucía. bueno
28 de febrero dia de andalucía. bueno28 de febrero dia de andalucía. bueno
28 de febrero dia de andalucía. buenoJuanma Perez
 
8-Plantilla Probar de LCDS
8-Plantilla Probar de LCDS8-Plantilla Probar de LCDS
8-Plantilla Probar de LCDSKarina_Zamora
 

Viewers also liked (17)

Sensores
SensoresSensores
Sensores
 
ビジネス研究委員会紹介
ビジネス研究委員会紹介ビジネス研究委員会紹介
ビジネス研究委員会紹介
 
Teaser #1 – «Drilling tool Bogomolov»
Teaser #1 – «Drilling tool Bogomolov»Teaser #1 – «Drilling tool Bogomolov»
Teaser #1 – «Drilling tool Bogomolov»
 
Tablas de conversion circuitos logicos
Tablas de conversion  circuitos logicosTablas de conversion  circuitos logicos
Tablas de conversion circuitos logicos
 
Rethinking Data Availability and Governance in a Mobile World
Rethinking Data Availability and Governance in a Mobile WorldRethinking Data Availability and Governance in a Mobile World
Rethinking Data Availability and Governance in a Mobile World
 
4-Plantilla Introducción de LCDS
4-Plantilla Introducción de LCDS4-Plantilla Introducción de LCDS
4-Plantilla Introducción de LCDS
 
Tarea 1.1
Tarea 1.1Tarea 1.1
Tarea 1.1
 
nxt
nxt nxt
nxt
 
Taller 4
Taller 4Taller 4
Taller 4
 
5-Plantilla Ver de LCDS
5-Plantilla Ver de LCDS5-Plantilla Ver de LCDS
5-Plantilla Ver de LCDS
 
perkembangan komputer dan pengaruhnya terhadap masyarakat
perkembangan komputer dan pengaruhnya terhadap masyarakatperkembangan komputer dan pengaruhnya terhadap masyarakat
perkembangan komputer dan pengaruhnya terhadap masyarakat
 
Lorain County Fitness Walks Branded Monthly Flyers
Lorain County Fitness Walks Branded Monthly FlyersLorain County Fitness Walks Branded Monthly Flyers
Lorain County Fitness Walks Branded Monthly Flyers
 
Taller 5
Taller 5Taller 5
Taller 5
 
Urgencias psiquiátricas 2013
Urgencias psiquiátricas 2013Urgencias psiquiátricas 2013
Urgencias psiquiátricas 2013
 
7-Plantilla Leer de LCDS
7-Plantilla Leer de LCDS7-Plantilla Leer de LCDS
7-Plantilla Leer de LCDS
 
28 de febrero dia de andalucía. bueno
28 de febrero dia de andalucía. bueno28 de febrero dia de andalucía. bueno
28 de febrero dia de andalucía. bueno
 
8-Plantilla Probar de LCDS
8-Plantilla Probar de LCDS8-Plantilla Probar de LCDS
8-Plantilla Probar de LCDS
 

Similar to Seminario de DSLs con Groovy

Lenguajes Dinámicos en la Java Virtual Machine
Lenguajes Dinámicos en la Java Virtual MachineLenguajes Dinámicos en la Java Virtual Machine
Lenguajes Dinámicos en la Java Virtual MachineÓscar Andrés López
 
Introducción a NoSQL con MongoDB y FireDAC
Introducción a NoSQL con MongoDB y FireDAC Introducción a NoSQL con MongoDB y FireDAC
Introducción a NoSQL con MongoDB y FireDAC Fernando Rizzato
 
Groovy & Grails
Groovy & GrailsGroovy & Grails
Groovy & Grailsbetabeers
 
¡This is drupal! - Global Training Days
¡This is drupal! - Global Training Days¡This is drupal! - Global Training Days
¡This is drupal! - Global Training DaysLa Drupalera
 
El lenguaje Ceylon y sus ventajas sobre Java
El lenguaje Ceylon y sus ventajas sobre JavaEl lenguaje Ceylon y sus ventajas sobre Java
El lenguaje Ceylon y sus ventajas sobre JavaSoftware Guru
 
Exposición de protocolos tcp
Exposición de protocolos tcpExposición de protocolos tcp
Exposición de protocolos tcpWilmer Cusin
 
Exposición de protocolos tcp
Exposición de protocolos tcpExposición de protocolos tcp
Exposición de protocolos tcpWilmer Cusin
 
Taller evento TestingUY 2016 - Automatización de Pruebas con Ruby
Taller evento TestingUY 2016 - Automatización de Pruebas con RubyTaller evento TestingUY 2016 - Automatización de Pruebas con Ruby
Taller evento TestingUY 2016 - Automatización de Pruebas con RubyTestingUy
 
An Evening with... Go Lang
An Evening with... Go LangAn Evening with... Go Lang
An Evening with... Go LangArkhotech
 
Ruby es un lenguaje de programación interpretado
Ruby es un lenguaje de programación interpretadoRuby es un lenguaje de programación interpretado
Ruby es un lenguaje de programación interpretadoYulgrecia2011
 

Similar to Seminario de DSLs con Groovy (20)

Introducción a Ceylon
Introducción a CeylonIntroducción a Ceylon
Introducción a Ceylon
 
Lenguajes Dinámicos en la Java Virtual Machine
Lenguajes Dinámicos en la Java Virtual MachineLenguajes Dinámicos en la Java Virtual Machine
Lenguajes Dinámicos en la Java Virtual Machine
 
Dynamic jvm
Dynamic jvmDynamic jvm
Dynamic jvm
 
Introducción a NoSQL con MongoDB y FireDAC
Introducción a NoSQL con MongoDB y FireDAC Introducción a NoSQL con MongoDB y FireDAC
Introducción a NoSQL con MongoDB y FireDAC
 
Groovy & Grails
Groovy & GrailsGroovy & Grails
Groovy & Grails
 
This is Drupal! (Basics)
This is Drupal! (Basics)This is Drupal! (Basics)
This is Drupal! (Basics)
 
Introducción a groovy & grails
Introducción a groovy & grailsIntroducción a groovy & grails
Introducción a groovy & grails
 
Scala desde c# y JavaScript
Scala desde c# y JavaScriptScala desde c# y JavaScript
Scala desde c# y JavaScript
 
¡This is drupal! - Global Training Days
¡This is drupal! - Global Training Days¡This is drupal! - Global Training Days
¡This is drupal! - Global Training Days
 
El lenguaje Ceylon y sus ventajas sobre Java
El lenguaje Ceylon y sus ventajas sobre JavaEl lenguaje Ceylon y sus ventajas sobre Java
El lenguaje Ceylon y sus ventajas sobre Java
 
Exposición de protocolos tcp
Exposición de protocolos tcpExposición de protocolos tcp
Exposición de protocolos tcp
 
Exposición de protocolos tcp
Exposición de protocolos tcpExposición de protocolos tcp
Exposición de protocolos tcp
 
Mongo Mapper
Mongo MapperMongo Mapper
Mongo Mapper
 
Introducción a TypeScript
Introducción a TypeScriptIntroducción a TypeScript
Introducción a TypeScript
 
Hibernate - JPA @luce
Hibernate - JPA @luceHibernate - JPA @luce
Hibernate - JPA @luce
 
Las cronicas de redis
Las cronicas de redisLas cronicas de redis
Las cronicas de redis
 
Taller evento TestingUY 2016 - Automatización de Pruebas con Ruby
Taller evento TestingUY 2016 - Automatización de Pruebas con RubyTaller evento TestingUY 2016 - Automatización de Pruebas con Ruby
Taller evento TestingUY 2016 - Automatización de Pruebas con Ruby
 
PHP y NoSQL PHPConMX 2012
PHP y NoSQL   PHPConMX 2012PHP y NoSQL   PHPConMX 2012
PHP y NoSQL PHPConMX 2012
 
An Evening with... Go Lang
An Evening with... Go LangAn Evening with... Go Lang
An Evening with... Go Lang
 
Ruby es un lenguaje de programación interpretado
Ruby es un lenguaje de programación interpretadoRuby es un lenguaje de programación interpretado
Ruby es un lenguaje de programación interpretado
 

More from Paradigma Digital

Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Paradigma Digital
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the futureParadigma Digital
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxParadigma Digital
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixParadigma Digital
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API ManagementParadigma Digital
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.Paradigma Digital
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxParadigma Digital
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microserviciosParadigma Digital
 
Equipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalEquipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalParadigma Digital
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!Paradigma Digital
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octParadigma Digital
 
Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJavaParadigma Digital
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?Paradigma Digital
 

More from Paradigma Digital (20)

Ddd + ah + microservicios
Ddd + ah + microserviciosDdd + ah + microservicios
Ddd + ah + microservicios
 
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.
 
Have you met Istio?
Have you met Istio?Have you met Istio?
Have you met Istio?
 
Linkerd a fondo
Linkerd a fondoLinkerd a fondo
Linkerd a fondo
 
Horneando apis
Horneando apisHorneando apis
Horneando apis
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the future
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFlux
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace Netflix
 
Meetup microservicios: API Management
Meetup microservicios: API ManagementMeetup microservicios: API Management
Meetup microservicios: API Management
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
 
Implementando microservicios
Implementando microserviciosImplementando microservicios
Implementando microservicios
 
Equipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma DigitalEquipo de Marketing de Paradigma Digital
Equipo de Marketing de Paradigma Digital
 
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!
 
Overview atlas (1)
Overview atlas (1)Overview atlas (1)
Overview atlas (1)
 
Cómo usar google analytics
Cómo usar google analyticsCómo usar google analytics
Cómo usar google analytics
 
Transformación Digital
Transformación DigitalTransformación Digital
Transformación Digital
 
Manuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4octManuel Hurtado. Couchbase paradigma4oct
Manuel Hurtado. Couchbase paradigma4oct
 
Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJava
 
¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?¿Cómo vencer a los dragones digitales?
¿Cómo vencer a los dragones digitales?
 

Seminario de DSLs con Groovy