演化架构与紧急设计:对设计进行重构 - 编程入门网
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 Fordsort() 方法使用 Collecions.sort() 方法,传递雇员列表和一个生成的 comparator,调用此类的第三个方法。getComparatorFor() 方法充当一个工厂, 根据传入的条件动态生成匿名 comparator 类。它通过 getSelectionCriteriaMethod() 使用反射从 employee 类检索相应的 get 方法 ,对进行比较的每个实例调用该方法,并返回结果。清单 7 中的单元测试展示了 这个类对两个字段的实际应用: 清单 7. 测试泛型 comparator
像上面这样使用反射代表了一种权衡:复杂性和简洁性。基于反射的版本最初 比较难以理解,但是它提供了一些优点。首先,它自动为 Employee 类处理所有 属性。准备好这些代码后,您可以安全地向 Employee 添加新属性,而不需要考 虑创建 comparator 来对它们进行排序。其次,这种方法可以更加高效地处理大 量属性。如果结构化复制不严重的话,那么也可以忍受。但是您必须要问问自己 :当属性数量达到多少时,您必须使用反射来解决此问题?10 个、20 个还是 50 个?这个数字对于不同的开发人员和团队来说可能会发生变化。然而,如果试图 寻找一种比较客观的衡量,为什么不衡量一下反射相对于单个 comparator 的复 杂度呢? 在 “测试驱动设计,第 2 部分” 中,我引入了圈复杂度 指标,可以度量单 一方法的相对复杂度。一种可以度量 Java 语言圈复杂度的非常不错的开源工具 就是 JavaNCSS 工具。如果我对单个 comparator 类运行 JavaNCSS,它将返回 1 ,这并不奇怪:类中的单个方法只有一行代码而没有代码块。当我对整个 EmployeeSorter 类运行 JavaNCSS 时,所有方法的圈复杂度的总值为 8。这表示 当属性数达到 9 时需要 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |