24

我听到越来越多的关于领域特定语言被抛出以及它们如何改变你处理业务逻辑的方式,我也看过Ayende 的博客文章和东西,但我从来没有真正明白我为什么要接受我的业务远离我在提供程序中使用的方法和情况的逻辑。

如果你有一些使用这些东西的背景,你可以用真正的外行术语来表达:

  • 构建 DSL 究竟意味着什么?
  • 您使用什么语言?
  • 在哪里使用 DSL 有意义?
  • 使用 DSL 有什么好处?
4

7 回答 7

18

在您需要将系统控制的某些方面交给其他人的情况下,DSL 非常有用。我在规则引擎中使用过它们,您可以在其中创建一种简单的语言,让技术水平较低的人更容易使用它来表达自己——尤其是在工作流中。

换句话说,不要让他们学习 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 的候选者。

于 2008-09-03T14:09:36.113 回答
11

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

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

DSL 在难以通过传统方式描述\解决问题的环境中是有意义的。

于 2008-09-03T14:06:29.800 回答
5

如果您使用 Microsoft Visual Studio,那么您已经在使用多个 DSL——Web 表单、winform 等的设计表面是 DSL。类设计器是另一个例子。

DSL 只是一组工具(至少在理论上)使特定“领域”(即视觉布局)中的开发更容易、更直观、更高效。

就构建 DSL 而言,像 Ayende 这样的人所写的一些东西与“文本解析”dsls 相关,让开发人员(或最终用户)将“自然文本”输入到应用程序中,该应用程序解析文本并生成某种类型基于它的代码或输出。

您可以使用任何语言来构建您自己的 DSL。Microsoft Visual Studio 有很多扩展点,模式和实践“Guidance Automation Toolkit”Visual Studio SDK可以帮助您将 DSL 功能添加到 Visual Studio。

于 2008-09-03T14:16:06.657 回答
3

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

  • Rails(Ruby 的东西)有时被称为 DSL,因为它添加了特殊的方法(并且也覆盖了一些内置的方法)来讨论 Web 应用程序

  • ANT、Makefile 语法等也是 DSL,但有自己的语法。这就是我所说的DSL。

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

  1. 定义一种能够表达您的问题的“语言”(此页面上其他人提出的真实语法或您喜欢的语言的类层次结构)。
  2. 用那种语言解决你的问题。
于 2008-09-03T14:13:24.730 回答
3

DSL 是自定义语言的基本编译器。ANTLR提供了一个很好的“免费和开放”工具来开发它们。最近,我一直在研究这个 DSL,以便在一个新项目中使用状态机语言。我同意上面的 Tim Howland 的观点,他们可以成为让其他人自定义您的应用程序的好方法。

于 2008-09-03T14:20:52.217 回答
3

仅供参考,一本关于 DSL 的书正在筹备中,作为 Martin Fowler 的签名系列的一部分。

如果它的标准与该系列中的其他书籍相同,那应该是一本好书。

更多信息在这里

于 2008-09-03T14:59:10.097 回答
1

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 与使用方法链接作为表达操作的约定联系起来。

于 2008-09-03T14:09:14.693 回答