我越来越多地听到有关领域特定语言被抛出以及它们如何改变你对待业务逻辑的方式,我看过Ayende的博客帖子和事情,但我从来没有真正理解为什么我会接受我的业务远离我在提供者中使用的方法和情况的逻辑.
如果你有一些使用这些东西的背景,你有可能把它放在真正的外行术语中:
究竟构建DSL究竟意味着什么?
你用的是哪种语言?
使用DSL有意义吗?
使用DSL有什么好处?
Tim Howland.. 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的候选者.
在需要将系统控制权的某些方面提供给其他人的情况下,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的候选者.
DSL代表领域特定语言,即专门为解决特定领域的问题而设计的语言.
例如,Markdown(用于编辑SO上的帖子的标记语言)可以被视为DSL.
就个人而言,我几乎在我正在进行的每个大型项目中都找到了DSL的地方.通常我需要某种类似SQL的查询语言.另一种常见用法是基于规则的系统,您需要某种语言来指定规则\条件.
DSL在传统方式难以描述\解决问题的环境中是有意义的.