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还是蛮简单的。

时间: 2024-10-10 06:00:34

Groovy 与 DSL的相关文章

Groovy语法糖以及DSL

前言 Why 初次接触到Groovy是在实习中接触到一个 纯Groovy写的项目,当时看了下这不就是没有分号的Java么,而且也是有年纪的语言了,并不想投入时间学习.后来工作中越来越多的看到Groovy的身影,Gradle,Spring Cloud Contract等等都支持Groovy作为DSL(领域专用语言),同时Groovy在测试领域也有一席之地,因为语法简单,可以很快捷的编写Test Case,总之可以把Groovy看作Java的小伙伴,好帮手. What Groovy是JVM平台上的一

即时编译和打包您的 Groovy 脚本(转)

在本文中将会涉及到: 使用 CliBuilder 来实现对命令行选项的支持,脚本执行时所需要的参数将通过命令行选项的方式传递. 使用 GroovyClassLoader 加载 Groovy class. 使用 AntBuilder 来构建 Jar 包. 开始之前 关于本文 也许您写了一些有趣或实用的 Groovy 脚本并希望与您的朋友分享,可是您并不想强迫他们安装 Groovy,所以您也许想要做一个小工具让您的朋友们能够用它编译您的 Groovy 脚本并且生成一个可执行的 Jar 包.本文将介绍

前端模块化管理

转自网络 Task Runner Gulp.Grunt和Make(常见于c/cpp).Ant.Maven.Gradle(Java/Android).Rake.Thor(Ruby)一样,都是是Task Runner.用来将一些繁琐的task自动化并处理任务的依赖关系.其中有些是基于配置描述的,描述逻辑比较费劲,比如Ant基于xml.还有些就是代码,比较灵活,个人偏好这种.比如Rake.Thor.Gulp.Gradle.对于Gradle来说也有些蛋疼.因为它本身是Groovy的DSL.如果要深入使用

构建工具的发展及Android Gradle快速上手

前话: 最近谷歌宣布官方不再维护Eclipse ADT了,之后将更加专注于Android Studio的功能和性能上的改进,早在2013年的Google IO大会上首次推出了Android Studio,当时刚出来的时候我就好奇的去下载体验了一下,想看一下新开发工具的优势在哪里,据官方介绍,最吸引我的一点就是使用Studio使用了Gradle编译系统,可以支持很灵活的定制需求,而我当时正在研究当成库使用的APK(就是现在的aar文件,不过当时还没有出身),刚好遇到了ADT编译系统的限制,所以当时

串讲Apache OFBiz技术架构

从决定读ApacheOFBiz源码到现在不知不觉一年就过去了.这一年因为各种原因,导致源码读得断断续续.其实最大的问题还是因为无法深刻得理解里面的一些东西,导致热情骤减.直到最近,公司在开发的一个"应用快速开发平台"引发了我的一些思考,所以决定再把源码拿出来重新阅读.到最近对其架构设计近乎迷恋. 个人认为对于ApacheOFBiz的剖析可以分成三大块来进行:技术.业务.数据库设计.这三块个个都是非常顶尖的水准,每个方向深入进去都可以学到很多东西.之前只是对OFBiz各个部分的单独解析,

敏捷开发总结(2)开发过程活动

1.需求及缺陷管理(jira) 收集需求,描述需求      收集缺陷,描述需求 2.构件管理(nexus)        构件的创建.存储.查询.引用 maven构件仓库,连接中央仓库 3.分布式版本控制(git&gitlab)            代码项目仓库 缺陷管理平台 代码片段复用 4.代码项目管理(gradle) Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具 基于groovy的dsl声明式配置 项目对象模型(PO

Gradle 庖丁解牛(构建源头源码浅析)

1 背景 陆陆续续一年多,总是有人问 Gradle 构建,总是发现很多人用 Gradle 是迷糊状态的,于是最近准备来一个"Gradle 庖丁解牛"系列,一方面作为自己的总结,一方面希望真的能达到标题所示效果,同时希望通过该系列达到珍惜彼此时间的目的,因为目前市面上关于 Gradle 的教程都是在教怎么配置和怎么编写插件,很少有说明 Gradle 自己到底是个啥玩意的,还有是如何工作的,本系列以官方 release 3.4 版本为基础. 废话不多说,标题也表明了本篇所总结的内容 --

来自Gradle的hello world

来自Gradle的hello world Android Studio使用Gradle 构建项目 为什么要用Gradle? Gradle是比较先进的构建系统,也是一个很好的构建工具,允许通过插件自定义构建逻辑 为什么Android Studio选择Gradle? 使用领域专用语言(Domain Specific Language)来描述和处理构建逻辑.(以下简称DSL) 基于Groovy.DSL可以混合各种声明元素,用代码操控这些DSL元素达到逻辑自定义. 支持已有的Maven或者Ivy仓库基础

Gradle引人注目的特性集

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言限于Java.Groovy和Scala,计划未来将支持更多的语言. 1.可表达性的构建语言 在Gradle脚本中每一个元素都有一个与Java类一对一的映射.在许多情况下Groovy化的类相对于Java,代码更加简洁,并且允许使用如闭包这样的新语言特性. 2.Gradle就是Groovy Ant和maven这样杰出