`
txf2004
  • 浏览: 7067731 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Groovy探索 关于方法名的DSL

阅读更多

Groovy探索 关于方法名的DSL

Groovy语言最引以为豪的特点就是DSL了,关于DSL的定义以及分类、优点等,就不是本篇所要阐述的了,大家可以上网查,网上有大量的这方便的介绍。Groovy语言是非常便于设计内部DSL了,在这方面,我的Groovy探索系列已经有了很多专题谈到过使用Groovy语言创建内部DSL的一些方面。本篇所要探索的是一个关于Groovy语言DSL的一个非常小的方面、也是非常不起眼的方面:关于方法名的DSL

说到方法名的DSL,其实我们在Groovy语言中已经有了非常广泛的应用。比如,我们在一开始学习Groovy语言,就会写一个“HelloWorld”的程序来开始我们的第一个Groovy语言程序,它的代码大致如下:

public class HelloWorld{

/**

* @param args

*/

public static void main(def args){

// TODO Auto-generated method stub

println 'Hello,World!'

}

}

它的运行结果就不要我多说了。我们感兴趣的是“println”方法,我们都知道,在Java语言中,该对应的方法是“System.out.println”。将长的方法名——“System.out.println”写成了“println”,就是Groovy语言中关于方法的DSL的一个应用。这样的好处主要是两个方面:第一是编码的快捷性增加,输入“println”当然也输入“System.out.println”方便了很多;第二就是可读性的增强,这是DSL的追求,“println”的可读性也比“System.out.println”强。

那么,我们在实际的编码过程中,又该如何实现形如“println”这样的DSL呢?

关于方法名的DSL,在Groovy语言中,有三种实现方法,先说其中的两种,它们分别是静态引入和使用“as”关键字。我们还是以一个例子来说明。

比如,我们想取得系统的当前时间,Java语言的方式是如下的:

System.out.println(System.currentTimeMillis())

有了静态引入,我们在Groovy语言中的编码将是这样的:

import static System.currentTimeMillis

/**

* @author Administrator

*

*/

public class Testor2{

/**

* @param args

*/

public static void main(def args){

// TODO Auto-generated method stub

println currentTimeMillis()

}

}

当然,我们还可以更进一步,使用“as”关键字的代码则会是这样的:

import static System.currentTimeMillis as now

/**

* @author Administrator

*

*/

public class Testor2{

/**

* @param args

*/

public static void main(def args){

// TODO Auto-generated method stub

println now()

}

}

这样,我们就更加DSL了,“now”方法很形象的告诉我们要取的是现在的时间,这样就更有DSL的意味了。

知道了这两中实现DSL方法的使用,我们就可以广泛的使用到它们,比如,我们在Groovy语言的编码过程中,使用到了旧的Java包或库,里面所有的静态方法,都可以这样用,用来简化我们的编码,方便我们的理解。同时,我们自己的工具包,我们定义的很多静态工具方法,也都可以这样使用。

第三种方法就是定义闭包来实现DSL,提高代码的可读性。我们还是以一个简单的例子来说明。

我们现在来模拟某个网上购物程序,现在我们有如下的一个商品类,用来模拟摆在网上买卖的商品:

public class Goods{

String no

String name

float price

int count

}

为了示例的简单,我们尽量简化了这个商品类,只有四个属性:商品的编码、商品名称、商品单价以及购买的数量。

下面是我们的购买者账户类:

public class Account{

String code

String name

def goodses

def Account(code,name)

{

this.code = code

this.name = name

this.goodses = []

}

def buy(Goods goods)

{

this.goodses << goods

}

def view()

{

this.goodses.each

{

println "${it.name}"

}

}

}

它也很简单,只有两个属性,用户编码和姓名。后面有两个方法,“buy”方法用来完成买商品的动作,而“view”用来查看买了哪些商品。

下面,我们就可以来测试它们。我们先实例化一个账户,然后实例化她要买的几件商品,如下:

def account = new Account('09833','Tom')

def knife = new Goods(no:'1001',name:'knife')

def flower = new Goods(no:'1022',name:'flower')

接着,我们来定义一个可读性好的闭包,如下所示:

def buy = account.&'buy'

这就是我们的一种DSL的实现方法,下面我们就可以使用这个DSL,如下:

buy knife

buy flower

我们的账户买了两件商品,分别是小刀和鲜花,“buy knife”和“buy flower”,看起来多好的阅读性啊!

这就是DSL的效果。

当然,我们接着还有些测试代码,来查看我们所买的商品是否买到了:

println "dear ${account.name},you have bought: "

def view_goods = account.&view

view_goods()

运行结果为:

dear Tom,you have bought:

margin: 0cm 0cm 0pt; t

分享到:
评论

相关推荐

    groovy-sdk-4.0.3

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

    groovy_demo

    在"groovy_demo"项目中,我们将会探索Groovy的基础概念和核心特性,这对于初学者来说是一个很好的起点。下面将详细讨论Groovy的相关知识点。 1. **Groovy语法基础**: - **简洁性**:Groovy的语法比Java更为简洁,...

    groovy-sdk-2.4.3.zip

    总之,"groovy-sdk-2.4.3.zip"提供了开发和运行Groovy程序所需的一切,无论是初学者还是经验丰富的开发者,都可以利用这个SDK来探索和利用Groovy的强大功能。通过学习和使用Groovy,开发者可以提高生产力,简化代码...

    groovy 经典入门 通俗易懂

    以上内容仅为Groovy入门的基础知识,Groovy还有更多高级特性如AST转换、GroovyShell、 Grape依赖管理等,等待你进一步探索。通过阅读《Groovy经典入门推荐版》PDF,你将能够全面了解这个语言,并迅速上手。

    实战groovy.rar

    进一步探索Groovy的高级特性,如Meta Object Protocol (MOP)、GroovyShell、 Grape依赖管理系统等,提升编程技巧。 七、社区资源与工具 积极参与Groovy社区,利用官方文档、Stack Overflow、Groovy Slack等平台获取...

    Groovy学习资料(包括Groovy in action 的中英文以及API)

    因此,无论是对于Java开发者寻求扩展技能,还是对于想要探索新语言特性的程序员,Groovy都是一门值得深入学习的语言。 总的来说,"Groovy in Action"提供了全面的学习材料,配合API文档,可以帮助开发者迅速掌握...

    Programming Groovy 2

    ### 关于《Programming Groovy 2》的知识点详解 #### 一、Groovy语言概述 Groovy是一种基于Java平台的动态编程语言,它为开发者提供了一种简洁且强大的语法结构来构建应用程序。Groovy的设计旨在与Java代码无缝...

    Java Groovy

    无论是希望通过引入Groovy来提高开发效率,还是想要探索新的编程范式,《Making Java Groovy》都是一本值得推荐的指南。本书不仅详细介绍了Groovy的核心特性及其在Java项目中的应用方式,还提供了丰富的实践案例和...

    apache-groovy-sdk-3.0.3.zip

    通过这个SDK,你可以充分体验Groovy的强大功能,例如闭包、元编程、动态类型和DSL(领域特定语言)的创建。同时,结合Gradle,你可以在大型项目中构建复杂的构建逻辑,提高开发效率。 总的来说,Apache Groovy SDK ...

    groovy in action

    - 探索Groovy在构建DSL和元编程中的应用。 - 熟悉Grails框架,从而快速开发Web应用。 - 掌握Groovy的并发处理能力,优化多线程程序。 - 获得解决实际问题的策略和技巧,提高开发效率。 总之,《Groovy in Action》...

    groovy入门经典

    5. **运算符重载和方法缺失**:Groovy允许自定义运算符,同时,如果对象没有某个方法,Groovy会尝试寻找与之相似的方法名,这被称为方法缺失。 6. ** Grape**:Grape是Groovy的依赖管理工具,类似Java的Maven或...

    IBM 实战 Groovy

    7. **减少代码冗余**: Groovy支持多种方法来减少代码冗余,如元编程和DSL(领域特定语言)。 8. **函数式编程**: Groovy支持函数式编程风格,包括闭包和柯里化等高级特性。 9. **元编程(MOP)**: Groovy的元编程能力...

    groovy调用java-se类库学习案例 Java学习资料

    此外,Groovy还提供了许多Java没有的特性,如闭包(Closure)、元编程(Metaprogramming)和DSL(领域特定语言)构造,这些都极大地扩展了Groovy的能力。在与Java SE类库交互时,你可能会发现这些特性使代码更具表达...

    lang-groovy-2.0.0-final.zip

    Groovy的动态性和灵活性使得它成为编写脚本、构建工具、测试代码以及领域特定语言(DSL)的理想选择。 接下来,我们转向Lucene-Sugar。Lucene是Apache软件基金会的一个开源项目,它提供了一个高性能、可扩展的全文...

    DSLs实战-DSLs in Action

    ### DSLs实战——深入探索领域特定语言 #### 引言 《DSLs实战》是一本由Debasish Ghosh撰写的书籍,旨在帮助读者深入了解领域特定语言(DSL)的概念、设计与实现。本书通过丰富的案例研究和技术细节,为读者提供了一...

    jenkins-workflow-examples:探索DSL的工作流程示例

    在Jenkins中,Pipeline DSL允许用户使用Groovy语法来创建声明式或脚本式的Pipeline定义。Groovy是一种动态类型的Java方言,其语法简洁,适合编写配置脚本。 **Pipeline的两种模式** 1. **声明式Pipeline...

    grooid-tools:使用 Groovy 帮助 Android 开发的工具

    - **DSL (领域特定语言)**:Groovy 的强大语法支持构建 DSL,使得构建配置更加直观和易读。 - **自动化测试**:Groovy 可以用于编写测试脚本,如 Espresso 测试或 instrumentation 测试,简化测试编写和维护。 4....

    groovy-android-example

    这个名为“groovy-android-example”的项目,正如其标题所示,是一个使用Groovy语言开发Android应用的示例。通过深入理解这个项目,我们可以学习如何利用Groovy的强大特性来优化Android开发流程。 在Android开发中...

    groovy-presentation

    这个名为"groovy-presentation"的资源可能是一个关于Groovy语言的演示模板,适合于教学或分享Groovy知识的场合。它可能包含一系列幻灯片,涵盖了Groovy的基本概念、语法特性、优势以及如何在实际项目中应用Groovy等...

Global site tag (gtag.js) - Google Analytics