实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程
2009-11-19 00:00:00 来源:WEB开发网输入 groovy -cp /jars/commons-lang-2.4.jar:. CommonsTest.groovy 以运行测试(当然,您需要修改在系统中保存 JAR 的路径)。
元编程和 REST
为了不让您产生元编程只对 单元测试有用的误解,下面给出了最后一个例子。回忆一下 “实战 Groovy:构建和解析 XML” 中可以预报当天天气情况的 RESTful Yahoo! Web 服务。通过将上述文章中的 XmlSlurper 技巧与本文的元编程技巧结合起来,您就可以通过 10 行代码查看任何 ZIP 码所代表的位置的天气信息,如清单 17 所示:
清单 17. 添加一个 weather 方法String.metaClass.weather={->
if(!delegate.isInteger()){
return "The weather() method only works with zip codes like '90201'"
}
def addr = "http://weather.yahooapis.com/forecastrss?p=${delegate}"
def rss = new XmlSlurper().parse(addr)
def results = rss.channel.item.title
results << "\n" + rss.channel.item.condition.@text
results << "\nTemp: " + rss.channel.item.condition.@temp
}
println "80020".weather()
//output
Conditions for Broomfield, CO at 1:57 pm MDT
Mostly Cloudy
Temp: 72
可以看到,元编程提供了极好的灵活性。您可以使用本文介绍的任何(或所有)技巧来向任意数量的类添加方法。
结束语
要求世界因语言的限制而改变显然不切实际。使用软件建模真实世界意味着需要有足够灵活的工具来处理所有极端情况。幸运的是,使用 Groovy 提供的闭包、ExpandoMetaClasses 和类别,您就拥有了一组出色的工具,可以根据自己的意愿添加行为。
在下一期文章中,我将重新审视 Groovy 在单元测试方面的强大功能。使用 Groovy 编写测试会带来实际的效益,不管是 GroovyTestCase 或包含注释的 JUnit 4.x 测试用例。您将看到 GMock 的实际作用 — 一种使用 Groovy 编写的模拟框架。到那时,希望您能够发现 Groovy 的许多实际应用。
本文示例源代码或素材下载
更多精彩
赞助商链接