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

Groovy探索之闭包 六

发布时间:2020-12-14 16:59:15 所属栏目:大数据 来源:网络整理
导读:??????????????????????????????? Groovy探索之闭包 六 ? ? 探索闭包的应用是一件很有意思的事,它的有意思在于我们永远不知道有哪些地方不能应用到闭包,或者说在每一个角落,你都能找到闭包让人眼睛一亮的应用。今天到谈到的是闭包的有关于DSL的应用。DSL
??????????????????????????????? Groovy探索之闭包 六
?
?
探索闭包的应用是一件很有意思的事,它的有意思在于我们永远不知道有哪些地方不能应用到闭包,或者说在每一个角落,你都能找到闭包让人眼睛一亮的应用。今天到谈到的是闭包的有关于DSL的应用。DSL应该是这两年才兴起的一个概念,有关它的一些知识,请查阅相关文档。
DSL的优越性在于它的接近自然语言,以及它的编码的方便和快捷。而闭包天生能够体现DSL的这些优越性,因此,它被选做DSL的一种实现就不足为奇了。
下面试着举出几个例子来说说闭包在这方面的应用。
比如,有一个公司的人事管理有这样的一些规定:员工每个月迟到3次会怎么,早退三次会怎么,请假三次又会怎么,等等,等等。
在实现这样的一个功能的时候,我们把员工的出勤记录分为这样的一些状态:“O”代表按时出勤;“L”代表迟到;“H”代表请假;“E”代表早退。
我们有一个TimeLog的类为员工做出勤记录:
?
class TimeLog
{
??? String id
??? String name
??? String[] states
}
?
?
?
假设一个员工的出勤记录是这样的:
??? ?
??? ? def timelog = new TimeLog(id: '123' ,name: 'tom' )
??? ?
??? ? def states = [ 'O' , 'L' , 'E' , 'O' , 'H' ,
??? ??????????????? 'O' , 'O' ]
??? ?
??? ?timelog.states = states
?
?
应用闭包,我们可以写出如下的代码来:
??? ?
??? ? def IfThreeTimes = {
?????? ?state,timeLog,Closure closure ->
?????? ?? int i = 0
?????? ?? for (tl in timeLog.states)
?????? ??{
?????? ?????? if (tl == state&&i == 3 )
?????? ?????? {
?????? ????????? closure. call ()
?????? ????????? break
?????? ?????? }
?????? ?????? else if (tl == state )
?????? ?????? {
?????? ????????? i++
?????? ?????? }
?????? ??}
??? ?}
?
?
闭包名为“IfThreeTimes”,意思是“如果三次了”,很好理解。它的参数有“state”,代表的是状态,是什么三次了,迟到还是请假。“timeLog”是某一个员工的出勤记录。最后一个参数是一个闭包,“closure”指的是三次了以后要怎么处理,可能的处理有:扣工资,没有奖金,不能评优秀等等。
具体到如果我们要处理迟到的问题,我们可以使用curry方法再做一次抽象,代码如下所示:
?
??? ? def IfThreeTimesLate = IfThreeTimes.curry( 'L' )
?
?
最后,我们来测试我们的 DSL
?
??? ?IfThreeTimesLate(timelog){
?????? ? println 'You will lose money'
??? ?}
???
?
结果为:
You will lose money
?
?
做这样的DSL编码是不是很有意思。下面再来看一个例子。
公司有各种各样的申请,如“请假申请”,“部门调动申请”,“求职申请”等等,这些申请都由相关人员进行批准或否决。
如请假申请类:
?
class Holiday
{
??? String id
??? String name
??? String beginDate
??? String endDate
??? String reason
??? boolean approved
}
?
?
下面还有一个求职申请类:
?
class Offer
{
??? String name
??? String reason
??? boolean approved
}
?
?
由上面的需求,我们可以创建如下的闭包:
??? ?
??? ? def IfApproved = {
?????????? ?which,Closure closure ->
?????????? ?? if (which.approved)
?????????? ??{
?????????? ?????? closure. call ()
?????????? ??}
??? ?}
?
?
参数“which”是需要输入哪一种申请;同样,参数“closure”代表如果申请成功了的话,要做些什么。
??? ?
??? ? def holiday = new Holiday(id: '123' ,name: 'tom' ,approved: false )
??? ?
??? ? def offer = new Offer(name: 'mike' ,approved: true )
???
??? ?IfApproved(holiday)
??? ?{
?????? ? println 'You will have a holiday'
??? ?}
??? ?
??? ?IfApproved(offer)
??? ?{
?????? ? println 'good,your offer is approved'
?}
?
运行结果为:
good,your offer is approved
?
?
这个例子,除了使用到闭包,还使用到Groovy语言的动态特性,共同完成了这样一个DSL的编写。
上面的例子都很小,也很简单,但是能够帮助我们整理闭包在DSL方面的应用,我用来借以抛砖引玉,使得我们能够在今后的应用中写成更好的DSL来。

(编辑:李大同)

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

    推荐文章
      热点阅读