WEB开发网
开发学院软件开发Java 演化架构与紧急设计: 对设计进行重构 阅读

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

 2009-11-05 00:00:00 来源:WEB开发网   
核心提示: 对于 Java 开发人员来说,这看上去非常自然,演化架构与紧急设计: 对设计进行重构(8),然而,考虑图 4 所示的代码视图,其中不会涉及大量复制的样板代码,为此,我在其中将两个 Comparator 重叠: 图 4. 重叠后的 comparator可以看到,相同的空白

对于 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); 
      } 
    }; 
  } 
} 

上一页  3 4 5 6 7 8 9 10  下一页

Tags:演化 架构 紧急

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接