`
iamzhongyong
  • 浏览: 804435 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DSL的基本介绍(groovy来进行构建)

 
阅读更多

什么是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,例如这个:

1
2
3
4
5
6
7
8
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如果找不到方法,就会调用这个方法 里面用到了这个特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import groovy.xml.MarkupBuilder;
/**
* 解析一个自定义的DSL文本的类,类似解析规则
*/
class ParseDsl {
 
    String toText
    String fromText
    String body
    def sections = []
 
     
    def static make(closure) {
        ParseDsl memoDsl = new ParseDsl()
        closure.delegate = memoDsl
        closure()
    }
 
    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 += sectionStrings
        println template
    }
}

 

关于groovy中的闭包?

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

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

例子代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//第一个例子
def shout = {src->
        return src.toUpperCase()
    }
 println shout("Hello World")
  
 //模拟一个for循环的例子,在List的循环中添加Closure
 def 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

 

 

 

1
0
分享到:
评论
1 楼 huan19900606 2018-08-09  
像haskell这些脚本语言很容易定义DSL,实现对应的词法语法解析器。学习DSL,应该先学习好AST(抽象语法树),这样可以设计出更合理的DSL。可以参考这篇文章:程序语言进阶之DSL与AST实战解析:http://www.fed123.com/chengxuyuyanjinjiezhidslyuastshizhanjiexi/izhanjiexi/

相关推荐

    Groovy DSL

    通过深入学习本书,读者不仅能够掌握使用Groovy构建DSL的基本原理和技术细节,还能了解到如何在实践中有效地运用这些知识来提高软件开发的效率和质量。 总之,Groovy作为一种强大的脚本语言,不仅具备与Java无缝...

    groovy 一个不错的文档 实现dsl

    - **配置文件**: 使用Groovy作为配置语言,如Gradle构建脚本中的Groovy DSL。 - **测试框架**: 如Spock框架使用Groovy实现的BDD风格的测试DSL。 - **应用开发**: Groovy可以用来创建内部DSL,用于简化复杂系统的开发...

    groovy-dsl:创建Groovy DSL

    通过对这些代码的研究,你可以更深入地理解如何利用Groovy构建自己的DSL,包括如何设计API、如何利用闭包和元编程以及如何处理DSL的解析和执行。学习和掌握Groovy DSL的创建,能提升你在编写高效、可读性强的代码上...

    Android-从Groovy转换为KotlinDSLforGradle专注于Android

    Groovy是早期Gradle构建系统的主要语言,而Kotlin DSL(Domain Specific Language)则是近年来逐渐流行的趋势,特别是在Android开发中。Kotlin DSL提供了更简洁、类型安全的构建脚本,提升了开发效率和代码可读性。 ...

    Groovy DSL 动态规则(rule)执行引擎

    Groovy DSL动态规则执行引擎是一种基于Groovy语言的领域特定语言(Domain-Specific Language)来构建规则引擎的解决方案。这种引擎特别适用于流程控制、风险管理系统以及动态接口配置,特别是那些需要快速迭代和低...

    Groovy中文版教程

    7. **Grails**:Groovy的一个著名应用是Web框架Grails,它使用Groovy语言和DSL来加速开发过程,提供模型-视图-控制器(MVC)架构。 8. **Gradle**:构建工具Gradle的默认脚本语言就是Groovy,它结合了Ant的灵活性和...

    Groovy应用(基本操作)

    Groovy常用于构建工具,如Gradle,它的DSL(领域特定语言)使得构建配置更加易读。此外,Groovy Shell和Groovy Console提供交互式环境来测试和学习Groovy代码。 8. **元编程** Groovy支持元编程,允许在运行时...

    groovy-all-2.4.8.jar

    - **领域特定语言(DSL)**:Groovy的简洁语法使其成为创建DSL的理想选择,如构建配置文件、测试框架等。 6. **Groovy与其他技术的集成** - Groovy可以无缝集成到Spring框架中,创建Spring Bean和配置文件。 - ...

    Groovy.for.Domain.Specific.Languages.pdf

    书中通过多个实际案例展示了如何使用Groovy构建DSL,涵盖了配置管理、数据处理、Web服务定义等多个方面。例如,通过Groovy可以创建一个用于配置数据库连接的DSL,简化了原本繁琐的XML配置文件,提高了配置的灵活性...

    groovy模板

    Groovy因其易于理解和构建DSL的能力而闻名。开发者可以利用Groovy创建简洁、直观的语言来表示特定领域的任务。比如,`ZhongHang2016.groovy`和`Zhongxin2011.groovy`可能代表了两种不同的银行操作的DSL,使得操作...

    实战groovy.rar

    Groovy与Java共享相同的类库和JVM,这使得它成为Java开发者的理想选择,尤其在构建脚本、自动化任务、Web服务和领域特定语言(DSL)等方面。 二、Groovy语法特性 1. 更简洁的语法:Groovy允许开发者使用更少的代码...

    Groovy User Guide

    - **内容:** 介绍了 Groovy 的高级特性,如闭包、元编程、DSL 构建等。 - **适用人群:** 已经熟悉 Groovy 基础语法的开发者。 3. **Ant Task 故障排除 (Ant Task Troubleshooting)** - **内容:** 提供了处理 ...

    Programming Groovy 2

    5. **高级主题**:涵盖Groovy 2中的新增特性,例如类型推断、静态类型检查等,以及如何使用Groovy构建领域特定语言(DSL)。 6. **案例研究**:通过实际案例展示如何将Groovy应用于构建脚本、测试框架等领域。 #### ...

    Groovy入门经典 中英文版本

    Groovy是一种基于Java平台的动态、灵活的编程语言,它设计...通过学习这本书,你将掌握Groovy的基本语法、面向对象编程、元编程、Gradle构建、Web开发以及DSL设计等多个方面,从而能够更高效地利用Groovy解决实际问题。

    groovy-binary-1.6.4

    Groovy结合了Java的静态类型系统和Python、Ruby等动态语言的灵活性,使得它在编写脚本、构建工具、Web开发以及领域特定语言(DSL)创建等方面表现出色。"groovy-binary-1.6.4"是Groovy的一个特定版本,发布于2009年9...

    Groovy 学习资料

    - **DSL(领域特定语言)构建**:Groovy非常适合构建DSL,因为它具有强大的字符串模板和元编程能力。 3. **Groovy与Java的互操作性** - **Java对象直接使用**:Groovy可以无缝地使用Java对象,反之亦然。 - **...

    apache-groovy 2.4.13

    作为Java生态系统的组成部分,Groovy经常被用于构建脚本、自动化任务、Web应用以及领域特定语言(DSL)的创建。在2.4.13版本中,Groovy继续提供高效、简洁的编程体验,同时包含了自2.4系列以来的多项改进和修复。 ...

    groovy基础教程源码,很全面

    Groovy编译器允许在抽象语法树(AST)级别进行操作,开发者可以通过自定义AST转换来扩展语言特性。 文件`Groovy_Workspace`可能包含了各种Groovy代码示例,展示了语言的不同用法;而`Gradle_workspace`可能包含了...

    groovy_demo

    - **自定义DSL**:Groovy的简洁语法和元编程能力使得构建自己的DSL变得容易,常用于配置和构建工具,如Gradle。 6. **集合操作**: - **Groovy的集合库**:提供了丰富的集合操作,如`each`、`collect`、`inject`...

Global site tag (gtag.js) - Google Analytics