creación de dsls con groovy

75
CREACIÓN DE DSLS CON GROOVY por Alberto Vilches http://albertovilches.com Twitter: @albertovilches

Upload: alberto-vilches

Post on 11-Jul-2015

1.436 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Creación de DSLs con Groovy

CREACIÓN DE DSLSCON GROOVY

por Alberto Vilcheshttp://albertovilches.com

Twitter: @albertovilches

Page 2: Creación de DSLs con Groovy

INTRODUCCIÓN¿QUÉ ES UN DSL?

Page 3: Creación de DSLs con Groovy

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

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

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

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

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

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

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

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

EJEMPLOS DE DSLS EXTERNOS

Cascading Style Sheet

Page 12: Creación de DSLs con Groovy

EJEMPLOS DE DSLS EXTERNOS

Script Apache Ant (XML)

Page 13: Creación de DSLs con Groovy

EJEMPLOS DE DSLS EXTERNOS

• StructuredQuery Language

• Expresiones regulares

Patrón para buscar emails

Page 14: Creación de DSLs con Groovy

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

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

DSLS INTERNOS GRAILS

Config.groovy / DataSource.groovy

Page 17: Creación de DSLs con Groovy

DSLS INTERNOS GRAILS

UrlMappings.groovy

Page 18: Creación de DSLs con Groovy

DSLS INTERNOS GRAILS

Criteria, Hibernate, SQL

Page 19: Creación de DSLs con Groovy

DSLS INTERNOS GRAILS

GORM

Page 20: Creación de DSLs con Groovy

QUE HACE FALTA PARA CREAR UN DSL

Page 21: Creación de DSLs con Groovy

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

SINTAXIS FLUIDA

• Primera aproximación

“Method chaining”

Todos los métodos devuelven this

Page 23: Creación de DSLs con Groovy

METHOD CHAINING

• Javascript jQuery

Page 24: Creación de DSLs con Groovy

METHOD CHAINING

• Javascript jQuery

• Contextual, ligeramente extensible

Page 25: Creación de DSLs con Groovy

METHOD CHAINING

• Apache Commons CLI

Page 26: Creación de DSLs con Groovy

METHOD CHAINING

Page 27: Creación de DSLs con Groovy

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

EJEMPLO: METHOD CHAINING

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

Page 29: Creación de DSLs con Groovy

SOLUCIÓN: DSL

• DSL

API vs DSL

Page 30: Creación de DSLs con Groovy

QUIERO CREAR UN DSL

¿INTERNO...? ¿EXTERNO…?

Page 31: Creación de DSLs con Groovy

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

DSLS INTERNOS

Page 33: Creación de DSLs con Groovy

CARACTERÍSTICAS DE GROOVY

(QUE LO HACEN IDEAL PARA CREAR DSLS)

Page 34: Creación de DSLs con Groovy

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

SCRIPTS

Page 36: Creación de DSLs con Groovy

COLECCIONES

Page 37: Creación de DSLs con Groovy

ALGUNAS MEJORAS

GettersSetters

Constructores con mapas

Paréntesis ycorchetesOpcionales

No primitivos

Page 38: Creación de DSLs con Groovy

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

CATEGORIES

• Sobreescritura de métodos temporal

Page 40: Creación de DSLs con Groovy

SOBRECARGA DE OPERADORES

Page 41: Creación de DSLs con Groovy

CALL() SHORTHAND

• Se puede invocar acualquier objetocomo si fuera unmétodo

• Solo es necesarioimplementar call()

Page 42: Creación de DSLs con Groovy

MOP

• Se pueden capturar las llamadas a métodos que no existen

Page 43: Creación de DSLs con Groovy

CLOSURES

Java

Groovy

Page 44: Creación de DSLs con Groovy

CLOSURES

• Variables invocables como métodos

• Atributos invocables como métodos

Page 45: Creación de DSLs con Groovy

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

CLOSURES

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

Page 47: Creación de DSLs con Groovy

CLOSURES

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

Page 48: Creación de DSLs con Groovy

CLOSURES

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

Page 49: Creación de DSLs con Groovy

CLOSURES

• With simplemente cambia el contexto

Page 50: Creación de DSLs con Groovy

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

COMO CREAR UN DSL

Page 52: Creación de DSLs con Groovy

MI PRIMER DSL

Page 53: Creación de DSLs con Groovy
Page 54: Creación de DSLs con Groovy

MI PRIMER DSL

Page 55: Creación de DSLs con Groovy

MI PRIMER DSL

Page 56: Creación de DSLs con Groovy

DSL EN UN SCRIPT

src/script.groovy

Page 57: Creación de DSLs con Groovy

PERO…

Page 58: Creación de DSLs con Groovy

PERO…

Page 59: Creación de DSLs con Groovy

PERO…

Page 60: Creación de DSLs con Groovy

PERO…

Page 61: Creación de DSLs con Groovy

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

BUILDER SUPPORT

Page 63: Creación de DSLs con Groovy

ALGUNOS BUILDERS

Page 64: Creación de DSLs con Groovy

MARKUP BUILDER

Page 65: Creación de DSLs con Groovy

SWING BUILDER

Page 66: Creación de DSLs con Groovy

JMX BUILDER

• Creando un cliente JMX

• Exportando un objeto mediante JMX

Page 67: Creación de DSLs con Groovy

ANT BUILDER

Page 68: Creación de DSLs con Groovy

ALGUNOS FRAMEWORKS Y HERRAMIENTAS CON SU PROPIO

DSL

Page 69: Creación de DSLs con Groovy

GANT

• http://gant.codehaus.org/

Page 70: Creación de DSLs con Groovy

GRIFFON

• http://griffon.codehaus.org/

Page 71: Creación de DSLs con Groovy

EASYB

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

Page 72: Creación de DSLs con Groovy

GRADLE

• http://gradle.org/

Page 73: Creación de DSLs con Groovy

GMETRICS

• http://gmetrics.sourceforge.net/

Page 74: Creación de DSLs con Groovy

SPOCK

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

Page 75: Creación de DSLs con Groovy

¿HACEMOS UNO?

¡GRACIAS!

PREGUNTAS