快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
yee o2)  {          Object field1, field2;          Method method = getSelectionCriteriaMethod (field);          try {            field1 = method.invoke(o1);            field2 = method.invoke(o2);          } catch (Exception e) {            throw new RuntimeException(e);          }          return ((Comparable) field1).compareTo (field2);        }      };    } }

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

时间:2011-05-18 IBM Neal Ford

sort() 方法使用 Collecions.sort() 方法,传递雇员列表和一个生成的 comparator,调用此类的第三个方法。getComparatorFor() 方法充当一个工厂, 根据传入的条件动态生成匿名 comparator 类。它通过 getSelectionCriteriaMethod() 使用反射从 employee 类检索相应的 get 方法 ,对进行比较的每个实例调用该方法,并返回结果。清单 7 中的单元测试展示了 这个类对两个字段的实际应用:

清单 7. 测试泛型 comparator

public class  TestEmployeeSorter {    private EmployeeSorter _sorter;    private ArrayList<DryEmployee> _list;    @Before public void setup() {      _sorter = new EmployeeSorter();      _list = new ArrayList<DryEmployee>();      _list.add(new DryEmployee("Homer", 20000, 1975));      _list.add(new DryEmployee("Smithers", 150000, 1980));      _list.add(new DryEmployee("Lenny", 100000, 1982));    }    @Test public void name_comparisons() {      _sorter.sort(_list, "name");      assertThat(_list.get(0).getName(), is("Homer"));      assertThat(_list.get(1).getName(), is("Lenny"));      assertThat(_list.get(2).getName(), is("Smithers"));    }    @Test public void salary_comparisons() {      _sorter.sort(_list, "salary");      assertThat(_list.get(0).getSalary(), is(20000));      assertThat(_list.get(1).getSalary(), is(100000));      assertThat(_list.get(2).getSalary(), is(150000));    } }

像上面这样使用反射代表了一种权衡:复杂性和简洁性。基于反射的版本最初 比较难以理解,但是它提供了一些优点。首先,它自动为 Employee 类处理所有 属性。准备好这些代码后,您可以安全地向 Employee 添加新属性,而不需要考 虑创建 comparator 来对它们进行排序。其次,这种方法可以更加高效地处理大 量属性。如果结构化复制不严重的话,那么也可以忍受。但是您必须要问问自己 :当属性数量达到多少时,您必须使用反射来解决此问题?10 个、20 个还是 50 个?这个数字对于不同的开发人员和团队来说可能会发生变化。然而,如果试图 寻找一种比较客观的衡量,为什么不衡量一下反射相对于单个 comparator 的复 杂度呢?

在 “测试驱动设计,第 2 部分” 中,我引入了圈复杂度 指标,可以度量单 一方法的相对复杂度。一种可以度量 Java 语言圈复杂度的非常不错的开源工具 就是 JavaNCSS 工具。如果我对单个 comparator 类运行 JavaNCSS,它将返回 1 ,这并不奇怪:类中的单个方法只有一行代码而没有代码块。当我对整个 EmployeeSorter 类运行 JavaNCSS 时,所有方法的圈复杂度的总值为 8。这表示 当属性数达到 9 时需要

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