OpenParty西安:DSL in Groovy
-
Upload
foxgem -
Category
Technology
-
view
1.775 -
download
3
Transcript of OpenParty西安:DSL in Groovy
![Page 1: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/1.jpg)
DSL in Groovy
胡键www.groovyq.net
![Page 2: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/2.jpg)
DSL in Groovy
DomainSpecificLanguage
![Page 3: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/3.jpg)
DSL in Groovy
几个 Groovy DSL的例子
![Page 4: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/4.jpg)
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](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/5.jpg)
Grails
• Config• Dependency Config• URL Mapping• GORM– DataSource– Modeling– Query
• ……
![Page 6: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/6.jpg)
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](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/7.jpg)
用 Groovy构建 DSL:基础
Method 参数 1, 参数 2, …
![Page 8: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/8.jpg)
用 Groovy构建 DSL:基础
Closure
![Page 9: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/9.jpg)
用 Groovy构建 DSL:基础
MOP•methodMissing• invokeMethod•metaClass
![Page 10: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/10.jpg)
用 Groovy构建 DSL:基础
Builder
![Page 11: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/11.jpg)
My DSL:例一• 利用 methodMissing模拟 GORM部分方法• 实现:– mockDomain.groovy
![Page 12: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/12.jpg)
My DSL:例一• 利用 methodMissing/invokeMethod–优点:简单–缺点:• 不太适合稍微复杂一点的 DSL,如方法嵌套• 要实现的方法太多时,实现逻辑也会变复杂,需做特殊处理
![Page 13: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/13.jpg)
My DSL:例二• 扩展 BuilderSupport实现自己的 XML Builder• 实现– myBuilder.groovy
• 关键方法:– setParent– createNode– nodeCompleted
![Page 14: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/14.jpg)
My DSL:例二• 扩展 BuilderSupport–优点:直观,动态–缺点:缺乏结构化
![Page 15: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/15.jpg)
My DSL:例三• FactoryBuilderSupport将 Grails Domain Class输出成另一个工具所需的 DSL。
• 实现:– DiagramFactoryBuilder.groovy
![Page 16: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/16.jpg)
My DSL:例三• 使用 3步骤–定义并实现各节点对象–实现各节点对应的 Factory,继承
AbstractFactory–注册各节点的 Factory,在
FactoryBuilderSupport• 2个关键类– FactoryBuilderSupport– AbstractFactory
![Page 17: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/17.jpg)
My DSL:例三• 利用 FactoryBuilderSupport–优点:结构化–缺点:需先确定 DSL的语法节点,对于不可预期的节点无法处理
![Page 18: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/18.jpg)
My DSL:例四• 扩展 Script类模拟机器人控制脚本。(受
http://groovyconsole.appspot.com/script/112001启发)
• 实现– Robot.groovy
![Page 19: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/19.jpg)
My DSL:例四• 扩展 Script类–优点:非常适合作为配置文件、规则文件提供给应用的用户使用
–缺点:无法直接供应用中的类使用
![Page 20: OpenParty西安:DSL in Groovy](https://reader033.fdocuments.us/reader033/viewer/2022042513/555caf90d8b42ab2358b51f1/html5/thumbnails/20.jpg)