Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

INTRODUCCIÓN ¿QUÉ ES UN DSL?

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

CARACTERÍSTICAS DE UN DSL •  Sintaxis específica •  Limitados en ámbito y capacidad •  Pequeños y simples

Slide 7

Slide 7 text

PORQUÉ SON ÚTILES •  Contextuales •  Más expresivos = más claros •  Mejor usar varios DSL que un único GPL

Slide 8

Slide 8 text

CUANDO USARLOS •  Lógica o reglas de negocio cambian a menudo •  Solución separada del resto del código de la aplicación

Slide 9

Slide 9 text

TIPOS DE DSL •  Externos •  Los usamos día a día desde hace tiempo •  Internos •  Viven entre nosotros

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

EJEMPLOS DE DSLS EXTERNOS Cascading Style Sheet

Slide 12

Slide 12 text

EJEMPLOS DE DSLS EXTERNOS Script Apache Ant (XML)

Slide 13

Slide 13 text

EJEMPLOS DE DSLS EXTERNOS •  Structured Query Language •  Expresiones regulares Patrón para buscar emails

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

DSLS INTERNOS GRAILS Config.groovy / DataSource.groovy

Slide 17

Slide 17 text

DSLS INTERNOS GRAILS UrlMappings.groovy

Slide 18

Slide 18 text

DSLS INTERNOS GRAILS Criteria, Hibernate, SQL

Slide 19

Slide 19 text

DSLS INTERNOS GRAILS GORM

Slide 20

Slide 20 text

QUE HACE FALTA PARA CREAR UN DSL

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

SINTAXIS FLUIDA •  Primera aproximación “Method chaining” Todos los métodos devuelven this

Slide 23

Slide 23 text

METHOD CHAINING •  Javascript jQuery

Slide 24

Slide 24 text

METHOD CHAINING •  Javascript jQuery •  Contextual, ligeramente extensible

Slide 25

Slide 25 text

METHOD CHAINING •  Apache Commons CLI

Slide 26

Slide 26 text

METHOD CHAINING No vale siempre (aunque es mejor que nada) •  No es fácil anidar •  Todo en una misma línea

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

SOLUCIÓN: DSL •  DSL API vs DSL

Slide 30

Slide 30 text

QUIERO CREAR UN DSL ¿INTERNO...? ¿EXTERNO…?

Slide 31

Slide 31 text

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/

Slide 32

Slide 32 text

DSLS INTERNOS •  No todos los lenguajes lo permiten facilmente •  Metraprogramación es esencial •  Ruby •  Groovy

Slide 33

Slide 33 text

CARACTERÍSTICAS DE GROOVY (QUE LO HACEN IDEAL PARA CREAR DSLS)

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

SCRIPTS

Slide 36

Slide 36 text

COLECCIONES

Slide 37

Slide 37 text

ALGUNAS MEJORAS Getters Setters Constructores con mapas Paréntesis y corchetes Opcionales No primitivos

Slide 38

Slide 38 text

EXPANDOMETACLASS •  Se pueden añadir métodos/atributos a cualquier clase •  ¡Incluso reescribir! •  y mucho más..

Slide 39

Slide 39 text

CATEGORIES •  Sobreescritura de métodos temporal

Slide 40

Slide 40 text

SOBRECARGA DE OPERADORES

Slide 41

Slide 41 text

CALL() SHORTHAND •  Se puede invocar a cualquier objeto como si fuera un método •  Solo es necesario implementar call()

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

CLOSURES Java Groovy

Slide 44

Slide 44 text

CLOSURES •  Variables invocables como métodos •  Atributos invocables como métodos

Slide 45

Slide 45 text

CLOSURES •  Owner: instancia donde se crea el closure •  Delegate: contexto donde se ejecuta el closure •  Por defecto es la misma (delegate = owner) 

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

CLOSURES •  With simplemente cambia el contexto

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

COMO CREAR UN DSL

Slide 52

Slide 52 text

MI PRIMER DSL

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

MI PRIMER DSL

Slide 55

Slide 55 text

MI PRIMER DSL

Slide 56

Slide 56 text

DSL EN UN SCRIPT src/script.groovy

Slide 57

Slide 57 text

PERO…

Slide 58

Slide 58 text

PERO…

Slide 59

Slide 59 text

PERO…

Slide 60

Slide 60 text

PERO…

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

BUILDER SUPPORT

Slide 63

Slide 63 text

ALGUNOS BUILDERS

Slide 64

Slide 64 text

MARKUP BUILDER

Slide 65

Slide 65 text

SWING BUILDER

Slide 66

Slide 66 text

JMX BUILDER •  Creando un cliente JMX •  Exportando un objeto mediante JMX

Slide 67

Slide 67 text

ANT BUILDER

Slide 68

Slide 68 text

ALGUNOS FRAMEWORKS Y HERRAMIENTAS CON SU PROPIO DSL

Slide 69

Slide 69 text

GANT •  http://gant.codehaus.org/

Slide 70

Slide 70 text

GRIFFON •  http://griffon.codehaus.org/

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

GRADLE •  http://gradle.org/

Slide 73

Slide 73 text

GMETRICS •  http://gmetrics.sourceforge.net/

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

¿HACEMOS UNO? ¡GRACIAS! PREGUNTAS