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

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

 

1. DSL主要分为三类:外部DSL、内部DSL,以及语言工作台。 1

2. DSL规则 2

2.1. DSL = 整洁的代码 2

2.2. DSL必须以文本代码的形式出现 2

2.3. DSL的语法应该尽可能地接近英语或者其他自然语言 2

3. DSL 文本形式 or 图形标识 2

4. 实现方式 2

4.1. 2. 管道抽象 2

4.2. 3. 层次结构抽象 3

4.3. 4. 异步抽象 3

5. 常见的dsl 4

5.1. css ,html.easyui 表单验证等.. 4

5.2. Rule Engine)语言、drools,工作流(Workflow)语言等。  Jbpm 4

5.3. SQL hql  linq ,XQuery,正则表达式 4

5.4. 业务api.通用模块。工作流语言。。图形化编程.ant ,shell..Java 6注解,attilaxc#.常见的DSL还有规则引擎(AOP实现,,框架api  ,,.xml..json..yaml 4

6. #--实现java内部 DSL 4

6.1. 参考在的语言  anno frm tapestry?? 4

6.2. Groovy 4

6.3. Ide整合的dsl--code templete 5

6.4. 方法链 5

返回this 5

返回中间对象 5

相比返回中间对象的的方式来说,返回this的方式更加容易组织连贯接口的代码 6

6.5. 静态工厂方法(static factory method)和import对于创建简洁易读的DSL来说是不错的助手。 6

6.6. 元编程; 6

6.7. 编译工具;可以使用lex,yacc,或者javacc,antlr 6

6.8. 使用框架 6

6.9. Std lib 7

7. DSL and 易读API的区别 7

8. Java实现dsl的限制 7

9. Java 实现dsl的优点 7

10. 结论 7

11. 参考 8

 

1. DSL主要分为三类:外部DSL、内部DSL,以及语言工作台。



2. DSL规则

2.1. DSL = 整洁的代码

2.2. DSL必须以文本代码的形式出现

2.3. DSL的语法应该尽可能地接近英语或者其他自然语言

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

 

3. DSL 文本形式 or 图形标识

……或者为什么不使用图形标识?文本型的DSLs有几大优势。首先是更加容易建立语言以及一个好的编辑器。其次,文本型的工件比图形化的模型库更加 容易集成到现有的开发工具(CVS/SVN diff/merge)中。第三,文本型的DSLs通常更容易被开发者接受,因为“真正的开发人员不画图”。

如果对于系统的某些方面,图形标识有助于看清楚架构元素之间的关系,你可以使用类似于Graphviz或者Prefuse之类的工具。既然模型以一 种清晰而又干净的形式包含了相关的数据,我们就可以轻易的将模型数据导出成GraphViz或者Prefuse工具能够阅读的形式。

4. 实现方式

4.1. 2. 管道抽象

Shell中,我们可以通过管道将一系列的小命令组合在一起实现复杂的功能。管道中流动的是单一类型的文本流,计算过程就是从输入流到输出流的变 换过程,每个命令是对文本流的一次变换作用,通过管道将作用叠加起来。在Shell中,很多时候我们只需要一句话就能完成log统计这样的中小规模问题。 和其他抽象机制相比,管道的优美在于无嵌套。比如下面这段C程序,由于嵌套层次较深,不容易一下子理解清楚:

//Cmin(max(min(max(a,b),c),d),e)

而用管道来表达同样的功能则清晰得多:

#!/bin/bashmax a b | min c | max d | min e

 

 

4.2. 3. 层次结构抽象

除了管道这种线性结构外,流畅接口还可用于构造层次结构抽象。比如,用Javascript动态创建创建下面的HTML片段:

<div id="’product_123’" class="’product’"><img src="’preview_123.jpg’" alt="" /><ul> <li>Name: iPad2 32G</li> <li>Price: 3600</li></ul></div>

若采用JavascriptDOM API

 而下面流畅接口API则要有表现力得多:

//Javascriptvar obj =$.div({id:’product_123’, class:’product’})    .img({src:’preview_123.jpg’})    .ul()        .li().text(‘Name: iPad2 32G’)._li()        .li().text(‘Price: 3600’)._li()    ._ul() ._div();

4.3. 4. 异步抽象

流畅接口不仅可以构造复杂的层次抽象,还可以用于构造异步抽象。在基于回调机制的异步模式中,多个异步调用的同步和嵌套问题是使用异步的难点所 在。有时一个稍复杂的调用和同步关系会导致代码充满了复杂的同步检查和层层回调,难以理解和维护。这个问题从本质上讲和上面HTML的例子一样,是由于多 数通用语言并未把异步作为基本元素/语义,许多异步实现模式是向语言的妥协。针对这个问题,我用Javascript编写了一个基于流畅接口的异步 DSL,示例代码如下:

 

5. 常见的dsl

5.1. css ,html.easyui 表单验证等..

5.2. Rule Engine)语言、drools,工作流(Workflow)语言等。  Jbpm

 

5.3. SQL hql  linq ,XQuery,正则表达式

5.4. 业务api.通用模块。工作流语言。。图形化编程.ant ,shell..Java 6注解,attilaxc#.常见的DSL还有规则引擎(AOP实现,,框架api  ,,.xml..json..yaml

 

 

6. #--实现java内部 DSL

6.1. 参考在的语言  anno frm tapestry??

实现方式1:::

实现方式2:::

 

6.2. Groovy

6.3. Ide整合的dsl--code templete

使用Java,我们同时能利用强大且成熟的类似于Eclipse和IntelliJ IDEA的集成开发环境,由于这些集成开发环境“自动完成(auto-complete)”、自动重构和debug等特性,使得DSL的创建、使用和维护 来的更加简单。另外,Java5中的一些新特性(比如generic、varargs 和static imports)可以帮助我们创建比以往任何版本任何语言都简洁的API。

 

6.4. 方法链

使用方法链接来创建DSL有两种方式,这两种方式都涉及到链接中方法的返回值。我们的选择是返回this或者返回一个中间对象,这决定于我们试图要所达到的目的。

返回this

在可以以下列方式来调用链接中方法的时候,我们通常返回this:

· 可选择的

· 以任何次序调用

· 可以调用任何次数

我们发现运用这个方法的两个用例:

1 相关对象行为链接

2 一个对象的简单构造/配置

使用连贯接口,再一次减少了代码噪音,所带来的结果是更易读的代码。需要指出的很重要的一点是,在返回this的时候,链中任何方法都可以在任何时候被调用,并且可以被调用任何次数。在我们的例子中,color这个方法我们可想调用多少次就调用多少次,并且每次调用都会覆盖上一次调用所设置的值,这在应用程序的上下文中可能是合理的。

 

返回中间对象

从连贯接口的方法中返回中间对象和返回this的方式相比,有这样一些优点:

· 我们可以使用编译器来强制业务规则(比如:必需属性)

· 我们可以通过限制链中下一个元素的可用选项,通过一个特殊途径引导我们的连贯接口用户

· 在用户可以(或必须)调用哪些方法、调用顺序、用户可以调用多少次等方面,给了API创建者更大的控制力

相比返回中间对象的的方式来说,返回this的方式更加容易组织连贯接口的代码

对方法返回this的连贯接口建档比对返回中间对象的连贯接口建档来的简单的多,尤其是在使用Javadoc来建档的情况下。 

 

6.5. 静态工厂方法(static factory method)和import对于创建简洁易读的DSL来说是不错的助手。

dialog.table("results").selectCell(6, 8); // row 6, column 8

dialog.table("results").selectCell(row(6).column(8));

6.6. 元编程;

   1. 利用现有语言进行元编程;(比如:我们web开发常用的一些ssh框架,而语言层面,lisp,ruby这些语言的宏编程直接提供元编程能力)

 

6.7. 编译工具;可以使用lex,yacc,或者javacc,antlr

等帮助我们建立新语言的描述和解释。比如antlr提供了词法描述,语法描述,各 种目标语言(java,c,c++)的词法分析器,语法分析器生成。利用他你可以实现一个完整的语言。在各种建模工具逆向工程,比如通过代码生成图表描述 的工具uml,powerdesign)等都可以看到他的身影;

 

6.8. 使用框架

Rails框架被称为基于Ruby的DSL,用于管理Ruby开发的Web应用程序。Rails之所以被称为DSL,原因之一在于Rails应用了一些Ruby语言的特性,使得基于Rails编程看上去与基于通用目的的Ruby语言编程并不相同。

如果把Rails看作是一种语言,它应该是基于Ruby、以Ruby为根基的,同时它自身也有独立的特性。

Rails都看作一个很大的DSL

 

6.9. Std lib

7. DSL and 易读API的区别

在DSL和API两者间其实很难区分。在内部DSL的例子中,他们本质上几乎是一样的。在联想到DSL这个词汇的时候,我们其实是在利用主编程语言在有限的范围内创建易读的API。“内部DSL”几乎是一个特定领域内针对特定问题而创建的极具可读性的API的代名词。

 

8. Java实现dsl的限制

任何内部DSL都受它基础语言的文法结构的限制。比如在使用Java的情况下,大括弧,小括弧和分号的使用是必须的,并且缺少闭包和元编程有可能会导致DSL比使用动态语言创建来的更冗长。

 

 

9. Java 实现dsl的优点

一般来说,使用Java编写的DSL不会造就一门业务用户可以上手的语言,而会是一种业务用户也会觉得易读的语言,同时,从程序员的角度,它也会是一种阅读和编写都很直接的语言。和外部DSL或由动态语言编写的DSL相比有优势,那就是编译器可以增强纠错能力并标识不合适的使用,

 

10. 结论

Java适用于创建开发人员易读易写的、并且对于商业用户用样易读的内部领域特定语言。用Java创建的DSL可能比那些由动态语言创建的DSL来 的冗长。但好的一面是,通过使用Java,我们可以利用编译器来增强DSL的语义。另外,我们依赖于成熟且强大的Java集成开发环境,从而使DSL的创 建、使用和维护更加简单。

 

 

11. 参考

Paip.声明式编程以及DSL 总结 - attilax的专栏 博客频道 - CSDN.NET

paip. dsl 编程语言优点以及 常见的dsl - attilax的专栏 博客频道 - CSDN.NET

DSL 用于Java开发中 - linugb118--java space - BlogJava.htm

atitit.提升开发效率--java实现DSL

API设计新思维:用流畅接口构造内部DSL _ IT

我要啦免费统计

转载于:https://www.cnblogs.com/attilax/p/5963921.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java tcp 监听端口_【TCP/IP】端口未监听,还能访问成功?

作者&#xff1a;Mr林_月生链接&#xff1a;https://www.jianshu.com/p/3ab10c8685b5现象直接上图可以发现&#xff0c;本地没监听50000端口的服务&#xff0c;但是尝试连接本地50000端口时&#xff0c;却能成功建立连接&#xff0c;这种现象叫做「自连接」。我们再通过netstat…

python随机生成定长字符串(转)

原文&#xff1a;http://www.oschina.net/code/snippet_153443_4752 运行结果&#xff1a; 转载于:https://www.cnblogs.com/Jollyxi/p/7992007.html

HDU 2204 Eddy's爱好(容斥原理)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2204 解题报告&#xff1a;输入一个n让你求出[1&#xff0c;n]范围内有多少个数可以表示成形如m^k的样子。 不详细说了&#xff0c;自己一开始也忽略了三个素数的乘积的乘方的情况。 1 #include<cstdio>2…

python 物理引擎 摩擦力_参赛作品2-phenom的2D物理引擎

全球图形学领域教育的领先者、自研引擎的倡导者、底层技术研究领域的技术公开者&#xff0c;东汉书院在致力于使得更多人群具备内核级竞争力的道路上&#xff0c;将带给小伙伴们更多的公开技术教学和视频&#xff0c;感谢一路以来有你的支持。我们正在用实际行动来帮助小伙伴们…

vue-cli的webpack模版,相关配置文件dev-server.js与webpack.config.js配置解析

1.下载vue-cli [html] view plaincopy npm install vue-cli -g vue-cli的使用与详细介绍&#xff0c;可以到github上获取https://github.com/vuejs/vue-cli 2.安装webpack项目模版 [html] view plaincopy vue init <template-name> <project-name> 比如&#xff…

zookeeper windows 下安装

2019独角兽企业重金招聘Python工程师标准>>> 前沿&#xff1a;最近公司做的项目用到了dubbo 和 zookeeper 由于 每次测试的时候 我本地的服务就会注册到测试机上&#xff0c;还得每次把测试机的服务停止掉&#xff0c;所以准备在本地搭建一个zookeeper。 安装过程 2…

小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载四(场景切换)...

作为一款真正有使用价值的应用&#xff0c;首先应该至少有两个页面&#xff0c;通过页面的切换来实现更多的交互。比如手机人人网&#xff0c;打开以后先是进入登录页面&#xff0c;登录后会有新鲜事&#xff0c;然后拉开左边的面板&#xff0c;能看到相册、悄悄话、应用之类的…

Mysql学习总结(12)——21分钟Mysql入门教程

21分钟 MySQL 入门教程 目录 一、MySQL的相关概念介绍二、Windows下MySQL的配置 配置步骤MySQL服务的启动、停止与卸载三、MySQL脚本的基本组成四、MySQL中的数据类型五、使用MySQL数据库 登录到MySQL创建一个数据库选择所要操作的数据库创建数据库表六、操作MySQL数据库 向表中…

java 队列实例_Java 实例 - 队列(Queue)用法

全屏Java 实例 - 队列(Queue)用法队列是一种特殊的线性表&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作。LinkedList类实现了Queue接口&#xff0c;因此我们可以把LinkedList当成Queue来用。以下实例演示了队列(Queue)的用法&#xff1a;Ma…

UVa 11549 Calculator Conundrum

大白书里面的题感觉就是没有什么固定的思路&#xff0c;只能认真理解学习汝佳大大的代码。 这里用的Floyd判圈法&#xff0c;就像插图里面的一样&#xff0c;两个小孩&#xff0c;一个快一个慢&#xff0c;如果实在一个环形跑道&#xff0c;那么快的那个最终一定会“追上”慢的…

几个性能测试工具

我个人认为一个优秀的软件工程师必须掌握一定的测试技能。可能有的开发工程师认为测试是测试工程师的事情&#xff0c;不是开发工程师的事情。这种开发工程师是缺一条腿的&#xff0c;离开了测试工程师&#xff0c;你如何证明你的程序没有问题。 下面是我这两天搜集的性能测试工…

Bootstrap页面布局14 - BS按钮群组

首先看看这个代码&#xff1a; <div classbtn-group><button typebutton classbtn>计算机</button><button typebutton classbtn>网络</button><button typebutton classbtn>桌面项目</button> </div> 将功能相近的按钮分成一…

type const mysql_Mysql Explain之type详解

select version()&#xff1a;5.7.21MySQL 提供了一个 EXPLAIN 命令, 它可以对 SQL 语句进行分析, 并输出 SQL 执行的详细信息, 以供开发人员针对性优化.例如分析一条 SELECT 语句EXPLAIN 结果中的type字段Tips&#xff1a;常见的扫描方式system&#xff1a;系统表&#xff0c;…

Android Intent传递数据

刚开始看郭大神的<>,实现以下里面的一些例子.Intent传递数据. 我们利用显示的方式进行Intent的启动. 1.启动intent并输入数据. Intent intentnew Intent(MainActivity.this,TwoActivity.class);intent.putExtra("data", "hello two");startActivity(…

帮 C/C++ 程序员彻底了解链接器

为什么80%的码农都做不了架构师&#xff1f;>>> http://blog.jobbole.com/96225/ 转载于:https://my.oschina.net/lieefu/blog/547083

linux安装软件包(pip, distribute, nose, virtualenv)

一、 先安装pip 1. 先去python官网下载pip&#xff0c;网站&#xff1a;https://pypi.python.org/pypi/pip#downloads&#xff0c;点击下图中的“download” 2. 然后选择下图标注的包&#xff0c;链接可以通过f12获取&#xff0c;具体如下&#xff1a; 3. 然后再linux终端输入&…

event对象获取方法

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.jb51.net/article/42691.htm 转载于:https://my.oschina.net/zxin/blog/547902

【iOS开发每日小笔记(一)】UIPickerView 自动选择某个component的某个row

这篇文章是我的【iOS开发每日小笔记】系列中的一片&#xff0c;记录的是今天在开发工作中遇到的&#xff0c;可以用很短的文章或很小的demo演示解释出来的小心得小技巧。它们可能会给用户体验、代码效率得到一些提升&#xff0c;或是之前自己没有接触过的技术&#xff0c;很开心…

在Hadoop上运行基于RMM中文分词算法的MapReduce程序

原文&#xff1a;http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词算法的MapReduce程序 23条回复我知道这个文章标题很“学术”化&#xff0c;很俗&#xff0c;让人看起来是一篇很牛B或者很装逼的论文&#xff0…

Visual Studio 快捷键汇总

常见方法&#xff1a; 强迫智能感知&#xff1a;CtrlJ。智能感知是Visual Studio最大的亮点之一&#xff0c;选择Visual Studio恐怕不会没有这个原因。 撤销&#xff1a;CtrlZ。除非你是天才&#xff0c;那么这个快捷键也是最常用的。强迫显示参数信息&#xff1a;Ctrl-Shift-空…