快速业务通道

跨越边界: 活动记录和Java编程中特定于域的语言 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

跨越边界: 活动记录和Java编程中特定于域的语言

时间:2011-07-25 IBM Bruce Tate

DSL 是专门解决特定于域问题的语言。通过更接近问题的操作,DSL 可以提供在通用语言中可能找不 到的好处。Java 世界中充满了 DSL。属性文件、Spring 上下文、标注的某种用法以及 Ant 任务,都是 DSL 的示例。

在开始研究其他像 Ruby 这样的语言的时候,我开始理解到 Java 语言目前对于 DSL 还没有良好的把 握。在这篇文章中,将看到 Ruby 使用的四种集成干净的 DSL 的技巧。然后,将看到在 Java 语言中可 能存在的选项是什么。

隐藏语言的世界

虽然您可能不知道,但实际上您无处不遇到 DSL,从日常生活到使用的应用程序,到您编写的程序。 在法庭上,可以看到速记员用 DSL 迅速地进行记录。音乐使用几种不同的标注来描述音量、音调和每个 音的时长,采用一种适合特定乐器的格式。(我使用吉它六线谱,里面每条线都代表吉它上的一根弦。) 使用 DSL 是因为它们比口述或笔录更能有效地解决问题。

在使用日常的应用程序时,也在使用 DSL。最好的示例是电子表格。编写电子表格,要比使用最简单 的会计程序还要容易。电子表格的 DSL 从根本上改变了为特定问题进行编程的实质。

Java 编程中的 DSL

回头来看,Java 也在到处使用 DSL:

JSP 使得构建定制的用户界面更容易。

SQL 代表数据库操作。

属性文件代表程序的配置。

XML 描述数据。

XML 描述程序配置,例如在 EJB、Hibernate 或 Spring 中。

XML 描述动作,例如 Ant 任务或某种引擎中的业务规则。

Java 语言并不特别擅长特定于域的语言,因为这个语言很难按照对 DSL 开发人员来说最有吸引力的 方式进行扩展。这就是为什么 XML 这么泛滥的一个原因。XML 是可扩展的,Java 和它的集成很好,可以 容易地构建解释它的工具,而且它也不需要和 Java 类一起编译。但是 XML 对于人类阅读来说很不友好 。所以,可以看到对于在 Java 语言中 XML 的过度使用有广泛的抱怨。

使用 Ruby 和活动记录的 DSL

在跨越边界 系列的 第一篇文章 中,您看到了活动记录(Ruby on Rails 背后的持久化引擎)。在这 篇文章中,我又回到活动记录,因为它在多个地方对 DSL 概念进行了精彩的应用:

特定于域的语句结构和词汇表。 活动记录构建了一个用 Ruby 对象包装关系数据库的词汇表。例如, 在数据库支持的对象中,可以用 has_many :people 来构建与另一个数据库支持的对象的一对多关系映射 。

扩展类的行为。 根据命名规范,声明叫作 People 的活动记录类,就会拥有与数据库中每个列对应的 属性。

修饰现有类型。 Rails 通常修饰 Fixnum 这样的类以提供对域友好的体验。

动态地扩展词汇表。 活动记录提供了一些惊喜,例如根据数据库的结构添加定制查找器。

英语建模。 活动记录根据上下文修改类的复数形式。

随着继续阅读本文,将看到让这些技巧成为可能的 Ruby 特性。您将真正体会到在 Ruby 和 Java 操 作方式之间的区别。要跟随本文一起编写代码,需要安装 Ruby 和 Ruby on Rails,其中包含了活动记录 (请参阅 参考资料)。

跨越边界: 活动记录和Java编程中特定于域的语言(2)

时间:2011-07-25 IBM Bruce Tate

Ruby 中的词汇表

Ruby 语法开放的结构和符号的包含,使得定义词汇相当容易。可以使用方法、符号和类来形成词汇。 请输入 irb 来启动 Ruby 解释器。输入清单 1 中的代码。(清单 1 显示了输入的内容和 Ruby 中的结 果。只需要输入黑体的代码。)

清单 1. 创建 Ruby 类

irb(main):001:0> class Person irb(main):002:1> attr_accessor :name, :email irb(main):003:1> end => nil irb(main):004:0> person = Person.new => #<Person:0x2b61a80> irb(main):005

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号