OpenParty西安:DSL in Groovy

20
DSL in Groovy 胡胡 www.groovyq.net

Transcript of OpenParty西安:DSL in Groovy

Page 1: OpenParty西安:DSL in Groovy

DSL in Groovy

胡键www.groovyq.net

Page 2: OpenParty西安:DSL in Groovy

DSL in Groovy

DomainSpecificLanguage

Page 3: OpenParty西安:DSL in Groovy

DSL in Groovy

几个 Groovy DSL的例子

Page 4: OpenParty西安:DSL in Groovy

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") }}

Page 5: OpenParty西安:DSL in Groovy

Grails

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

• ……

Page 6: OpenParty西安:DSL in Groovy

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 }}

Page 7: OpenParty西安:DSL in Groovy

用 Groovy构建 DSL:基础

Method 参数 1, 参数 2, …

Page 8: OpenParty西安:DSL in Groovy

用 Groovy构建 DSL:基础

Closure

Page 9: OpenParty西安:DSL in Groovy

用 Groovy构建 DSL:基础

MOP•methodMissing• invokeMethod•metaClass

Page 10: OpenParty西安:DSL in Groovy

用 Groovy构建 DSL:基础

Builder

Page 11: OpenParty西安:DSL in Groovy

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

Page 12: OpenParty西安:DSL in Groovy

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

Page 13: OpenParty西安:DSL in Groovy

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

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

Page 14: OpenParty西安:DSL in Groovy

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

Page 15: OpenParty西安:DSL in Groovy

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

• 实现:– DiagramFactoryBuilder.groovy

Page 16: OpenParty西安:DSL in Groovy

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

AbstractFactory–注册各节点的 Factory,在

FactoryBuilderSupport• 2个关键类– FactoryBuilderSupport– AbstractFactory

Page 17: OpenParty西安:DSL in Groovy

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

Page 18: OpenParty西安:DSL in Groovy

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

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

• 实现– Robot.groovy

Page 19: OpenParty西安:DSL in Groovy

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

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

Page 20: OpenParty西安:DSL in Groovy