快速业务通道

演化架构和紧急设计:利用可重用代码,第1部分 - 代码与设计之间的关系 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
erKey());      }    }); }

以框架作为模式集合

如果您熟悉 Hibernate,那么您将注意到,wrapInTransaction() 方法很像 Hibernate 的 doInTransaction helper。最成功的框架包含的是一组符合实际的技术惯用模式。框架中模式的有用性密 切关系到框架如何得以生存。如果框架是从实用代码中提取的,那么其中的模式更多地关注现实中的问题 。良好的框架(例如 Hibernate、Spring 和 Ruby on Rails)大多经历了实际应用的严峻考验。

另一方面,如果一个框架是在象牙塔中创建的,很多模式听起来很好,但是在实际项目中却没那么有 用。我常提到的一个揣测性框架开发的例子是 JavaServer Faces(JSF)的定制呈现管道 “特性”。它 允许输出各种类型的输出格式(例如 HTML、XHTML 和 WML)。我还没遇到过需要这个特性的开发人员( 虽然我相信存在这样的开发人员),但是您在编写的每个 JSF 应用程序中都为此付出了一点代价。(它 增加了理解事件模型和管道的复杂性。)

在这个版本中,我使用 Gang of Four 的 Command 设计模式,将样板代码抽象到 wrapInTransaction() 方法。addOrderFrom() 方法现在可读性强多了 — 该方法的精华(最深处的两行 )现在更明显了。但是,为了达到那种程度的抽象,Java 语言附加了很多技术性的繁琐的东西。您必须 理解匿名内联类是如何工作的(Command 子类的内联声明),并理解 execute() 方法的含义。例如,在 匿名内联类的主体中,只能调用外部类中的 final 对象引用。

演化架构和紧急设计:利用可重用代码,第1部分 - 代码与设计之间的关系(4)

时间:2011-08-18 IBM Neal Ford

如果用表达性更强的 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 还允许消除围绕参数的一些括号,从而减少干扰。

清单 4 显示一个类似的重写版本,这一次用的是 Ruby(通过 JRuby):

清单 4. 翻译成 Ruby 的 addOrderFrom() 方法

def wrap_in_transaction   setup_data_infrastructure   begin    yield    complete_transaction   rescue    rollback_transaction    throw   ensure    cleanup   end end def add_order_from   wrap_in_transaction do    add order, user_key_based_on(user_name)    add_line_items_from cart, order.order_key   end end

与 Java 版本相比,上述代码更类似于 Groovy 代码。Groovy 代码与 Ruby 代码的主要不同点在 Command 模式特征中。在 Ruby 中,任何方法都可以使用代码块,代码块通过方法主体中的 yield 调用 执行。因此,在 Ruby

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号