演化架构和紧急设计: 利用可重用代码,第 1 部分:代码与设计之间的关系
2010-05-13 00:00:00 来源:WEB开发网在这个版本中,我使用 Gang of Four 的 Command 设计模式,将样板代码抽象到 wrapInTransaction() 方法。 addOrderFrom() 方法现在可读性强多了 — 该方法的精华(最深处的两行)现在更明显了。但是,为了达到那种程度的抽象,Java 语言附加了很多技术性的繁琐的东西。您必须理解匿名内联类是如何工作的(Command 子类的内联声明),并理解 execute() 方法的含义。例如,在匿名内联类的主体中,只能调用外部类中的 final 对象引用。
如果用表达性更强的 Java 方言来编写同样的代码,结果会怎样?清单 3 显示用 Groovy 重新编写的同一个方法:
清单 3. 用 Groovy 重新编写的 addOrderFrom() 方法
public class OrderDbClosure {
def wrapInTransaction(command) {
setupDataInfrastructure()
try {
command()
completeTransaction()
} catch (RuntimeException ex) {
rollbackTransaction()
throw ex
} finally {
cleanUp()
}
}
def addOrderFrom(cart, userName, order) {
wrapInTransaction {
add order, userKeyBasedOn(userName)
addLineItemsFrom cart, order.getOrderKey()
}
}
}
该代码(特别是 addOrderFrom() 方法)的可读性更强。 Groovy 语言包括 Command 设计模式;Groovy 中任何以花括号 — { } — 括起来的代码自动成为一个代码块,可通过将左、右圆括号放在存放代码块引用的变量之后执行。这个内置模式使 addOrderFrom() 方法的主体可具有更强的表达性(通过减少晦涩的代码)。Groovy 还允许消除围绕参数的一些括号,从而减少干扰。
更多精彩
赞助商链接