演化架构与紧急设计: 语言、表达性与设计:第 2 部分
2009-11-05 00:00:00 来源:WEB开发网
清单 3. 重写某个 Logger 实例的 log() 方法
def logger = new Logger()
logger.metaClass.log = { String m ->
println m.toUpperCase()
}
logger.log "this log message brought to you in upper case"
理解了此机制的工作原理之后,阅读此代码要比阅读使用额外类的相应代码更加轻松。所有相关的修饰代码都出现在一个位置,而不是分散于若干个文件中(因为在 Java 语言中,每个公有类都必须位于它自己的文件中)。
Ruby 也提供了相同的功能,即所谓的 singleton method(这是一个令人疑惑的名称,因为 singleton 代表着负载过重)或者 eigenclass。在 JRuby 中实现的代码如清单 4 所示:
清单 4. 使用 Ruby 的 eigenclass 执行就位修饰
class Logger
def log(msg)
puts msg
end
end
l = Logger.new
def l.log m
puts m.upcase
end
l.log "this log message brought to you in upper case"
Ruby 版本并未使用额外的工具,比如说 ExpandoMeta Class。在 Ruby 中,您可以为某个特定的实例定义一个内联方法,其方法是将变量名称放在方法声明的最前面。Ruby 具备极佳的语法灵活性,因此对可以在何时及何处定义方法并没有太多规则限制。
这工具还适用于内置 Java 类。举例来说,应该使用 first() 和 last() 方法来定义 ArrayList 类,不过并未采用这种方式。但是,在 Groovy 中添加这些方法是相当简单的,如清单 5 所示:
清单 5. 在 Groovy 中为 ArrayList 添加 first() 和 last() 方法
更多精彩
赞助商链接