什么是DSL,我应该在哪里使用?

时间:2020-03-05 18:47:03  来源:igfitidea点击:

我越来越多地听到有关领域特定语言的介绍,以及它们如何改变我们对待业务逻辑的方式,并且我看过Ayende的博客文章和其他内容,但是我从来没有真正弄清楚为什么要从事我的业务逻辑与我在提供程序中使用的方法和情况不符。

如果我们有使用这些东西的背景知识,则有可能我们可以用真正的外行人术语来表达:

  • 构建DSL到底意味着什么?
  • 我们使用什么语言?
  • 在哪里使用DSL有意义?
  • 使用DSL有什么好处?

解决方案

回答

DSL代表领域特定语言,即专门为解决给定区域中的问题而设计的语言。
例如,Markdown(用于在SO上编辑帖子的标记语言)可以被视为DSL。

我个人几乎在我正在从事的每个大型项目中都找到了DSL的位置。大多数情况下,我需要某种类似于SQL的查询语言。另一个常见用法是基于规则的系统,我们需要某种语言来指定规则\条件。

在难以用传统方式描述/解决问题的情况下,DSL是有意义的。

回答

DSL基本上是在创建自己的小子语言来解决特定的域问题。这可以通过方法链接来解决。点和括号是可选的语言使这些表达看起来更加自然。它也可以类似于构建器模式。
DSL本身不是语言,而是一种应用于API的模式,以使调用更易于说明。

一个示例就是Guice,《 Guice用户指南》 http://docs.google.com/View?docid=dd2fhx4z_5df5hw8,对接口如何绑定到实现以及在何种上下文中进行了进一步的描述。

另一个常见的示例是查询语言。例如:

NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")

在实现中,想象每个方法都返回一个新的Query对象,或者仅在内部进行自身更新。在任何时候,我们都可以通过使用例如rows()来获取所有行来终止链,或者像上面我在此处所做的那样,使用updateSomeField来终止链。两者都将返回结果对象。

我建议也看一下上面的Guice示例,因为那里的每个调用都会返回带有新选项的新类型。优秀的IDE将使我们能够完成操作,并清楚地说明了每个步骤中具有哪些选项。

编辑:似乎许多人认为DSL是具有自己的解析器的新的,简单的,单一目的的语言。我总是将DSL与使用方法链接作为表达操作的约定相关联。

回答

在需要将系统控制的某些方面交给其他人的情况下,DSL很有用。我在Rule Engines中使用了它们,在其中我们可以创建一种简单的语言,使技术含量较低的人更容易使用它们来表达自己,尤其是在工作流中。

换句话说,与其让他们学习Java,还不如让他们学习Java:

DocumentDAO myDocumentDAO = ServiceLocator.getDocumentDAO();
for (int id : documentIDS) {
Document myDoc = MyDocumentDAO.loadDoc(id);
if (myDoc.getDocumentStatus().equals(DocumentStatus.UNREAD)) {
    ReminderService.sendUnreadReminder(myDoc)
}

我可以写一个DSL,让我说:

for (document : documents) {
if (document is unread) {
 document.sendReminder
}

还有其他情况,但基本上,在任何我们想使用宏语言,编写工作流程脚本或者允许进行售后定制的地方,这些都是DSL的候选对象。

回答

DSL只是一个花哨的名字,可能意味着不同的含义:

  • Rails(Ruby事物)有时也称为DSL,因为它添加了用于谈论Web应用程序的特殊方法(并且也覆盖了一些内置方法)。
  • ANT,Makefile语法等也是DSL,但是具有自己的语法。这就是我所说的DSL。

这种炒作的一个重要方面:用一种语言来思考应用程序确实很有意义。我们想在应用程序中谈论什么?这些应该是类和方法:

  • 定义一个能够表达问题的"语言"(此页面上其他人提议的真实语法或者我们喜欢的语言的类层次结构)。
  • 用该语言解决问题。

回答

如果我们使用Microsoft Visual Studio,则我们已经在使用多个DSL-Web表单,winforms等的设计图面是DSL。类设计器是另一个示例。

DSL只是一组工具(至少在理论上是这样),它们使在特定"域"(即,视觉布局)中的开发更容易,更直观,更高效。

就建立DSL而言,像Ayende这样的人所写的一些东西与"文本解析" dsls有关,让开发人员(或者最终用户)在应用程序中输入"自然文本",该应用程序对文本进行解析并生成某种形式的东西。代码或者基于它的输出。

我们可以使用任何语言来构建自己的DSL。 Microsoft Visual Studio具有很多可扩展性,并且"指导自动化工具包"和Visual Studio SDK的模式和实践可以向Visual Studio添加DSL功能。

回答

DSL是用于自定义语言的基本编译器。 ANTLR提供了一个很好的"自由和开放"工具来开发它们。最近,我一直在这个DSL上寻找新项目中使用的状态机语言。我同意上面的Tim Howland的观点,他们是让别人定制应用程序的好方法。

回答

仅供参考,这是有关DSL的书,这是马丁·福勒(Martin Fowler)签名系列的一部分。

如果它与本系列中的其他书籍具有相同的标准,那么它应该是不错的读物。

更多信息在这里