演化架构和紧急设计: 使用 Groovy 构建 DSL
2010-10-09 08:12:32 来源:WEB开发网在 上个月的这一专栏 中,我讲述了使用特定领域语言(DSL)的示例,在您的代码中定义为通用设计习惯。(我在 “组合方法和 SLAP” 一文中介绍了惯用模式的概念。)DSL 是捕获模式的一个良好介质,因为它们是声明式的,比 “普通” 源代码更容易阅读,使您的捕获模式从周围的代码中脱颖而出。
构建 DSL 的语言技术通常使用巧妙的方法来为您的代码隐式地提供包装上下文。换句话说,DSL 试图使用潜在语言特性 “隐藏” 杂乱的语法来使您的代码更具可读性。尽管您可以使用 Java 语言构建 DSL,但是 DSL 用于隐藏上下文的贫乏的构造,及其死板和无常的语法,使它不适合这一技术。但是其他基于 JVM 的语言可以填补这一空缺。在本期以及下一期中,我将向您介绍如何扩展您的 DSL 构建调板,包含更富于表现力的在 Java 平台上运行的语言,从 Groovy 开始。
Groovy 提供各种特性使构建 DSL 更为容易,在 DSL 中支持数量是一个常见的需求。人们总是需要很多数量:7 英寸、4 英里、13 天等。Groovy 允许您通过开放类 直接添加对数量的支持。开源类允许您重新打开现存类并通过在类中添加、删除或修改方法对其进行修改 — 一个强大但危险的机制。幸运的是,这有安全的方法来实现这一任务。Groovy 支持两种不同的开放类语法:categories 和 ExpandoMetaClass。
通过 categories 开放类
categories 的概念是从 Smalltalk 和 Objective-C 语言中借用的。一个 categories 可以使用 use 块指令,围绕代码调用创建一个包装器,含有一个或多个开放类。
通过一个示例更好的理解 categories 概念。清单 1 演示了我已经添加到 String 中的新方法 camelize() 的测试,该方法可以将带下划线的字符串转换成驼峰式大小写:
- ››演化架构和紧急设计: 使用 Groovy 构建 DSL
- ››演化架构和紧急设计: 使用 DSL
- ››演化架构和紧急设计: 利用可重用代码,第 2 部分:...
- ››演化架构和紧急设计: 利用可重用代码,第 1 部分:...
- ››紧急时刻的iPhone 医学影像应用
- ››演化架构和紧急设计: 演化架构
- ››演化架构与紧急设计: 积累惯用模式
- ››演化架构与紧急设计: 语言、表达性与设计:第 2 部...
- ››演化架构与紧急设计: 对设计进行重构
- ››演化架构与紧急设计: 研究架构和设计
- ››演化架构与紧急设计: 测试驱动设计,第 1 部分
- ››演化架构与紧急设计: 测试驱动设计,第 2 部分
更多精彩
赞助商链接