快速业务通道

演化架构和紧急设计: 使用 DSL - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
紧急设计: 使用 DSL(5) 时间:2011-08-18 IBM Neal Ford

我们没有必要因为 XML 的优势,总是使用 XML。可以考虑以下配置代码,如清单 5 所示:

清单 5. 定制语法(custom-grammar)的状态机配置

events   doorClosed D1CL   drawerOpened D2OP   lightOn   L1ON   doorOpened D1OP   panelClosed PNCL   end   resetEvents   doorOpened   end   commands   unlockPanel PNUL   lockPanel  PNLK   lockDoor  D1LK   unlockDoor D1UL   end   state idle   actions {unlockDoor lockPanel}   doorClosed => active   end   state active   drawerOpened => waitingForLight   lightOn  => waitingForDrawer   end   state waitingForLight   lightOn => unlockedPanel   end   state waitingForDrawer   drawerOpened => unlockedPanel   end   state unlockedPanel   actions {unlockPanel lockDoor}   panelClosed => idle   end

XML 版本有的优势,它也有:是声明式的,有容器概念,并且是简明的。同时它也超越了 XML 和 Java 版本,因为它很少有 噪音字符(例如 <和 >),尽管这对技术实现是必需的,但是影响可读 性。

此版配置代码是一个用 ANTLR 编写的定制外部 DSL,也是一个开源工具,它使得用自定义语言编写变 得很容易。曾经在大学时候不喜欢编译器(包括诸如 Lex 和 YACC 之类的经典工具)课程的人,将很高 兴知道这些工具已经变得好多了。这个例子来自 Fowler 的书中,他说构建 XML 版本和构建定制语言版 本所用时间相同。

演化架构和紧急设计: 使用 DSL(6)

时间:2011-08-18 IBM Neal Ford

清单 6 中的是用 Ruby 写的另一种可选版本 :

清单 6. JRuby 中的状态机配置

event :doorClosed, "D1CL"   event :drawerOpened, "D2OP"   event :lightOn, "L1ON"   event :doorOpened, "D1OP"   event :panelClosed, "PNCL"   command :unlockPanel, "PNUL"   command :lockPanel, "PNLK"   command :lockDoor, "D1LK"   command :unlockDoor, "D1UL"   resetEvents :doorOpened   state :idle do   actions :unlockDoor, :lockPanel   transitions :doorClosed => :active   end   state :active do   transitions :drawerOpened => :waitingForLight,         :lightOn => :waitingForDrawer   end   state :waitingForLight do   transitions :lightOn => :unlockedPanel   end   state :waitingForDrawer do   transitions :drawerOpened => :unlockedPanel   end   state :unlockedPanel do   actions :unlockPanel, :lockDoor   transitions :panelClosed => :idle   end

这是一个很好的 内部DSL 例子:DSL 使用基础语言的语法,这意味这个 DSL 必须是符合语法的 Ruby 代码。(因为它是用 Ruby 编写的,可以使用 JRuby 运行,就是说,您的 toaster 所需的全是 JRuby JAR 文件。)

清单 6同定制语言有许多相同的优点。注意,大量使用 Ruby 块充当容器,这能给您同 XML 和定制语 言版本一样的容器语义。它比定制语言使用更少的噪音字符(noise characters)。例如,在 Ruby 中 :前缀表明一个符号,在本例中基本上是用作标识符的不变字符串。

演化架构和紧急设计: 使用 DSL(7)

时间:2011-08-18 IBM Neal Ford

使用 Ruby 实现这类 DSL 相当简单,如清单 7 所

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号