OpenParty西安:DSL in Groovy

Post on 20-May-2015

1.774 views 3 download

Tags:

Transcript of OpenParty西安:DSL in Groovy

DSL in Groovy

胡键www.groovyq.net

DSL in Groovy

DomainSpecificLanguage

DSL in Groovy

几个 Groovy DSL的例子

Groovy Builderdef builder = new groovy.xml.MarkupBuilder()def objects = builder.users { user(id:1001) { name(first:"Jian",second:"Hu") birthday(year:"yyyy1",month:"mm1") } user(id:1002) { name(first:"Gem",second:"Fox") birthday(year:"yyyy2",month:"mm2") }}

Grails

• Config• Dependency Config• URL Mapping• GORM– DataSource– Modeling– Query

• ……

Spockclass HelloSpock extends spock.lang.Specification { def "length of Spock's and his friends' names"() { expect: name.size() == length

where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 }}

用 Groovy构建 DSL:基础

Method 参数 1, 参数 2, …

用 Groovy构建 DSL:基础

Closure

用 Groovy构建 DSL:基础

MOP•methodMissing• invokeMethod•metaClass

用 Groovy构建 DSL:基础

Builder

My DSL:例一• 利用 methodMissing模拟 GORM部分方法• 实现:– mockDomain.groovy

My DSL:例一• 利用 methodMissing/invokeMethod–优点:简单–缺点:• 不太适合稍微复杂一点的 DSL,如方法嵌套• 要实现的方法太多时,实现逻辑也会变复杂,需做特殊处理

My DSL:例二• 扩展 BuilderSupport实现自己的 XML Builder• 实现– myBuilder.groovy

• 关键方法:– setParent– createNode– nodeCompleted

My DSL:例二• 扩展 BuilderSupport–优点:直观,动态–缺点:缺乏结构化

My DSL:例三• FactoryBuilderSupport将 Grails Domain Class输出成另一个工具所需的 DSL。

• 实现:– DiagramFactoryBuilder.groovy

My DSL:例三• 使用 3步骤–定义并实现各节点对象–实现各节点对应的 Factory,继承

AbstractFactory–注册各节点的 Factory,在

FactoryBuilderSupport• 2个关键类– FactoryBuilderSupport– AbstractFactory

My DSL:例三• 利用 FactoryBuilderSupport–优点:结构化–缺点:需先确定 DSL的语法节点,对于不可预期的节点无法处理

My DSL:例四• 扩展 Script类模拟机器人控制脚本。(受

http://groovyconsole.appspot.com/script/112001启发)

• 实现– Robot.groovy

My DSL:例四• 扩展 Script类–优点:非常适合作为配置文件、规则文件提供给应用的用户使用

–缺点:无法直接供应用中的类使用