演化架构和紧急设计: 使用 DSL
2010-07-27 00:00:00 来源:WEB开发网这是一个很好的 内部DSL 例子:DSL 使用基础语言的语法,这意味这个 DSL 必须是符合语法的 Ruby 代码。(因为它是用 Ruby 编写的,可以使用 JRuby 运行,就是说,您的 toaster 所需的全是 JRuby JAR 文件。)
清单 6同定制语言有许多相同的优点。注意,大量使用 Ruby 块充当容器,这能给您同 XML 和定制语言版本一样的容器语义。它比定制语言使用更少的噪音字符(noise characters)。例如,在 Ruby 中 :前缀表明一个符号,在本例中基本上是用作标识符的不变字符串。
使用 Ruby 实现这类 DSL 相当简单,如清单 7 所示:
清单 7. JRuby DSL 的部分类定义
class StateMachineBuilder
attr_reader :machine, :events, :states, :commands
def initialize
@events = {}
@states = {}
@state_blocks = {}
@commands = {}
end
def event name, code
@events[name] = Event.new(name.to_s, code)
end
def state name, &block
@states[name] = State.new(name.to_s)
@state_blocks[name] = block
@start_state ||= @states[name]
end
def command name, code
@commands[name] = Command.new(name.to_s, code)
end
Ruby 语法比较灵活,这使它适用于此类 DSL。例如,声明一个事件时,不会强制包含一个圆括弧作为方法调用的一部分。在这个版本中,不需要编写自己的语言或者用尖括弧妨碍自己。这更能说明为什么这个方法在 Ruby 世界是如此流行。
更多精彩
赞助商链接