快速业务通道

演化架构与紧急设计:对设计进行重构 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
有框架添加额外的行为时 ,这都是主要的代码特征(code smell)。继承或复合都提供了一种更加干净的 方法来扩展框架,如果这两种方法都不可行的话,那么问题就更加严重了。

这段代码中另一个常见的复制问题在 ApplicationMap.java 和 Sorter.java 文件中。ApplicationMap.java 包含一个共 27 行的复制代码块,如清单 1 所示 :

清单 1. ApplicationMap.java 中的复制代码

entries.add(new  Map.Entry() {    public boolean equals(Object obj) {      Map.Entry entry = (Map.Entry) obj;      return ((key == null) ?        (entry.getKey() == null) :        key.equals(entry.getKey())) && ((value ==  null) ?          (entry.getValue() == null) :          value.equals(entry.getValue()));    }    public int hashCode() {      return ((key == null) ?        0 :        key.hashCode()) ^ ((value == null) ?          0 :          value.hashCode());    }    public Object getKey() {      return key;    }    public Object getValue() {      return value;    }    public Object setValue(Object obj) {      context.setAttribute(key.toString(), obj);      return value;    } });

除了多次使用嵌套的三元运算符外(是判断任务安全性编码的良好指标,因为 任何人都不能读取这些代码),这段复制代码的有趣之处并不在于代码本身。而 是在于在出现复制的两个方法之前显示的先兆。第一处如清单 2 所示:

清单 2. 第一次出现复制代码时的先兆

while  (enumeration.hasMoreElements()) {    final String key = enumeration.nextElement().toString();    final Object value = context.getAttribute(key);    entries.add(new Map.Entry() {    // remaining code elided, shown in Listing 1

演化架构与紧急设计:对设计进行重构(4)

时间:2011-05-18 IBM Neal Ford

清单 3 展示了出现第二次复制时的先兆:

清单 3. 出现第二次复制代码时的先兆

while  (enumeration.hasMoreElements()) {    final String key = enumeration.nextElement().toString();    final Object value = context.getInitParameter(key);    entries.add(new Map.Entry() {    // remaining code elided, shown in Listing 1

在整个 while 循环中的惟一不同之处在于 清单 2 中对 context.getAttribute(key) 的调用和 清单 3 中对 context.getInitParameter(key) 的调用之间的差别。显然,这些可以实现参数 化,允许复制代码销毁自己的方法。来自 Struts 的示例解释了免费的复制和粘 帖代码,这些代码不仅毫无必要,并且容易修复。

实际上,这解释了利用并将条目添加到属性集中的方法在 Struts 代码库中是 一种惯用模式。允许将几乎相同的代码放到多个位置将隐藏一个事实,即 Struts 需要一直执行这个操作,这将阻止将这些代码放到一个含义更明显的位置。要清 理 Struts 代码库中多个类的设计,一种方法就是意识到这种惯用模式的存在并 巩固这一行为。

结构化复制

另一种复制形式更加难以检测,因此危害也更大:结构化复制。使用有限的几 种语言的开发人员(特别是那些只具备少量元编程支持的语言,比如 Java 和 C# )尤其容易出现这个问题。我的同事 Pat Farley 使用了一个短语就很好地总结 了结构化复制:相同的空白,不同的值。就是说,您复制了几乎一模一样的代

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