1.1、问题域与解答域

1.1.1、什么是DSL

DSL(Domain-Specific Language)全称领域专用语言,就是专门用户特定领域的语言,看着概念觉得挺高大上的,其实很简单,就是专门用于某一个领域使用的语言。举个例子,我们在设置页面样式时,就经常使用CSS样式,那么这CSS语言就是在网页样式设计这一领域专门使用的语言,CSS就是一种DSL;同理,在数据库中使用的SQL,只能在数据库中使用,也是一种DSL。在问题域里面复杂的业务,在解答域中使用DSL语言应该能得到恰当的实现。

1.1.2、那么什么是问题域与解答域?

我们一般把分析业务的那些过程、实体和约束条件称为问题域。业务越复杂,问题域就越复杂。

问题域的分析模型是用解答域提供的工具和手段实现出来的,问题域的元素需要映射成解答域中十点过的技术手段,比如面向对象中的类、对象和方法就是解答域的基本组件。你可以把这些组件组合起来,成为更大的组件。

1.2、DSL与通用编程语言的区别

DSL语言只需要针对一个特定的问题领域就可以了;用DSL编程时只需要处理问题域的复杂性(业务的复杂性),你不用管解答域具体是怎么实现的,因为都使用一定的抽象层次封装起来了;DSL还能够做到给用户使用和阅读(这要求开发者在DSL实现时抽象要合理)

1.3、初窥DSL

1.3.1、DSL对业务用户来说有什么好处?

上面提到DSL用户都能阅读,这样对酬金来说,政策配置的有没有问题,业务用户可以自己去阅读和修改,这是非DSL做不到,比如下面四川酬金中配置的分段条件是用C语言来配置的,用户谁能看懂啊,没有编程经验的估计都看不大懂,这里我给大致解释下下面代码的含义,逻辑复杂度一致即可,并不是实际的业务——“当该业务正在打折时,总金额为该业务笔数(v_dci1 比如从数据库中查询得知)乘以折后单价;如果没打折,为业务笔数乘以折前单价”,是不是觉得中文这么简单的一句话,用现在的C实现是不是太复杂了。

假如我们自己搞一个DSL,这个分段条件可以配置成什么样呢?比如可以这样“When $1 is ‘Y’ then return v_dci1*0.28 else return v_dci1*0.4”,哇,就这么一句就实现了上面13行的逻辑,是不是觉得超简单超清晰,DSL就是这么牛逼。你可能问底层是如何实现的,这底层你可以借助其他牛逼的语言来搞,也可以自己实现语法树来实现(看着难,其实有工具的,别怕),这都是后面要讲的。
上面的例子中可以总结出两点DSL对业务用户的好处:1、DSL给用户更高层次的抽象,不必去关心底层的细节,专注于解决手头的委托;2、DSL只提供有限的语汇,不超出他所描述的领域范围。
1.3.2、目前流行的DSL
之前有提到用于关系型数据库的SQL、用于样式描述的CSS、用于Web标记语言的HTML,书中还有其他的不太认识,这里就不列举了。
使用DSL的话 业务用户也能看懂,这样拉近了开发人员与领域专家(业务专家)的距离,领域专家看的懂,那么他就可以理解解答域的抽象都实现了哪些业务规则,以及这些业务规则实现的全不全面、有没有漏洞
1.3.3、DSL的结构(重要)
设计得当的DSL应该体现以下3个原则,这样才能与领域用户更好的“沟通”,让用户能够看懂和编写DSL:
1、DSL要为问题域制品提供直接的映射,如酬金问题域有一个名为Trade交易的实体,那么DSL脚本就必须包含同样名称同样角色的一个抽象概念;
2、DSL脚本必须使用问题域的共通语汇。比如用户一个渠道概念,开发人员一个技术上的组织树的Node节点概念,那么可以试着用“网点”这个概念来替代,这样大家都容易理解(这里只是举个例子,可能不大恰当)
3、DSL脚本必须对底层实现进行抽象。不能把底层实现暴露给用户,这样会增加复杂度,尽量合适的高度抽象,去除因为实现细节而引入的非本质的复杂性。
1.4、DSL执行方式
1、有的可以直接运行脚本执行,如awk、sed可以直接执行DSL
2、在虚拟机上开发的DSL脚本虚拟机上执行。任何Java DSL脚本的语义模型都生成在JVM上执行的字节码。
3、有些语言提供编译时元编程能力。在编译后运行前就可以变成一般的语法结构,就可以直接执行了。
1.5、DSL的分类
根据是否使用已有的语言作为宿主语言,在该语言上开发DSL来分,分为两类:
1、内嵌式DSL(内部DSL):使用了其他语言作为宿主语言,将DSL的实现嵌入到了宿主语言之中,称为内部DSL;
2、独立DSL(外部DSL):不依赖于任何现有语言创立的DSL。如果你了解JVM基础,那么你知道从零搞出来的语言需要设计以下功能:词法分析、解析技术、解释、编译、执行,从零实现DSL复不复杂看你要支撑到什么程度,而且还有工具帮助你
1.6、DSL的优缺点
优点:
1、使用领域高度抽象的概念,更具表现力,用户更喜欢,跟C实现的分段条件一比就知道了
2、DSL更精炼
3、基于更高的抽象层次,弱化底层实现
4、从长远来说回报更大
5、团队自己实现的语言,更容易扩展
缺点:
1、即使将DSL寄生于已有的高级语言,但是设计一门语言还是挺有难度的,视角一定要足够高,抽象要足够高才行
2、前期投入大,跟不用DSL相比,前期投入肯定大,但是从整个阶段来看还是值得的。
3、可能带来性能隐忧,因为他毕竟多了一层语言
4、可能缺乏足够的工具支持,如可能没有带代码高亮、智能提示的IDE开发工具、单元测试支持、性能分析工具等
5、多学一门语言的成本,外部DSL就要学该DSL,内部DSL还需要掌握宿主语言。
6、使用了DSL语言可能与其他现有的DSL有冲突(我们应该遇不到)
总结:
从上面看,如果要设计一门DSL,抽象层级一定要足够高,这就最好需要领域专家的参与和把关。
 
http://www.sunyaozong.com/what-is-dsl/

《DSL》笔记一、什么是DSL(转)的更多相关文章

  1. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

    问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...

  2. DSL简介(转)

    DSL编程:有人将DSL编程称之为声明式(Declarative)编程.DSL是在模型之上建立的一种更加灵活的对 模型化的理解和使用方式.语义模型是DSL的核心.内部DSL:用通用语言的语法表示DSL ...

  3. Atitit dsl exer v3 qb3 新特性

    Atitit dsl exer v3 qb3 新特性 /atiplat_cms/src/com/attilax/dsl/DslParser.java V3 支持typeed参数,与简化的notyp参数 ...

  4. Elasticsearch(入门篇)——Query DSL与查询行为

    ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求.更多内容请参考:ELK修炼之道 Query DSL结构化查询 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句.采用A ...

  5. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

  6. Paip.声明式编程以及DSL 总结

    Paip.声明式编程以及DSL 总结     1.1      声明式编程DSL 1.2      声明式语言) 1.3      声明式编程框架AOP实现 1.4      应用场合 1.5     ...

  7. 使用Antlr实现简单的DSL

    为什么要使用DSL DSL是领域专用语言,常见的DSL有SQL,CSS,Shell等等,这些DSL语言有别于其他通用语言如:C++,Java,C#,DSL常在特殊的场景或领域中使用.如下图: 领域专用 ...

  8. 简述 Ruby 与 DSL 在 iOS 开发中的运用

    阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain Specific Language) 翻译成中文就是:"领域特定语言".首先,从定义就 ...

  9. BDD 与DSL 入门

    正文: Behavior Driven Development,行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发者.QA和非技术人员或商业参与者之间的协作.在了解Behavior Driv ...

随机推荐

  1. Selenium基础教程(三)自动化插件Katalon

    Katalon-一款好用的selenium自动化测试插件 Selenium 框架是目前使用较广泛的开源自动化框架,一款好的.基于界面的录制工具对于初学者来说可以快速入门:对于老手来说可以提高开发自动化 ...

  2. Element 表单验证,不清空数据,仅仅取消表单字段校验

    重置表单 this.$refs['ageForm'].resetFields() // 表单重置 仅清空校验 this.$refs['ageForm'].clearValidate() // 清除验证

  3. 低版本的 eclipse 不支持 tomcat8.5 的解决方法

    目录 低版本的eclipse 不支持 tomcat8.5,但是还想使用的方法 低版本的eclipse 不支持 tomcat8.5,但是还想使用的方法 1. 介绍:   我在使用 mars 版本的 ec ...

  4. C++引用与常量

    常量: 在C++中有许多种数据类型(如int,float,bool等等).而这些数据类型又可以声明定义出变量与常量两种不同的具体数据.它们两种分类的标准是不一样的,是两个角度可以叠加的分类,举个栗子: ...

  5. Java学习:数据结构简介

    数据结构 数据结构: 数据结构_栈:先进后出 入口和出口在同一侧 数据结构_队列:先进先出 入口和出口在集合的两侧 数据结构_数组: 查询快:数组的地址是连续的,我们通过数组的首地址可以找到数组,通过 ...

  6. MOOC 编译原理笔记(一):编译原理概述以及程序设计语言的定义

    编译原理概述 什么是编译程序 编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序. 高级语言程序-翻译->机器语言程序-运行->结果. 其中编译程 ...

  7. Nginx中的$document_uri与$request_uri以及$http_referer

    Nginx基于$document_uri的访问控制,变量$document_uri该变量等价于$uri,其实也等价于location匹配. 示例1: 当用户请求的url中包含/admin/时,直接返回 ...

  8. Oracle使用expdp/impdp迁移数据

    Oracle使用expdp/impdp迁移数据 1.#以下步骤在开发库执行(expdp导出) 一.创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建. sqlplus / ...

  9. 互斥锁的robust属性的介绍和使用

    一个具体的场景:在多线程中,当一个线程获得锁之后异常退出后,应该怎么处理? 方案一 使用锁的robust特性 简单地讲,就是当拥有这个锁的线程挂了后,下一个尝试去获得锁的线程会得到EOWNWERDEA ...

  10. Beta冲刺第3次

    一.团队成员的学号姓名列表 学号 姓名 201731103226 翟仕佶 201731062517 曾中杰 201731062424 杨模 201731062632 邓高虎 201731062624 ...