关于理论:什么是DSL,我应该在哪里使用?

关于理论:什么是DSL,我应该在哪里使用?

What is a DSL and where should I use it?

我越来越多地听到有关抛出的领域特定语言以及它们如何改变您处理业务逻辑的方式的信息,并且我见过Ayende的博客文章和内容,但是我从未见过真正弄清了为什么我会将我的业务逻辑从我在提供程序中使用的方法和情况中删除的原因。

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

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

在需要将系统控制的某些方面交给他人的情况下,

DSL很有用。我在Rule Engines中使用了它们,在其中您可以创建一种简单的语言,使技术含量较低的人更易于表达自己的语言,尤其是在工作流中。

换句话说,不是让他们学习Java:

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

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

1
2
3
4
for (document : documents) {
if (document is unread) {
 document.sendReminder
}

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


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

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

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


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

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

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

您可以使用任何语言来构建自己的DSL。 Microsoft Visual Studio具有很多可扩展性点,并且这些模式


n


n


DSL只是一个奇特的名称,可能表示不同的含义:

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

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

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

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

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

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

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

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

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

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

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


    推荐阅读

      探探语言设置|探探怎么设置语言

      探探语言设置|探探怎么设置语言,,1. 探探怎么设置语言打开探探软件,然后就有消息提示的红点,点开就行了!其实这些软件都是挺简单的操作的,都是

      git设置编码|git语言设置

      git设置编码|git语言设置,,git设置编码点击cap4j搜索从git直接链接上拉代码。git语言设置Git是一个开源的分布式版本控制系统,可以有效、高

      区域语言设置|区域语言设置工具

      区域语言设置|区域语言设置工具,,区域语言设置工具你好,大致的方法如下,可以参考:1、按下键盘的windows 图标,再开始菜单中单击“设置”;出现的

      c4d语言设置|c4d汉语设置

      c4d语言设置|c4d汉语设置,,1. c4d汉语设置mac版的C4D是这样的,中文字体是有的,但是是以拼音的形式存在,比如黑体就是ht。中文字体以拼音方式

      电脑宣传语|电脑宣传语言

      电脑宣传语|电脑宣传语言,,1. 电脑宣传语言1.我做好了与你过一辈子的打算,也做好了你随时要走的准备,2.每段青春都会苍老,但我希望记忆里的你

      office语言设置|微软office语言设置

      office语言设置|微软office语言设置,,微软office语言设置一、首先点击桌面左下角“WIN键”。二、弹出选项内点击“所有程序”。三、接着点

      小米设置日语|小米设置日语语言

      小米设置日语|小米设置日语语言,,1. 小米设置日语语言MIUI系统文字目前只支持简体中文、繁体中文、英文、藏文和维吾尔文,不支持日文 2. 小