我越来越多地听到有关领域特定语言被抛出以及它们如何改变您对待业务逻辑的方式,我已经看到了Ayende's blog posts和事情,但我从来没有真正弄清楚为什么我会将业务逻辑从我在提供商中使用的方法和情况中移除。
如果你有一些背景使用这些东西,你有可能把它放在真正的外行术语中:
答案 0 :(得分:18)
DSL在您需要将系统控制权的某些方面提供给其他人的情况下表现良好。我在Rules Engines中使用过它们,在那里你可以创建一种简单的语言,让技术含量较低的人更容易用来表达自己 - 特别是在工作流程中。
换句话说,不是让他们学习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的候选者。
答案 1 :(得分:7)
DSL 代表域名特定语言,即专为解决特定区域问题而设计的语言。
例如,Markdown(用于编辑SO上的帖子的标记语言)可以被视为DSL。
就个人而言,我几乎在我正在进行的每个大型项目中都找到了DSL的地方。通常我需要某种类似SQL的查询语言。另一种常见用法是基于规则的系统,您需要某种语言来指定规则\条件。
DSL在上下文中很有意义,通过传统方式难以描述\解决问题。
答案 2 :(得分:4)
如果您使用的是Microsoft Visual Studio,那么您已经在使用多个DSL - Web表单,winforms等的设计界面就是DSL。类设计器是另一个例子。
DSL只是一组工具(至少在理论上)使特定“域”(即视觉布局)的开发更容易,更直观,更高效。
就构建DSL而言,人们喜欢Ayende所写的一些内容与“文本解析”dsls相关,让开发人员(或最终用户)将“自然文本”输入到应用程序中,该应用程序解析文本和根据它生成某种代码或输出。
您可以使用任何语言来构建自己的DSL。 Microsoft Visual Studio具有许多可扩展性点,以及模式和范围。实践"Guidance Automation Toolkit"和Visual Studio SDK可以帮助您向Visual Studio添加DSL功能。
答案 3 :(得分:2)
DSL是自定义语言的基本编译器。 ANTLR提供了一个良好的“自由开放”工具来开发它们。最近,我一直在研究这个DSL,以便在新项目中使用state machine language。我同意Tim Howland的说法,他们可以成为让别人自定义您的应用程序的好方法。
答案 4 :(得分:2)
答案 5 :(得分:1)
DSL只是一个奇特的名字,可能意味着不同的东西:
Rails(Ruby的东西)有时被称为DSL,因为它会添加特殊的方法(并覆盖一些内置的方法)来讨论Web应用程序
ANT,Makefile语法等也是DSL,但有自己的语法。这就是我所说的DSL。
这种炒作的一个重要方面:用语言来思考你的应用程序是有意义的。你想在你的应用程序中谈什么?这些应该是你的类和方法:
答案 6 :(得分:0)
DSL基本上是创建自己的小子语言来解决特定的域问题。这是使用方法链接解决的。点和圆括号是可选的语言有助于使这些表达看起来更自然。它也可以类似于构建器模式。 DSL本身不是语言,而是您应用于API的模式,使调用更加自我解释。
一个例子是Guice,Guice Users Guide http://docs.google.com/View?docid=dd2fhx4z_5df5hw8进一步描述了接口如何绑定到实现,以及在什么情况下。
另一个常见的例子是查询语言。例如:
NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")
在实现中,假设每个方法返回一个新的Query对象,或者只是在内部更新它自己。在任何时候你都可以通过使用例如rows()来获取所有行来终止链,或者像我在上面所做的那样使用updateSomeField。两者都将返回一个结果对象。
我建议你看看上面的Guice示例,因为每次调用都会返回一个带有新选项的新类型。一个好的IDE将允许您完成,明确您在每个点上有哪些选项。
编辑:似乎很多人认为DSL是一种新的,简单的,单一用途的语言,有自己的解析器。我总是将DSL与使用方法链接作为表达操作的约定相关联。