WEB开发网
开发学院软件开发Java 演化架构与紧急设计: 语言、表达性与设计:第 2 部... 阅读

演化架构与紧急设计: 语言、表达性与设计:第 2 部分

 2009-11-05 00:00:00 来源:WEB开发网   
核心提示: 清单 3. 重写某个 Logger 实例的 log() 方法deflogger=newLogger()logger.metaClass.log={Stringm->printlnm.toUpperCase()}logger.log"thislogmessagebroughttoy


清单 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() 方法

上一页  1 2 3 4 5 6 7 8  下一页

Tags:演化 架构 紧急

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接