Groovy:程序员的 DSL

2024-06-24 07:48
文章标签 groovy dsl 程序员

本文主要是介绍Groovy:程序员的 DSL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是DSL?

领域特定语言,针对一个特定的领域,具有受限表达性的一种计算机程序语言。可以看做是一种抽象处理的方式。

具有四个元素,第一个是计算机程序设计语言,使用DSL来指挥计算机做事情,语言性(一种特定的语言),受限的表达性,并不像同通用的设计语言那样具有广泛的能力,针对一个明确的领域。

分类有哪些?

外部DSL:不同于应用系统主要使用语言的语言,通常采用自定义语法,宿主应用的代码采用文本解析技术对外部DSL编写的脚本进行解析。例子如:正则表达式、SQL、AWK以及Struts的配置文件等

内部DSL:通用语言的特定语法,用内部DSL写成的脚本是一段合法的程序,但是它具有特定的风格,而且仅仅用到了语言的一部分特性,用于处理整个系统一个小方面的问题;

语言工作台:一种专用的IDE,用于定义和构建DSL,具体的讲,语言工作台不仅用来确定DSL的语言结构,而且是人们编写DSL脚本的编辑环境,最终的脚本讲编辑环境和语言本身紧密的结合在一起;

为什么需要DSL?

1、提高开发效率,通过DSL来抽象构建模型,抽取公共的代码,减少重复的劳动;

2、和领域专家沟通,领域专家可以通过DSL来构建系统的功能;

3、执行环境的改变,可以弥补宿主语言的局限性;

DSL的处理可能包含那几个步骤?

1、DSL脚本;

2、解析脚本;

3、语义模型;

4、生成代码或者执行模型;

为啥groovy能比较好的构建DSL?

1、不需要class文件,可以直接执行脚本;

2、闭包等特性以及语法的简介,使用非常灵活;

3、可以和java系统无缝的整合;

4、Groovy自身不是 DSL。 Groovy官方已经发布了较多基于 Groovy书写的 DSL,比如 GANT, GORM, XMLBuilder, HtmlBuilder等等;

使用groovy做DSL的例子?

1、一个自定义的dsl,例如这个:

ParseDsl.make {to "Nirav Assar"from "Barack Obama"body "How are things? We are doing well. Take care"idea "The economy is key"request "Please vote for me"xml}

2、那必须要有地方解析这个规则:

//groovy methodMissing如果找不到方法,就会调用这个方法 里面用到了这个特性

import groovy.xml.MarkupBuilder;
/**
* 解析一个自定义的DSL文本的类,类似解析规则
*/
class ParseDsl {String toTextString fromTextString bodydef sections = []def static make(closure) {ParseDsl memoDsl = new ParseDsl()closure.delegate = memoDslclosure()}def to(String toText) {this.toText = toText}def from(String fromText) {this.fromText = fromText}def body(String bodyText) {this.body = bodyText}def methodMissing(String methodName, args) {def section = new Section(title: methodName, body: args[0])sections << section}def getXml() {doXml(this)}def getHtml() {doHtml(this)}def getText() {doText(this)}private static doXml(ParseDsl memoDsl) {def writer = new StringWriter()def xml = new MarkupBuilder(writer)xml.memo() {to(memoDsl.toText)from(memoDsl.fromText)body(memoDsl.body)for (s in memoDsl.sections) {"$s.title"(s.body)}}println writer}private static doHtml(ParseDsl memoDsl) {def writer = new StringWriter()def xml = new MarkupBuilder(writer)xml.html() {head {title("Memo")}body {h1("Memo")h3("To: ${memoDsl.toText}")h3("From: ${memoDsl.fromText}")p(memoDsl.body)for (s in memoDsl.sections) {p {b(s.title.toUpperCase())}p(s.body)}}}println writer}private static doText(ParseDsl memoDsl) {String template = "Memo\nTo: ${memoDsl.toText}\nFrom: ${memoDsl.fromText}\n${memoDsl.body}\n"def sectionStrings =""for (s in memoDsl.sections) {sectionStrings += s.title.toUpperCase() + "\n" + s.body + "\n"}template += sectionStringsprintln template}
}

关于groovy中的闭包?

http://docs.codehaus.org/pages/viewpage.action?pageId=167477326

groovy中的闭包是一个匿名的代码块,可以接受参数,并返回一个返回值,也可以引用和使用在他周围的,可见域中定义的变量。Groovy 之所以包含闭包,是因为它可以让开发者写出更简约、更易懂的代码。Java 开发者通常用一个单方法的接口(Runable,采用Command设计模式),并结合匿名内部类来实现;而Groovy 则允许以一种更简易、直白的方式来实现。额外的,相较匿名内部类,闭包有很少量的约束,包括一些额外的功能。

例子代码:

//第一个例子
def shout = {src->return src.toUpperCase()}println shout("Hello World")//模拟一个for循环的例子,在List的循环中添加Closuredef names = ["alibaba-inc.com","bixiao.zy","hello world","iamzhongyong"]printInfo = {println "hello,${it},welcome"}names.each printInfo//Colsure作为方法的入参def closureMethod(Closure c) {c.call("iamzhongyong")
}
closureMethod { name->println "Closure called "+name
}//为参数提供默认值
greetString = { greet,name = "iamzhongyong" ->return "${greet},${name}"
}
assert greetString("welcome") == "welcome,iamzhongyong"
assert greetString("hello","bixiao.zy") == "hello,bixiao.zy"//使用闭包实现单方法接口
interface Test {def one()
}
def test = {println 'one'} as Test
test.one()//使用闭包实现多方法接口
interface Test {def one()def two()
}
def test = [one: {println 'one'},two: {println 'two'}] as Test
test.one()
test.two()

lambda和闭包(closure)的区别是什么

lambda就是匿名函数——即没有名字的函数。前面你已经看到过一些例子了。闭包就是封闭在其定义所处环境的任意函数。

 

http://lggege.iteye.com/blog/543730

http://docs.codehaus.org/pages/viewpage.action?pageId=167477326

http://groovy.codehaus.org/Builders

http://confluence.jetbrains.com/display/GRVY/Scripting+IDE+for+DSL+awareness

http://java.dzone.com/articles/groovy-dsl-simple-example

这篇关于Groovy:程序员的 DSL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089547

相关文章

【新闻】AI程序员要来了吗?阿里云官宣

内容提要 6 月 21 日,在阿里云上海 AI 峰会上,阿里云宣布推出首个AI 程序员。 据介绍,这个AI程序员具备架构师、开发工程师、测试工程师等多种岗位的技能,能一站式自主完成任务分解、代码编写、测试、问题修复、代码提交整个过程,最快分钟级即可完成应用开发,大幅提升研发效率。 近段时间以来,有关AI的实践应用突破不断,全球开发者加速研发步伐。有业内人士坦言,随着大模型性能逐渐提升,AI应

groovy之closure

什么是闭包(Closure) 在Groovy中,闭包是一段匿名的代码段,它可以有参数,返回值,并且能够赋值给一个变量。闭包中使用的变量可以是在闭包外部定义的,也可以是在闭包内部定义的。 闭包定义的语法如下 {[closureParameters ->] statements} 上面的方括号[]表示闭包的参数可有可无,所以正常的闭包可能包括如下这些类型: {item++} //item变量

某大厂程序员吐槽:离职交接时,新人被工作量吓退,领导却污蔑我故意劝退新人,我怒晒工作短信反击证明,新人看了后也决定走人了!

一位知名大公司的程序员分享了他离职时的遭遇:在交接工作时,新进的同事因工作量过大而感到压力,但出乎意料的是,他们的领导却指责我故意吓唬新人。为了证明自己的清白,我晒出了工作短信作为反击,结果连新人也决定离开。 在任何组织里,团队文化的优劣都是决定工作效率和质量的关键。一个和谐相处的团队不仅能提升工作效率,还能使工作氛围变得轻松愉快。 然而,一旦团队内部出现权力斗争或领导偏爱小团体、

1024程序员节 技术对抗赛 算法与安全答题 标准答案

请注意每次出题答案顺序都不一样,请仔细辨别   快查看计算题、专业题答案: 4根 11,24 对称加密算法 42 6787 题中选项皆有可能 远程控制软件 6次 25002550 593 2017年6月1日 x正比于根号n增加 15瓶药 具体题目: 关于钓鱼邮件的说法,下列错误的是:(B) A:即便邮箱有提供安全保护功能,所有送达邮箱的邮件也未必安全 B:

程序员绩效管理-可行性调研

针对这个市场进行了小范围的可行性调研。因为这个项目一开始就定义为走融资上市的路子,第一步是众筹起步。          总结的结论如下:          1、痛点是真的痛。研发企业对自己团队的开发效率是心知肚明,恨铁不成钢。          2、市场上类似的软件也不少,企业自己也在开发例如工时管理、日报月报等。          3、一般采用开发平台来提高效率(这是另

阿里云推出首个 AI 程序员!

AI圈最近又发生了啥新鲜事? 该栏目以周更频率总结国内外前沿AI动态,是快速了解AI发展趋势一个不错的方式,感兴趣的可以点击订阅合集以及时收到最新推送 DeepSeek Coder V2开源发布,首超GPT4-Turbo的代码能力 全球首个在代码、数学能力上与GPT-4-Turbo争锋的模型,DeepSeek-Coder-V2,正式上线和开源。DeepSeek-Coder-V2 沿用 Dee

Java进阶之路——从初级程序员到架构师,从小工到专家 Java程序员-10 发表于1小时前 原 Java进阶之路——从初级程序员到架构师,从小工到专家

https://my.oschina.net/u/3518116/blog/1510756?ref=myread 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题。希望这篇文章会是你看到过的最全面最权威的回答。 一: 编程基础 不管是C还是C+

深入学习-Gradle-自动化构建技术(二)Groovy-筑基

但是,如果你这个类或变量要用于其它模块的,建议不要使用 def,还是应该使用 Java 中的那种强类型定义方式,因为使用强类型的定义方式,它不能动态转换为其它类型,它能够保证外界传递进来的值一定是正确的。如果你这个变量要被外界使用,而你却使用了 def 类型来定义它,那外界需要传递给你什么才是正确的呢?这样会使调用方很疑惑。 如果此时我们在后面的代码中改变上图中 x1 的值为 String 类型

程序员为什么不能一次性写好,需要一直改Bug?

程序员在编写代码时不能一次性写好,而是需要不断修改Bug,这主要是由几个因素导致的: 复杂性:软件开发是一个高度复杂的过程,涉及到多个模块、功能、逻辑和数据的交互。即使是最有经验的程序员,也很难一次性预见并处理所有可能出现的问题。需求变更:在软件开发过程中,客户需求经常会发生变化。这些变更可能导致已经编写好的代码需要调整,从而引入新的Bug。技术更新:随着技术的不断发展,新的编程语言、框架和库不

极客新闻——11、程序员需要避免的10个坏习惯

本文笔记全部来自《极客新闻》——新鲜的技术资讯、权威的趋势剖析、别样的技术洞察 每位开发人员在自己的职业生涯、学习经历中,都会“开发”出一些坏习惯。 Traversy Media 的 Web 开发人员布拉德·特拉弗西(Brad Traversy)向读者展示了他自己有或是改不了的坏习惯。如果你已经有了这些毛病,希望你能够意识到它们,并可以开始改变。 1、休息不够 很多人或者说几乎所有人都