`

Groovy 与 DSL

阅读更多
一:DSL 概念
    指的是用于一个特定领域的语言(功能领域、业务领域)。在这个给出的概念中有 3个重点:

只用于一个特定领域,而非所有通用领域,比如 Java / C++就是用于通用领域,而不可被称为 DSL,同样也不可把 Groovy称为 DSL。
语言,必须经过编写后才可发挥它的功能。比如:五线谱编写后成乐谱; ANT编写用于编译; SVN命令编写后可对资源库进行操作; Shell编程; SQL编程; PL-SQL编程等等。
忽略具体的运行环境(媒介),可以是纸、 XML文件、命令行、 Shell、数据库等。

二:Groovy对 DSL的支持
    Groovy不是 DSL,而是通用的编程语言。但 Groovy却对编写出一个全新的 DSL提供了良好的支持,这些支持都来自于 Groovy自身语法的特性,比如:
不需要 class定义,直接执行脚本
Groovy语法的简洁
Groovy提供了更多通俗易懂的方法
省略()和;等
等等
    Groovy自身不是 DSL。 Groovy官方已经发布了较多基于 Groovy书写的 DSL,比如 GANT, GORM, XMLBuilder, HtmlBuilder等等。

三:我们的目标
    实现一种使用 Groovy语法书写、用于构建 HTML的(其实就是 HtmlBuilder)的简单 DSL,如下:
html {  
    head {  
        meta {  
              
        }  
    }  
    body {  
        table (style:'margin:5px;') {  
            tr ('class':'trClass', style:'padding:5px;') {  
                td {'Cell1'}  
                td {'Cell2'}  
                td {'Cell3'}  
            }  
        }  
    }  
}  


这段代码比较容易让人懂,很容易让人将 HTML与之对应起来。具体怎么实现能够通过这一段 DSL代码输出原始的 HTML呢?主要基于 Groovy的以下几个特性:

Groovy脚本,不用定义 class
Groovy的 invokeMethod方法
方法可不书写()
语句末尾省略;分号
不书写 return

四:代码分析
meta {  
}  
//这段代码的含义为:调用 meta方法,参数为一个闭包,闭包不执行任何代码。

table (style:'margin:5px;') {  
}  
//这段代码的含义为:调用 table方法,第一个参数为 Map,第二个参数为闭包。

tr ('class':'trClass', style:'padding:5px;') {  
                td {'Cell1'}  
                td {'Cell2'}  
                td {'Cell3'}  
}  
//这段代码的含义为:
//调用 tr方法,第一个参数为 Map,第二个参数为闭包。
//闭包中,调用了 3 个 td方法,参数都为一个闭包;闭包中直接返回了一个字符串。


五:代码实现
    将代码解读了以后,再结合 invokeMethod就很容易实现了,具体代码如下:
def invokeMethod(String name, args) {  
    print "<${name}"  
    args.each { arg ->  
        if (arg instanceof Map) {  
            arg.each {  
                print " ${it.key} ='${it.value}' "  
            }  
        } else if (arg instanceof Closure) {  
            print '>'  
            arg.delegate = this  
            def value = arg.call()  
            if (value) {  
                print "${value}"  
            }  
        }  
    }  
  
    println "</${name}>"  
}  
  
html {  
    head {  
        meta {  
              
        }  
    }  
    body {  
        table (style:'margin:5px;') {  
            tr ('class':'trClass', style:'padding:5px;') {  
                td {'Cell1'}  
                td {'Cell2'}  
                td {'Cell3'}  
            }  
        }  
    }  
}  


六:运行结果
<html><head><meta></meta>  
</head>  
<body><table style ='margin:5px;' >
<tr class ='trClass' style ='padding:5px;' >
<td>Cell1</td>  
<td>Cell2</td>  
<td>Cell3</td>  
</tr>  
</table>  
</body>  
</html> 


七:结论
   基于Groovy自身的语法简洁和众多特性,实现一个专属的DSL还是蛮简单的。
分享到:
评论

相关推荐

    Groovy DSL

    #### Groovy与DSL的关系 Groovy因其强大的灵活性和元编程能力,成为了构建DSL的理想选择。通过Groovy,开发者可以轻松地创建出针对特定业务场景的定制化语言,极大地提高了开发效率。例如,Groovy可以通过定义新的...

    用Groovy实现DSL领域定义语言

    在groovy中实现DSL领域特定语言的技术。 版权声明: 本系列文章是从原著《Groovy For Domain-Specific Languages》(原作者: Fergal Dearle)中翻译而来,从中加入了一些本人自己的读书笔记和理解。本系列文章不为...

    groovy 一个不错的文档 实现dsl

    这表明文档将介绍Groovy在DSL设计与实现方面的特性和优势。 #### 标签解读 - **标签**: "groovy for dsl" 该标签进一步强调了文档的重点是Groovy在DSL领域的应用。这意味着文档将深入探讨Groovy语言如何支持DSL的...

    Groovy DSL 动态规则(rule)执行引擎流程引擎特色风控系统规则引擎动态接口配置(低代码)

    自创Groovy DSL 动态规则(rule)执行引擎, 流程引擎. 特色 风控系统, 规则引擎, 动态接口配置(低代码)Groovy DSL 动态规则(rule)执行引擎。DSL(特定领域语言): 开发 和 业务 共识的语言。方便业务表达需求, 方便开发...

    groovy-dsl:创建Groovy DSL

    Groovy支持方法名与属性名之间的自由转换,这使得我们可以通过方法名来表达DSL中的关键字。例如,你可以定义一个配置DSL,允许这样的调用: ```groovy config { database 'mysql' user 'root' password '...

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

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

    groovy in action_中文

    4. **Groovy与DSL(领域特定语言)**:Groovy的强大在于它可以轻松创建DSL,用于简化复杂的配置或任务定义。在Android开发中,Gradle的构建脚本就是一个典型的Groovy DSL应用,使得构建配置更加直观。 5. **测试与...

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

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

    groovy-dsl-talk:关于在Groovy中创建DSL的闪电演讲

    Groovy DSL 关于利用Groovy支持特定领域语言的闪电演讲 资源 演示幻灯片: :

    groovy-ssh, 在 Groovy DSL上,基于SSH自动化工具.zip

    groovy-ssh, 在 Groovy DSL上,基于SSH自动化工具 Groovy SSH是基于DSL的自动化工具,提供远程命令执行和文件传输。https://gradle-ssh-plugin.github.io捐赠这是一个在Apache许可以版 2.0下许可以的开源软件。 欢迎...

    Groovy.for.Domain.Specific.Languages.pdf

    该书深入浅出地介绍了Groovy在DSL设计与实现中的独特优势,为读者提供了丰富的实践指导和理论基础。 ### Groovy与领域特定语言 #### 1. Groovy概述 Groovy是一种灵活、强大的脚本语言,它运行在Java平台上,能够...

    vertx-web-groovy-dsl:简单的Groovy DSL声明Vert.x Apex路由

    vertx-web-groovy-dsl Groovy DSL声明Vert.x Web路由 如果您使用Groovy,则本项目旨在提供另一种方法来使用vert-web定义网络路由,这种方式更具Groovy风格。 最有趣的功能是能够使用嵌套闭包以嵌套方式声明路由器...

    groovy-docker-dsl:Docker 的 Groovy DSL(想想 Fig 的健康检查和更改容器的重启)

    Groovy Docker DSL 使用 Groovy DSL 思考 ,您可以实现钩子、健康检查和监视包含 Dockerfile 的文件夹以进行更改,并根据需要自动重新构建和重新启动容器。 动机: Fig 很棒,但我需要一些可以让我做一些事情的...

    Groovy中文版教程

    这本书深入浅出地讲解了Groovy的各个方面,包括基础语法、面向对象特性、元编程、领域特定语言(DSL)构建以及与Java的协作等。 1. **基础语法**:Groovy的语法与Java有很高的相似性,但更加灵活。例如,变量声明...

    groovy-sdk-4.0.3

    - **构建工具**:Groovy被广泛用于构建工具,如Gradle,它的DSL(领域特定语言)是基于Groovy的,使构建配置更易于阅读和编写。 - **Web开发**:Grails是一个基于Groovy的Web框架,它简化了开发过程,提供了MVC架构...

    groovy-all-2.4.8.jar

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

    apache-groovy-sdk-3.0.6.zip

    10. **DSL(领域特定语言)**:Groovy易于创建内部DSL,这使得开发者可以为特定的业务场景定制简洁的编程语言。 综上所述,Apache Groovy SDK 3.0.6是开发者学习、开发和部署Groovy应用程序的必备工具,包含了从...

    实战groovy.rar

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

Global site tag (gtag.js) - Google Analytics