代码之家  ›  专栏  ›  技术社区  ›  crucible

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

  •  20
  • crucible  · 技术社区  · 16 年前

    我听到越来越多的关于特定领域的语言被抛弃,以及它们如何改变您对待业务逻辑的方式,我已经看到了 Ayende's blog posts 但我从来没有真正明白为什么我会把我的业务逻辑从我在提供者中使用的方法和情况中去掉。

    如果你有使用这些东西的背景,任何你能把它放在真正的外行术语中的机会:

    • 构建DSL到底意味着什么?
    • 你用什么语言?
    • 使用DSL的意义何在?
    • 使用DSL有什么好处?
    7 回复  |  直到 16 年前
        1
  •  17
  •   Tim Howland    16 年前

    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的候选者。

        2
  •  6
  •   Sid M Vladimir Enchev    10 年前

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

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

    DSL在难以用传统方法描述解决问题的环境中是有意义的。

        3
  •  4
  •   Sid M Vladimir Enchev    10 年前

    如果使用Microsoft Visual Studio,则已经使用了多个DSL——Web窗体、WinForms等的设计图面是DSL。类设计器是另一个例子。

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

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

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

        4
  •  2
  •   kenny    16 年前

    DSL是自定义语言的基本编译器。一个好的“自由和开放”的开发工具可在 ANTLR . 最近,我一直在看这个DSL state machine language 用于新项目。我同意上面提到的TimHowland,他们可以是让其他人自定义您的应用程序的好方法。

        5
  •  2
  •   toolkit    16 年前

    仅供参考,关于DSLS的一本书作为马丁·福勒签名系列的一部分正在酝酿之中。

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

    更多信息 here

        6
  •  1
  •   Sid M Vladimir Enchev    10 年前

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

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

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

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

    1. 定义能够表达问题的“语言”(本页上其他人提出的真正语法或您最喜欢的语言的类层次结构)。
    2. 用那种语言解决你的问题。
        7
  •  0
  •   Staale    16 年前

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

    一个例子是Guice, Guice Users Guide http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 对接口如何绑定到实现以及在什么上下文中进行了进一步的描述。

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

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

    在实现中,设想每个方法返回一个新的查询对象,或者只在内部进行更新。在任何时候,您都可以使用例如rows()来终止链,以获取所有行,或者像我在上面所做的那样更新somefield。两者都将返回一个结果对象。

    我建议您也看一下上面的guice示例,因为那里的每个调用都返回一个新类型,其中包含新的选项。一个好的IDE可以让你完成,让你清楚地知道在每一点上你有哪些选择。

    编辑:似乎很多人认为DSL是新的、简单的、有自己的解析器的单用途语言。我总是将DSL关联为使用方法链接作为表示操作的约定。