今天(2 月 21 日)是 Groovy/Grails Experience 大会(也就是大家所熟知的 2GX)的第一天,会议在 Virginia 的 Reston 举行。该会议会持续 3 天,包括了四十个 90 分钟的专题、小组讨论以及代码研习会。今天的首个专题之一是 Venkat Subramaniam 的“DSL In Groovy”。领域特定语言的话题过去曾经出现在 InfoQ 上,包括 Martin Fowler 的领域特定语言介绍和Ian Roughley 的关于用JRuby 构建领域特定语言的文章。
Venkat 的专题提供了关于什么是 DSL、它们的特征、DSL 类型(内部 / 外部)以及 Groovy 用来创建和使用它们的特性等相关信息。Venkat 首先集中于使用一些 Groovy 的一些内置特性创建内部 DSL(internal DSL):
- 方法缺失(Method Missing) —— 当一个方法无法找到时被调用的一种特定方法,该调用允许被开发者截获
- Categories —— 允许在运行时将新方法增加进任何类中
- ExpandoMetaClass —— 一种动态可扩展的 Bean
除了这三个特性外,Venkat 论述了 Groovy 对开发者没有约束以及其促进 DSL 的附加特性,包括:
- 闭包(Closures)
- 在使用圆括号上的不严格的规则
- 内置的 list 和 map 语法
- 属性缺失(Property Missing)
- 动态给接口增加方法以及让具体类也获得那些方法的能力
在决定当创建 DSL 时使用哪种方法时,Venkat 解释了使用 Categories 或 ExpandoMetaClass 的主要区别, > - Categories 允许你在战术上增强一个类
- ExpandMetaClass 在本质上更深远、全面
- 你可能不想从全局影响一个类
- Categories 提供了受控的灵活性
领域特定语言正持续受到关注,而且可以用 Groovy 内置特性创建和使用。
评论