67
Alberto Vilches http://albertovilches.com Twitter @albertovilches Taller de DSLs en Groovy

Taller DSLs en Groovy - SpringIO 2011

Embed Size (px)

Citation preview

Page 1: Taller DSLs en Groovy - SpringIO 2011

Alberto Vilches http://albertovilches.com

Twitter @albertovilches

Taller  de  DSLs  en  Groovy  

Page 2: Taller DSLs en Groovy - SpringIO 2011

QUÉ ES UN DSL

DSL = Lenguaje con un propósito

VS

GPS = lenguaje con múltiples propósitos

Page 3: Taller DSLs en Groovy - SpringIO 2011

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 4: Taller DSLs en Groovy - SpringIO 2011

CARACTERÍSTICAS DE UN DSL

•  Sintaxis específica

•  Limitados en ámbito y capacidad

•  Pequeños y simples

Page 5: Taller DSLs en Groovy - SpringIO 2011

POR QUÉ SON ÚTILES

•  Contextuales

•  Más expresivos = más claros

•  Mejor usar varios DSL que un único GPL

Page 6: Taller DSLs en Groovy - SpringIO 2011

CUANDO USARLOS

•  Lógica o reglas de negocio cambian a menudo

•  Solución separada del resto del código de la aplicación

Page 7: Taller DSLs en Groovy - SpringIO 2011

TIPOS DE DSL

•  Externos

•  Los usamos día a día desde hace tiempo

•  Internos

•  Viven entre nosotros

Page 8: Taller DSLs en Groovy - SpringIO 2011

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 9: Taller DSLs en Groovy - SpringIO 2011

EJEMPLOS DE DSLS EXTERNOS

Cascading Style Sheet

Page 10: Taller DSLs en Groovy - SpringIO 2011

EJEMPLOS DE DSLS EXTERNOS

Script Apache Ant (XML)

Page 11: Taller DSLs en Groovy - SpringIO 2011

EJEMPLOS DE DSLS EXTERNOS

•  Structured Query Language

•  Expresiones regulares

Patrón para buscar emails

Page 12: Taller DSLs en Groovy - SpringIO 2011

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 13: Taller DSLs en Groovy - SpringIO 2011

TIPOS DE DSL: INTERNOS

•  Se hospedan en un GPL para describirlos

•  Aprovechan el compilador/intérprete

•  Reutilizan parte de la sintaxis

•  Heredan las limitaciones del lenguaje anfitrión

Page 14: Taller DSLs en Groovy - SpringIO 2011

DSLS INTERNOS GRAILS Config.groovy / DataSource.groovy

Page 15: Taller DSLs en Groovy - SpringIO 2011

DSLS INTERNOS GRAILS UrlMappings.groovy

Page 16: Taller DSLs en Groovy - SpringIO 2011

DSLS INTERNOS GRAILS Criteria, Hibernate, SQL

Page 17: Taller DSLs en Groovy - SpringIO 2011

DSLS INTERNOS GRAILS GORM

Page 18: Taller DSLs en Groovy - SpringIO 2011

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 19: Taller DSLs en Groovy - SpringIO 2011

SINTAXIS FLUIDA

•  Primera aproximación

“Method chaining”

Todos los métodos devuelven this

Page 20: Taller DSLs en Groovy - SpringIO 2011

METHOD CHAINING

•  Javascript jQuery

Page 21: Taller DSLs en Groovy - SpringIO 2011

METHOD CHAINING

•  Javascript jQuery

•  Contextual, ligeramente extensible

Page 22: Taller DSLs en Groovy - SpringIO 2011

METHOD CHAINING

•  Apache Commons CLI

Page 23: Taller DSLs en Groovy - SpringIO 2011

METHOD CHAINING

 No  vale  siempre  

(aunque  es  mejor  que  nada)    

• No  es  fácil  anidar  •  Todo  en  una  misma  línea  

Page 24: Taller DSLs en Groovy - SpringIO 2011

EJEMPLO: SIN CONTEXTO

•  ¿Construcción o reutilización de recursos? •  ¿Importa el orden? ¿Qué hago si falla?

Page 25: Taller DSLs en Groovy - SpringIO 2011

EJEMPLO: METHOD CHAINING

•  Único objeto, única línea, único contexto •  ¿Control de errores y recursos?

Page 26: Taller DSLs en Groovy - SpringIO 2011

SOLUCIÓN: DSL

•  DSL

API vs DSL

Page 27: Taller DSLs en Groovy - SpringIO 2011

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/

Page 28: Taller DSLs en Groovy - SpringIO 2011

DSLS INTERNOS

•  No  todos  los  lenguajes  lo  permiten  facilmente  

•  Metraprogramación  es  esencial  

•  Ruby  •  Groovy  

Page 29: Taller DSLs en Groovy - SpringIO 2011

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 30: Taller DSLs en Groovy - SpringIO 2011

SCRIPTS

Page 31: Taller DSLs en Groovy - SpringIO 2011

COLECCIONES

Page 32: Taller DSLs en Groovy - SpringIO 2011

ALGUNAS MEJORAS Getters Setters Constructores

con mapas Paréntesis y corchetes Opcionales No primitivos

Page 33: Taller DSLs en Groovy - SpringIO 2011

EXPANDOMETACLASS

•  Se pueden añadir métodos/atributos a cualquier clase

•  ¡Incluso reescribir! •  y mucho más..

Page 34: Taller DSLs en Groovy - SpringIO 2011

CATEGORIES

•  Sobreescritura de métodos temporal

Page 35: Taller DSLs en Groovy - SpringIO 2011

SOBRECARGA DE OPERADORES

Page 36: Taller DSLs en Groovy - SpringIO 2011

CALL() SHORTHAND

•  Se puede invocar a cualquier objeto como si fuera un método

•  Solo es necesario implementar call()

Page 37: Taller DSLs en Groovy - SpringIO 2011

MOP •  Se pueden capturar las llamadas a

métodos que no existen

Page 38: Taller DSLs en Groovy - SpringIO 2011

CLOSURES

Java

Groovy

Page 39: Taller DSLs en Groovy - SpringIO 2011

CLOSURES

•  Variables invocables como métodos

•  Atributos invocables como métodos

Page 40: Taller DSLs en Groovy - SpringIO 2011

CLOSURES

•  Owner: instancia donde se crea el closure

•  Delegate: contexto donde se ejecuta el closure

•  Por defecto es la misma (delegate = owner)

þ

Page 41: Taller DSLs en Groovy - SpringIO 2011

CLOSURES

•  El contexto por defecto es owner •  Accediendo a variable de owner

funciona

þ

Page 42: Taller DSLs en Groovy - SpringIO 2011

CLOSURES •  El contexto por defecto es owner •  Accediendo a variable de otro sitio

NO funciona

þ ý

Page 43: Taller DSLs en Groovy - SpringIO 2011

CLOSURES

•  Contexto nuevo (delegate): config •  Accediendo a variable del contexto SI

funciona

þ

Page 44: Taller DSLs en Groovy - SpringIO 2011

CLOSURES

•  With simplemente cambia el contexto

Page 45: Taller DSLs en Groovy - SpringIO 2011

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 46: Taller DSLs en Groovy - SpringIO 2011

MI PRIMER DSL

Page 47: Taller DSLs en Groovy - SpringIO 2011

MI PRIMER DSL

Page 48: Taller DSLs en Groovy - SpringIO 2011

MI PRIMER DSL

Page 49: Taller DSLs en Groovy - SpringIO 2011

MI PRIMER DSL

Page 50: Taller DSLs en Groovy - SpringIO 2011

DSL EN UN SCRIPT src/script.groovy

Page 51: Taller DSLs en Groovy - SpringIO 2011

PERO…

Page 52: Taller DSLs en Groovy - SpringIO 2011

PERO…

Page 53: Taller DSLs en Groovy - SpringIO 2011

PERO…

Page 54: Taller DSLs en Groovy - SpringIO 2011

PERO…

Page 55: Taller DSLs en Groovy - SpringIO 2011

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 56: Taller DSLs en Groovy - SpringIO 2011

BUILDER SUPPORT

Page 57: Taller DSLs en Groovy - SpringIO 2011

MARKUP BUILDER

Page 58: Taller DSLs en Groovy - SpringIO 2011

SWING BUILDER

Page 59: Taller DSLs en Groovy - SpringIO 2011

JMX BUILDER

•  Creando un cliente JMX

•  Exportando un objeto mediante JMX

Page 60: Taller DSLs en Groovy - SpringIO 2011

ANT BUILDER

Page 61: Taller DSLs en Groovy - SpringIO 2011

GANT

•  http://gant.codehaus.org/

Page 62: Taller DSLs en Groovy - SpringIO 2011

GRIFFON

•  http://griffon.codehaus.org/

Page 63: Taller DSLs en Groovy - SpringIO 2011

EASYB

•  http://www.easyb.org/download.html

Page 64: Taller DSLs en Groovy - SpringIO 2011

GRADLE

•  http://gradle.org/

Page 65: Taller DSLs en Groovy - SpringIO 2011

GMETRICS

•  http://gmetrics.sourceforge.net/

Page 66: Taller DSLs en Groovy - SpringIO 2011

SPOCK

•  http://code.google.com/p/spock/

Page 67: Taller DSLs en Groovy - SpringIO 2011

Taller!