快速业务通道

演化架构与紧急设计: 组合方法和 SLAP - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
onnection")).commit(); } private boolean setupTransactionStateFor(Connection c)      throws SQLException {    boolean transactionState = c.getAutoCommit();    c.setAutoCommit(false);    return transactionState; }

演化架构与紧急设计: 组合方法和 SLAP(6)

时间:2011-07-13 IBM Neal Ford

现在,方法的可读性好多了。它的主体符合组合方法的目标:看起来像是执行的步骤的大纲。方法现在处于高层,甚至非技术用户差不多也 能够理解方法的作用。如果仔细看看 completeTransaction() 方法,会发现它只有一行代码。难道不能把这一行代码放回 addOrder() 方法中 吗?不行,这会损害代码的可读性和抽象层。从高层的订单业务工作流跳到事务的细节是违反 SLAP 原则的。建立 completeTransaction() 方 法能够使代码更概念化,避免具体的细节。如果以后要改变访问数据库的方式,只需修改 completeTransaction() 方法的内容,而不必修改调 用代码。

SLAP 原则的目标是使代码更容易阅读和理解。但是,它也有助于发现代码中存在的惯用模式。注意,在用事务块保护更新方面有一个惯用 模式。可以进一步重构 addOrder() 方法,见清单 8:

清单 8. 事务性访问模式

public void wrapInTransaction(Command c) throws SQLException {    setupDataInfrastructure();    try {      c.execute();      completeTransaction();    } catch (RuntimeException ex) {      rollbackTransaction();      throw ex;    } finally {      cleanUp();    } } public void addOrderFrom(final ShoppingCart cart, final String userName,               final Order order) throws SQLException {    wrapInTransaction(new Command() {      public void execute() throws SQLException{        add(order, userKeyBasedOn(userName));        addLineItemsFrom(cart, order.getOrderKey());      }    }); }

我添加了一个 wrapInTransaction() 方法,它使用 Gang of Four 提出的 Command Design 模式的内联版本实现这个常用模式。 wrapInTransaction() 方法执行让代码正常工作所需的所有具体工作。考虑到包装这个方法的匿名内部类的真正用途,我留下了几行难看的样 板代码 — addOrderFrom() 方法体中的两行代码。这个资源保护块会在代码中重复出现,所以应该考虑把它提升到层次结构中的更高位置。

我使用匿名内部类实现 wrapInTransaction() 方法是为了说明语言语法的表达能力的重要性。如果用 Groovy 编写这段代码,那么可以使 用闭包块创建更漂亮的版本,见清单 9:

清单 9. 使用 Groovy 闭包包装事务性访问

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()     }    } }

Groovy 的高级语言语法和特性让我们能够编写出可读性更好的代码,在与组合方法和 SLAP 等补充技术相结合时尤其如此。

结束语

在本期文章中,我讨论了对于代码设计和可读性很重要的两个模式。在改进现有代码的糟糕

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号