加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy探索 关于方法名的DSL

发布时间:2020-12-14 17:07:59 所属栏目:大数据 来源:网络整理
导读:???????????????????????????? Groovy 探索 关于方法名的 DSL ? ? ? ? Groovy 语言最引以为豪的特点就是 DSL 了,关于 DSL 的定义以及分类、优点等,就不是本篇所要阐述的了,大家可以上网查,网上有大量的这方便的介绍。 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:

knife

flower

?

?

好了,最后总结一下:在Groovy语言中,我们有三种方法来实现有关方法名的DSL,分别是:静态引入、使用“as”关键字和定义可读性的闭包。

最后,值得注意的是,我上面关于静态引入的代码,是在Groovy1.5以上的版本运行成功的,而Groovy1.0版本是不能编译静态引入的代码的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读