欢迎来到天天文库
浏览记录
ID:19507148
大小:50.50 KB
页数:15页
时间:2018-10-02
《演化架构和紧急设计 使用 groovy 构建 dsl》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、演化架构和紧急设计使用Groovy构建DSL关于本系列本系列旨在从全新的视角来介绍经常讨论但是又难以理解的软件架构和设计概念。通过具体示例,NealFord将帮助您在演化架构和紧急设计的敏捷实践方面打下坚实的基础。通过将重要的架构和设计决定推迟到最后责任时刻,可以防止不必要的复杂度降低软件项目的质量。Groovy提供各种特性使构建DSL更为容易,在DSL中支持数量是一个常见的需求。人们总是需要很多数量:7英寸、4英里、13天等。Groovy允许您通过开放类直接添加对数量的支持。开源类允许您重新打开现存类并通过在类中添加、删除或修改方法对其进行修改—一个强大但危险的机制。幸运
2、的是,这有安全的方法来实现这一任务。Groovy支持两种不同的开放类语法:categories和ExpandoMetaClass。通过categories开放类categories的概念是从Smalltalk和Objective-C语言(见参考资料)中借用的。一个categories可以使用use块指令,围绕代码调用创建一个包装器,含有一个或多个开放类。通过一个示例更好的理解categories概念。清单1演示了我已经添加到String中的新方法camelize()的测试,该方法可以将带下划线的字符串转换成驼峰式大小写:清单1.测试演示camelize()方法classTe
3、stStringCategoryextendsGroovyTestCase{defexpected=["event_map":"eventMap","name":"name","test_date":"testDate","test_string_with_lots_of_breaks":"testStringWithLotsOfBreaks","String_that_has_init_cap":"stringThatHasInitCap"]voidtest_Camelize(){use(StringCategory){expected.each{key,value->a
4、ssertEqualsvalue,key.camelize()}}}}在清单1中,我使用原始的和转换后的案例创建了一个expected散列值,然后根据映射的迭代包装StringCategory,希望将每个关键词驼峰化(camelized)。注意在use块中,您不需要特别做什么就可以调用类中的新方法。StringCategory的代码在清单2中显示:清单2.StringCategory类classStringCategory{staticStringcamelize(Stringself){defnewName=self.split("_").collect(){it.sub
5、string(0,1).toUpperCase()+it.substring(1,it.length())}.join()newName.substring(0,1).toLowerCase()+newName.substring(1,newName.length())}}categories是一个常规类,包含静态方法。静态方法必须要有一个参数,这是您将要增加的类型。在清单2中,我声明了一个单独的静态方法,接收String参数(通常称为self,但是您可以随意为其命名),代表我向其中添加方法的类。方法体包含Groovy代码,通过下划线将字符串分成带分隔符的几块(这就是spl
6、it("_")方法所做的),然后将字符串收集到一起,在合适的地方使用大写字母将它们拼接起来。最后一行确保返回的第一个字符是小写的。当您使用StringCategory时,您必须在use块中访问它。在use块的圆括号中有多个categories类,之间用逗号隔开,这是合法的。这是在DSL中使用开放类表示数量的另一个实例,考虑清单3中的代码,实现了一个预约日历:清单3.一个简单的日历DSLdefcalendar=newAppointmentCalendar()use(IntegerWithTimeSupport){calendar.addnewAppointment("Dent
7、ist").from(4.pm)calendar.addnewAppointment("Conferencecall").from(5.pm).to(6.pm).at("555-123-4321")}calendar.print()清单3实现了和“连贯接口”中Java实例一样的功能,但是增强了语法,其中包括了在Java代码中所不能实现的。例如,请注意Groovy允许在有些地方删除括号(像围绕add()方法的参数这种情况)。我也可以调用像5.pm这样对开发人员来说稀奇古怪的命令。这是一个打开Integer类(在Gro
此文档下载收益归作者所有