seminario de dsls con groovy

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

Upload: paradigma-tecnologico

Post on 12-Jun-2015

149 views

Category:

Documents


2 download

DESCRIPTION

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.

TRANSCRIPT

Page 1: Seminario de DSLs con Groovy

CREACIÓN DE DSLS CON GROOVY

por Alberto Vilches http://albertovilches.com

Twitter: @albertovilches

Page 2: Seminario de DSLs con Groovy

INTRODUCCIÓN ¿QUÉ ES UN DSL?

Page 3: Seminario 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: Seminario 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: Seminario 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: Seminario de DSLs con Groovy

CARACTERÍSTICAS DE UN DSL

•  Sintaxis específica

•  Limitados en ámbito y capacidad

•  Pequeños y simples

Page 7: Seminario de DSLs con Groovy

PORQUÉ SON ÚTILES

•  Contextuales

•  Más expresivos = más claros

•  Mejor usar varios DSL que un único GPL

Page 8: Seminario 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: Seminario de DSLs con Groovy

TIPOS DE DSL

•  Externos

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

•  Internos

•  Viven entre nosotros

Page 10: Seminario 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: Seminario de DSLs con Groovy

EJEMPLOS DE DSLS EXTERNOS

Cascading Style Sheet

Page 12: Seminario de DSLs con Groovy

EJEMPLOS DE DSLS EXTERNOS

Script Apache Ant (XML)

Page 13: Seminario de DSLs con Groovy

EJEMPLOS DE DSLS EXTERNOS

•  Structured Query Language

•  Expresiones regulares

Patrón para buscar emails

Page 14: Seminario 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: Seminario 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: Seminario de DSLs con Groovy

DSLS INTERNOS GRAILS

Config.groovy / DataSource.groovy

Page 17: Seminario de DSLs con Groovy

DSLS INTERNOS GRAILS

UrlMappings.groovy

Page 18: Seminario de DSLs con Groovy

DSLS INTERNOS GRAILS

Criteria, Hibernate, SQL

Page 19: Seminario de DSLs con Groovy

DSLS INTERNOS GRAILS

GORM

Page 20: Seminario de DSLs con Groovy

QUE HACE FALTA PARA CREAR UN DSL

Page 21: Seminario 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: Seminario de DSLs con Groovy

SINTAXIS FLUIDA

•  Primera aproximación

“Method chaining”

Todos los métodos devuelven this

Page 23: Seminario de DSLs con Groovy

METHOD CHAINING

•  Javascript jQuery

Page 24: Seminario de DSLs con Groovy

METHOD CHAINING

•  Javascript jQuery

•  Contextual, ligeramente extensible

Page 25: Seminario de DSLs con Groovy

METHOD CHAINING

•  Apache Commons CLI

Page 26: Seminario de DSLs con Groovy

METHOD CHAINING

No vale siempre (aunque es mejor que nada)

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

Page 27: Seminario de DSLs con Groovy

EJEMPLO: SIN CONTEXTO

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

Page 28: Seminario de DSLs con Groovy

EJEMPLO: METHOD CHAINING

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

Page 29: Seminario de DSLs con Groovy

SOLUCIÓN: DSL

•  DSL

API vs DSL

Page 30: Seminario de DSLs con Groovy

QUIERO CREAR UN DSL

¿INTERNO...? ¿EXTERNO…?

Page 31: Seminario de DSLs con Groovy

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 32: Seminario de DSLs con Groovy

DSLS INTERNOS

•  No todos los lenguajes lo permiten facilmente

•  Metraprogramación es esencial

•  Ruby

• Groovy

Page 33: Seminario de DSLs con Groovy

CARACTERÍSTICAS DE GROOVY

(QUE LO HACEN IDEAL PARA CREAR DSLS)

Page 34: Seminario 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: Seminario de DSLs con Groovy

SCRIPTS

Page 36: Seminario de DSLs con Groovy

COLECCIONES

Page 37: Seminario de DSLs con Groovy

ALGUNAS MEJORAS

Getters Setters

Constructores con mapas

Paréntesis y corchetes Opcionales

No primitivos

Page 38: Seminario de DSLs con Groovy

EXPANDOMETACLASS

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

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

Page 39: Seminario de DSLs con Groovy

CATEGORIES

•  Sobreescritura de métodos temporal

Page 40: Seminario de DSLs con Groovy

SOBRECARGA DE OPERADORES

Page 41: Seminario de DSLs con Groovy

CALL() SHORTHAND

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

•  Solo es necesario implementar call()

Page 42: Seminario de DSLs con Groovy

MOP

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

Page 43: Seminario de DSLs con Groovy

CLOSURES

Java

Groovy

Page 44: Seminario de DSLs con Groovy

CLOSURES

•  Variables invocables como métodos

•  Atributos invocables como métodos

Page 45: Seminario 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: Seminario de DSLs con Groovy

CLOSURES

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

Page 47: Seminario de DSLs con Groovy

CLOSURES

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

Page 48: Seminario de DSLs con Groovy

CLOSURES

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

Page 49: Seminario de DSLs con Groovy

CLOSURES

•  With simplemente cambia el contexto

Page 50: Seminario 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: Seminario de DSLs con Groovy

COMO CREAR UN DSL

Page 52: Seminario de DSLs con Groovy

MI PRIMER DSL

Page 53: Seminario de DSLs con Groovy
Page 54: Seminario de DSLs con Groovy

MI PRIMER DSL

Page 55: Seminario de DSLs con Groovy

MI PRIMER DSL

Page 56: Seminario de DSLs con Groovy

DSL EN UN SCRIPT

src/script.groovy

Page 57: Seminario de DSLs con Groovy

PERO…

Page 58: Seminario de DSLs con Groovy

PERO…

Page 59: Seminario de DSLs con Groovy

PERO…

Page 60: Seminario de DSLs con Groovy

PERO…

Page 61: Seminario 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: Seminario de DSLs con Groovy

BUILDER SUPPORT

Page 63: Seminario de DSLs con Groovy

ALGUNOS BUILDERS

Page 64: Seminario de DSLs con Groovy

MARKUP BUILDER

Page 65: Seminario de DSLs con Groovy

SWING BUILDER

Page 66: Seminario de DSLs con Groovy

JMX BUILDER

•  Creando un cliente JMX

•  Exportando un objeto mediante JMX

Page 67: Seminario de DSLs con Groovy

ANT BUILDER

Page 68: Seminario de DSLs con Groovy

ALGUNOS FRAMEWORKS Y HERRAMIENTAS CON SU PROPIO

DSL

Page 69: Seminario de DSLs con Groovy

GANT

•  http://gant.codehaus.org/

Page 70: Seminario de DSLs con Groovy

GRIFFON

•  http://griffon.codehaus.org/

Page 71: Seminario de DSLs con Groovy

EASYB

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

Page 72: Seminario de DSLs con Groovy

GRADLE

•  http://gradle.org/

Page 73: Seminario de DSLs con Groovy

GMETRICS

•  http://gmetrics.sourceforge.net/

Page 74: Seminario de DSLs con Groovy

SPOCK

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

Page 75: Seminario de DSLs con Groovy

¿HACEMOS UNO?

¡GRACIAS!

PREGUNTAS