演化架构和紧急设计: 使用 Groovy 构建 DSL
2010-10-09 08:12:32 来源:WEB开发网当您使用 StringCategory 时,您必须在 use 块中访问它。在 use 块的圆括号中有多个 categories 类,之间用逗号隔开,这是合法的。
这是在 DSL 中使用开放类表示数量的另一个实例,考虑清单 3 中的代码,实现了一个预约日历:
清单 3. 一个简单的日历 DSL
def calendar = new AppointmentCalendar()
use (IntegerWithTimeSupport) {
calendar.add new Appointment("Dentist").from(4.pm)
calendar.add new Appointment("Conference call")
.from(5.pm)
.to(6.pm)
.at("555-123-4321")
}
calendar.print()
清单 3 实现了和 “连贯接口” 中 Java 实例一样的功能,但是增强了语法,其中包括了在 Java 代码中所不能实现的。例如,请注意 Groovy 允许在有些地方删除括号(像围绕 add() 方法的参数这种情况)。我也可以调用像 5.pm 这样对开发人员来说稀奇古怪的命令。这是一个打开 Integer 类(在 Groovy 中所有的数字可以自动使用 type-wrapper 类,即使 5 是一个真正的 Integer )和添加一个 pm 属性的实例。实现该开放类的类在清单 4 中显示:
清单 4. IntegerWithTimeSupport 类定义
class IntegerWithTimeSupport {
static Calendar getFromToday(Integer self) {
def target = Calendar.instance
target.roll(Calendar.DAY_OF_MONTH, self)
return target
}
static Integer getAm(Integer self) {
self == 12 ? 0 : self
}
static Integer getPm(Integer self) {
self == 12 ? 12 : self + 12
}
}
更多精彩
赞助商链接