演化架构与紧急设计: 对设计进行重构
2009-11-05 00:00:00 来源:WEB开发网对于 Java 开发人员来说,这看上去非常自然。然而,考虑图 4 所示的代码视图,我在其中将两个 Comparator 重叠:
图 4. 重叠后的 comparator
可以看到,相同的空白,不同的值 可以很好地形容这个情况。大部分代码是经过复制的;惟一不同的部分是返回的值。由于我以一种 “自然” 的方式使用了比较基础设施(即按语言设计者的意图使用),因此很难发现这种复制,但是它确实存在于代码中。也许对于区区三个属性来说不算太严重,但是如果增长到大量属性呢?您决定什么时候开始处理这种复制,您打算怎么对付它?
我准备使用反射(reflection)来创建一种通用的排序基础设施,其中不会涉及大量复制的样板代码。为此,我创建了一个类来为每个字段自动处理 comparator 的排序和创建。清单 6 展示了 EmployeeSorter 类:
清单 6. EmployeeSorter 类public class EmployeeSorter {
public void sort(List<DryEmployee> employees, String criteria) {
Collections.sort(employees, getComparatorFor(criteria));
}
private Method getSelectionCriteriaMethod(String methodName) {
Method m;
methodName = "get" + methodName.substring(0, 1).toUpperCase() +
methodName.substring(1);
try {
m = DryEmployee.class.getMethod(methodName);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e.getMessage());
}
return m;
}
public Comparator<DryEmployee> getComparatorFor(final String field) {
return new Comparator<DryEmployee>() {
public int compare(DryEmployee o1, DryEmployee 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);
}
};
}
}
更多精彩
赞助商链接