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

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,其中包含了活动记录 (请参阅 参考资料)。

时间: 2024-10-30 16:44:29

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

跨越边界:浅谈Java模型以外的类型策略

当谈到 Java 语言的类型方法时,Java 社区分为两大阵营.一些人喜欢编译时错误检查,更好的安全 性,以及改善的工具 -- 这些都是静态类型所能提供的特性.而另一些人则偏爱更动态的类型体验.这 一次在 跨越边界 中,您将看到两种高生产力的非 Java 语言所使用的一些截然不同的类型策略,并发现 在 Java 编程中提高类型灵活性的一些方法. 在对任何编程语言的讨论中,争议较大的一个问题就是类型模型.类型决定可以使用哪些种类的工具 ,并影响到应用程序的设计.很多开发人员将类型与生产率或可维护性

Java编程中异常处理的优劣之道

Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实并没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道点概念.本文就对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为: 好,不好和恶劣三种. 同时向你提供了一些解决这些问题的技巧. 首先解释一些java异常处理中必须搞清楚的定义和机制.Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都

Java编程中异常处理的优劣

 Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道概念.我想对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:     好,不好和恶劣三种.     同时提供了一些解决这些问题的技巧.     首先解释一些java异常处理中必须搞清楚的定义和机制.Java语言规范将自Error类或RuntimeException类衍生

Java编程中10个最佳的异常处理技巧_java

在实践中,异常处理不单单是知道语法这么简单.编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践.这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码.这还是一个提供给java程序员编写健壮代码的便利手册.Java 编程中异常处理的最佳实践 这里是我收集的10个Java编程中进行异常处理的10最佳实践.在Java编程中对于检查异常有褒有贬,强制处理异常是一门语言的功能.在本文中,我们将尽量减少使用检查型异常,同时学会在Java编程中使用检查型VS非检查型异常

深入理解Java编程中异常处理的优劣_java

Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道概念.我想对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为:好,不好和恶劣三种.同时提供了一些解决这些问题的技巧.首先解释一些java异常处理中必须搞清楚的定义和机制.Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都称作"不可检查&

java代码-关于CSDN英雄会挑战赛 java编程中的一些问题

问题描述 关于CSDN英雄会挑战赛 java编程中的一些问题 各位大神,我在挑战英雄会的题目的时候,在线下运行的没有问题,可是一提交就会提示,"挑战失败:你的程序正常编译,不过运行时发生错误,通常是代码有问题,如除数为零数组上下界溢出等" 我觉得可能是java输入数据时的问题,因为题目要求:输入多行数据,输出多行我是这样写的: Scanner scanner = new Scanner(System.in); ArrayList list = new ArrayList(); do {

仔细触摸Java编程中的“文档”和“包”

编程 什么是包 Java中的包(Package)其实指的就是目录,它是为了更好地管理Java类(Class)和接口(Interface).Java语言的包可以被另一个Java开发包所使用.如果我们要引用某个包中的类,用import关键字来标明即可.比如: import java.util. date=new Date  提示:import java.util.表示java.util中的所有公有类和接口被引入到当前包.这里的匹配符可以调入多个类名. 常用的Java标准包 JDK为我

java编程中我想用显示密码把密码显示出来了然而登录却有错 求解 急用 (我想了一天实在没法了)

问题描述 java编程中我想用显示密码把密码显示出来了然而登录却有错 求解 急用 (我想了一天实在没法了) import javax.swing.*; import java.awt.*; import java.awt.event.*; public class weixin extends JFrame implements ActionListener { JPanel panmain; //面板 JLabel lblname,lblpassword,lblphoto; //标签 JLab

hibernate-求助!!!!java编程中框架的使用流程

问题描述 求助!!!!java编程中框架的使用流程 开始接触框架,对框架的概念还不是很理解,我想问问,框架是什么?在编程中使用一个框架的大致流程,比如hibernate如果我想使用hibernate框架,是要先做环境搭建吗? 框架使用的流程都是相似的吗? 解决方案 框架和类库都是别人事先编写好的程序,供你重用的.类库重用的是功能,框架重用的是流程(当然框架一般也附带类库) 用hibernate很简单,导入对应的jar包,根据文档或者例子,配置好配置文件(一般是jdbc连接),在程序中就能使用了.