- 浏览: 5159840 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
silence19841230:
先拿走看看
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
masuweng 写道发下源码下载地址吧!三个相关文件打了个包 ...
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
发下源码下载地址吧!
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
水淼火 写道你好,我使用以后,图标不显示,应该怎么引用呢,谢谢 ...
前端框架iviewui使用示例之菜单+多Tab页布局
转自:http://www.cnblogs.com/chenjie0949/p/4755389.html
引子
我们用一段gradle的脚本做引子,理解这一段脚本与一般的groovy代码是怎么联系起来的
DSL的定义
DSL(Domain Specific Language)定义:针对某一领域,具有受限表达性的一种计算机程序设计语言。
所谓针对某一领域,其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。
DSL伴随语义模型出现,语义模型会表现为程序库或者框架,对于构建DSL而言,语义模型不可或缺。DSL只是位于其上的一层而已。定义做什么,而不是用一堆命令语句来描述怎么做,所以它是声明式编程(如SQL),这一点很重要。DSL的受限表达性可以使DSL语言不易出错,即便出错,也易于发现。这是受限表达性的意义。
DSL是通用语言的特定用法。内部DSL通常是一段合法的程序,但是具有特定的风格。而且只用到了语言一部分特性。防止DSL逐渐演变为一种通用语言,要受限表达。目的防止DSL过于复杂,可维护性降低,学习成本提升,偏离方向。不要让DSL读起来向自然语言。它是程序语言,比自然语言更加准确和简洁。语义模型位于语言和DSL之间,为二者解耦。DSL脚本,解析器,语义模型,模型——DSL自上而下几个层次。
Groovy语法对DSL的支持
我们先看一个简单的类和一个奇葩的语法现象:分号省略;默认public省略;有形参的方法调用,括号可以省略;返回的return可以省略,默认最后一行代码的值返回。
看完省略括号的语法现象,下面看另一个重量级的语法现象——闭包
闭包是用{符号括起来的代码块,它可以被单独运行或调用,也可以被命名。类似‘匿名类’或内联函数的概念。
闭包中最常见的应用是对集合进行迭代,下面定义了3个闭包对map进行了迭代:
map.each({key,value-> //key,value两个参数用于接受每个元素的键/值
println "$key:$value"})
map.each{println it} //it是一个关键字,代表map集合的每个元素
map.each({ println it.getKey()+"-->"+it.getValue()})
除了用于迭代之外,闭包也可以单独定义:
def say={word->
println "Hi,$word!"
}
调用:
say('groovy')
say.call('groovy&grails')
输出:
Hi,groovy!
Hi,groovy&grails!
看起来,闭包类似于方法,需要定义参数和要执行的语句,它也可以通过名称被调用。然而闭包对象(不要奇怪,闭包也是对象)可以作为参数传递(比如前面的闭包作为参数传递给了map的each方法)。而在java中,要做到这一点并不容易(也许C++中的函数指针可以,但不要忘记java中没有指针)。其次,闭包也可以不命名(当然作为代价,只能在定义闭包时执行一次),而方法不可以。
当闭包遇到括号省略,一切都不一样了
Project.groovy
Main.groovy
减完之后,像不像下面的脚本?
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
唯一的区别是我们需要用对象来引用方法,其实去掉对象也不难,自己调用自己的方法就可以了,看下面的代码:
DSL的两个关键点,某一领域,gradle只为编译,也只用于编译。受限表达,一般只调用脚本运行上下文环境中的方法,为的就是尽量简单,出错的话,排错方便。伴随而生的语义模型就是那一套编译框架。
Groovy对DSL的支持,表现为可以省略:分号,调用方法的括号,return,默认public等。
引子
我们用一段gradle的脚本做引子,理解这一段脚本与一般的groovy代码是怎么联系起来的
buildscript { repositories { jcenter() mavenLocal() //或者使用指定的本地maven 库 maven{ url "file://D:/repo" } } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' } }
DSL的定义
DSL(Domain Specific Language)定义:针对某一领域,具有受限表达性的一种计算机程序设计语言。
所谓针对某一领域,其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。
DSL伴随语义模型出现,语义模型会表现为程序库或者框架,对于构建DSL而言,语义模型不可或缺。DSL只是位于其上的一层而已。定义做什么,而不是用一堆命令语句来描述怎么做,所以它是声明式编程(如SQL),这一点很重要。DSL的受限表达性可以使DSL语言不易出错,即便出错,也易于发现。这是受限表达性的意义。
DSL是通用语言的特定用法。内部DSL通常是一段合法的程序,但是具有特定的风格。而且只用到了语言一部分特性。防止DSL逐渐演变为一种通用语言,要受限表达。目的防止DSL过于复杂,可维护性降低,学习成本提升,偏离方向。不要让DSL读起来向自然语言。它是程序语言,比自然语言更加准确和简洁。语义模型位于语言和DSL之间,为二者解耦。DSL脚本,解析器,语义模型,模型——DSL自上而下几个层次。
Groovy语法对DSL的支持
我们先看一个简单的类和一个奇葩的语法现象:分号省略;默认public省略;有形参的方法调用,括号可以省略;返回的return可以省略,默认最后一行代码的值返回。
import groovy.xml.* import java.io.* class Task{ //默认省略public和分号 String summary String description Date dueDate Map m static void main(args){ //默认有set和get方法 Task task1 = new Task() task1.setSummary("this is Task1") println task1.getSummary() //有形参的方法调用,括号可以省略 task1.setDescription "this is Task class" task1.printDescription "" //可以直接传map Task task3 = new Task() task3.setM (['summary':'this is Task3','description':'Task']) println task3.getM() //map的分号可以省略 Task task2= new Task('summary':'this is Task2','description':'Task') println task2.getSummary() //括号也可以省略 Task task4 = new Task() task4.setM 'summary':'this is Task4' println task4.getM() } public void printDescription(def str){ println "the task description is : $description" } }
看完省略括号的语法现象,下面看另一个重量级的语法现象——闭包
闭包是用{符号括起来的代码块,它可以被单独运行或调用,也可以被命名。类似‘匿名类’或内联函数的概念。
闭包中最常见的应用是对集合进行迭代,下面定义了3个闭包对map进行了迭代:
map.each({key,value-> //key,value两个参数用于接受每个元素的键/值
println "$key:$value"})
map.each{println it} //it是一个关键字,代表map集合的每个元素
map.each({ println it.getKey()+"-->"+it.getValue()})
除了用于迭代之外,闭包也可以单独定义:
def say={word->
println "Hi,$word!"
}
调用:
say('groovy')
say.call('groovy&grails')
输出:
Hi,groovy!
Hi,groovy&grails!
看起来,闭包类似于方法,需要定义参数和要执行的语句,它也可以通过名称被调用。然而闭包对象(不要奇怪,闭包也是对象)可以作为参数传递(比如前面的闭包作为参数传递给了map的each方法)。而在java中,要做到这一点并不容易(也许C++中的函数指针可以,但不要忘记java中没有指针)。其次,闭包也可以不命名(当然作为代价,只能在定义闭包时执行一次),而方法不可以。
当闭包遇到括号省略,一切都不一样了
Project.groovy
public class Project{ Date date void setDateFormat(Closure formatDate){ println formatDate(date) } }
Main.groovy
public class Main{ public static void main(def args){ Project p = new Project() p.setDate new Date() //正常 p.setDateFormat({ return it.format('yyyy-MM-dd HH:mm:ss') }) //减return p.setDateFormat { it.format('yyyy-MM-dd HH:mm:ss') } //减括号(是不是很像我们的gradle脚本?) p.setDateFormat { it.format 'yyyy-MM-dd HH:mm:ss' } } }
减完之后,像不像下面的脚本?
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
唯一的区别是我们需要用对象来引用方法,其实去掉对象也不难,自己调用自己的方法就可以了,看下面的代码:
public class Project{ Date date void setDateFormat(Closure formatDate){ println formatDate(date) } //将format内置 String format(String f){ date.format(f) } //无形参的方法 void showDate(){ print date.toString() } void run(){ //对象去掉,是不是一模一样了? setDateFormat{ println 'this is a scrip' format 'yyyy-MM-dd HH:mm:ss' //没有形参的话就只能乖乖写括号了 showDate() } } }
DSL的两个关键点,某一领域,gradle只为编译,也只用于编译。受限表达,一般只调用脚本运行上下文环境中的方法,为的就是尽量简单,出错的话,排错方便。伴随而生的语义模型就是那一套编译框架。
Groovy对DSL的支持,表现为可以省略:分号,调用方法的括号,return,默认public等。
发表评论
-
gradle编译错误:Could not find method compile() for arguments
2020-09-19 10:50 18491编译(IDEA+Gradle)一个别人的工程,出现一个 ... -
netty心跳检查之UDP篇
2019-09-15 08:50 2393部分UDP通信场景中,需要客户端定期发送心跳信息,以获取终 ... -
解决tomcat部署两个SpringBoot应用提示InstanceAlreadyExistsException
2019-06-30 11:49 3388两个SpringBoot应用部署在一个Tomcat中,单独 ... -
Eclipse配置MyBatis代码自动化功能
2019-06-29 10:16 17701.安装插件 Eclipse中,Help->Ecli ... -
vue.js中使用qrcode生成二维码
2019-05-20 00:00 7654一、安装包 npm install qrcodejs2 --s ... -
MySQL插入数据报错: Incorrect string value: '\xFD\xDE'
2019-03-31 23:19 1251我MySQL数据库用的uft-8字符集,插入数据一直很正常 ... -
vue自定义组件并双向绑定属性
2019-03-08 22:46 3258做了两个子组件,原理基本一样,一个是使用原生的select ... -
vue-router简单示例
2019-03-05 00:32 1150写个基本完整、稍有借鉴意义的示例,防止自己忘记。 &l ... -
“联通充值系统繁忙”轻松应对
2019-02-06 11:03 3973大过年的,联通充个值一直报“充值系统繁忙”。昨天晚上试了几 ... -
electron.js数据库应用---导航菜单(element-ui+mysql)
2019-02-05 21:33 2364一、环境搭建 略, ... -
electron.js数据库应用---入门(mysql+element-ui)
2019-01-27 23:19 7496我的机器:Windows10,64 ... -
SpringMVC 在controller层中注入成员变量request,是否线程安全
2018-12-17 21:17 2748@RestController public class ... -
VueJS 组件参数名命名与组件属性转化
2018-12-03 00:00 2073转自:https://www.cnblogs.com/meiy ... -
vue-resource拦截器实现token发送及检验自动化
2018-11-16 22:38 3077用了很长时间vue-resource,最近思考$http发 ... -
element-ui试用手记
2018-10-29 20:25 1742element-ui、iviewui都以vue.js为基础 ... -
iviewui中表格控件中render的使用示例
2018-07-07 16:46 9786示例了如何在表格中显示按钮,如何将代码转化为文字。 i ... -
Tomcat错误“Alias name tomcat does not identify a key entry”解决
2018-07-05 21:39 6571申请到了阿里云的证书后,下载、按照说明生成jks格式证书、 ... -
阿里云免费证书“fileauth.txt内容配置错误”解决
2018-07-05 20:43 5297最近研究微信小程序开发,上阿里云申请了个证书,使用文件验证 ... -
springboot2.0跨域配置
2018-07-04 22:11 5284springboot2.0跨域配置: 一、代码 ... -
微信小程序使用code换openid的方法(JAVA、SpringBoot)
2018-07-01 21:52 10398微信小程序序的代码中提示,使用code换取openid,但 ...
相关推荐
据研究显示,在执行相同的任务时,使用Groovy编写的程序通常只需要Java所需代码量的1/3到1/10。 #### Groovy的特点 - **简洁性**:Groovy简化了常见的编程任务,如文本处理、数据库访问和XML处理,使得这些任务变得...
接下来,我们将基于文档的部分内容对Groovy实现DSL的关键知识点进行详细解释。 ##### Groovy简介 Groovy是一种灵活的编程语言,旨在提供一种强大的脚本能力,同时保持与Java的高度兼容性。它支持多种编程范式,包括...
通过对这些代码的研究,你可以更深入地理解如何利用Groovy构建自己的DSL,包括如何设计API、如何利用闭包和元编程以及如何处理DSL的解析和执行。学习和掌握Groovy DSL的创建,能提升你在编写高效、可读性强的代码上...
3. **Gradle插件应用**:在Kotlin DSL中,可以使用`plugins {}`块代替Groovy中的`apply plugin:`,这种方式更加直观且类型安全。例如,应用Android插件: ```kotlin plugins { id 'com.android.application' } ...
Groovy DSL动态规则执行引擎是一种基于Groovy语言的领域特定语言(Domain-Specific Language)来构建规则引擎的解决方案。这种引擎特别适用于流程控制、风险管理系统以及动态接口配置,特别是那些需要快速迭代和低...
设计DSL语法 基于领域需求,设计DSL的语法结构。这一步骤需考虑语法的清晰度、一致性以及是否易于理解和使用。Groovy的灵活性允许开发者自由地定制语法,甚至可以通过注解或元类来定义新的语法元素。 #### 3. 实现...
此外,Groovy 3对语法做了进一步优化,使其更加符合现代编程习惯。 3. **动态与静态类型**:Groovy允许开发者选择动态类型或静态类型进行编程,通过`@CompileStatic`注解可以启用静态类型检查,提高代码的可靠性和...
通过实际项目,将理论知识应用于解决具体问题,如构建自动化脚本、编写简单的Web应用、实现DSL等,以加深对Groovy的理解。 六、进阶学习 进一步探索Groovy的高级特性,如Meta Object Protocol (MOP)、GroovyShell、...
Groovy的语法比Java更加简洁,它支持方法和变量的自动声明,以及类似Python的缩进风格。例如,可以使用`def`关键字定义变量,无需指定类型: ```groovy def var = "Hello, Groovy!" println var ``` 2. **...
1. **Groovy编译器**:SDK中的`groovy-3.0.6`目录可能包含了Groovy编译器,它是将Groovy源代码转换成Java字节码的工具,使得Groovy程序能够在Java平台上运行。 2. **GroovyShell和GroovyConsole**:这两个工具允许...
1. **Groovy语法基础**: - **简洁性**:Groovy的语法比Java更为简洁,例如,不需要分号结束语句,类定义和方法声明也更加紧凑。 - **动态类型**:不同于Java的静态类型,Groovy是动态类型的,变量的类型在运行时...
通过对这些材料的学习,开发者可以了解Groovy的语法、API以及如何在实际项目中运用它。同时,对于早期版本的Groovy,研究其历史和演进过程也能帮助我们理解语言的发展和改进。 总的来说,Groovy作为一款强大且灵活...
1. **基础语法**:Groovy的语法与Java有很高的相似性,但更加灵活。例如,变量声明可以省略类型,使用`def`关键字即可。此外,Groovy支持闭包,这是一种强大的代码块,常用于函数式编程。 2. **动态类型**:Groovy...
- **领域特定语言(DSL)**:Groovy的简洁语法使其成为创建DSL的理想选择,如构建配置文件、测试框架等。 6. **Groovy与其他技术的集成** - Groovy可以无缝集成到Spring框架中,创建Spring Bean和配置文件。 - ...
1. **简洁的语法**:Groovy的语法比Java更加精简,例如,可以省略分号、大括号,并且支持单行if语句和三元运算符。例如: ```groovy def age = 30 if (age > 18) println('成年') ``` 2. **动态类型**:与Java...
3. **领域规范语言(DSLs)**:Groovy可以方便地构建DSL,使得特定领域的代码更加简洁,易于理解和使用。 4. **生成器(Builders)**:生成器允许开发者以更自然的语法创建复杂的数据结构,如XML、HTML或Swing组件...
1. **Groovy的基本语法** Groovy语法类似于Java,但更加简洁。例如,变量声明不需要显式的类型声明,可以用`def`关键字来定义。类的定义也不像Java那样需要`public class`,只需要`class`即可。此外,Groovy支持...
1. **Groovy语法简介** - Groovy的语法简洁且易于理解,它融合了多种语言的特性,如Python的缩进、Ruby的语法糖以及Java的类型系统。 - Groovy支持动态类型和静态类型,动态类型允许你在不声明变量类型的情况下...
3. **闭包**:Groovy支持闭包,这是一种可以作为参数传递或作为返回值的匿名函数,类似于JavaScript的函数表达式。 4. **GString**:Groovy的字符串可以包含表达式,通过`${}`来嵌入变量或表达式的值,方便字符串...