演化架构与紧急设计: 组合方法和 SLAP
2009-11-05 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簻椤掋垺銇勯幇顖毿撻柟渚垮妼椤粓宕卞Δ鈧獮濠勭磽閸屾艾鈧懓顫濋妸鈺佺疅缂佸顑欓崥瀣煕椤愵偅绶氱紓鍐╂礋濮婂宕掑▎鎴М濠电姭鍋撻梺顒€绉甸幆鐐哄箹濞n剙濡肩紒鎰殜閺屸€愁吋鎼粹€茬敖婵炴垶鎸哥粔鐢稿Φ閸曨垰鍐€妞ゆ劦婢€濞岊亪姊虹紒妯诲蔼闁稿海鏁诲濠氭晲婢跺﹤宓嗛梺缁樺姈缁佹挳宕戦幘璇叉嵍妞ゆ挻绋戞禍鐐叏濡厧浜鹃悗姘炬嫹

现在,方法的可读性好多了。它的主体符合组合方法的目标:看起来像是执行的步骤的大纲。方法现在处于高层,甚至非技术用户差不多也能够理解方法的作用。如果仔细看看 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());
}
});
}
更多精彩
赞助商链接