WEB开发网      婵犻潧鍊婚弲顐︽偟椤栨稓闄勯柦妯侯槸閻庤霉濠婂骸浜剧紒杈ㄥ笚閹峰懘鎮╅崹顐ゆ殸婵炴垶鎸撮崑鎾趁归悩鐑橆棄闁搞劌瀛╃粋宥夘敃閿濆柊锕傛煙鐎涙ê鐏f繝濠冨灴閹啴宕熼鍡╀紘婵炲濮惧Λ鍕叏閳哄懎绀夋繛鎴濈-楠炪垽鎮归崶褍妲婚柛銊ュ缁傚秹鏁撻敓锟� ---闂佹寧娲╅幏锟�
开发学院软件开发Java 演化架构与紧急设计: 对设计进行重构 阅读

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

 2009-11-05 00:00:00 来源:WEB开发网 闂侀潧妫撮幏锟�闂佸憡鍨电换鎰版儍椤掑倵鍋撳☉娆嶄沪缂傚稄鎷�婵犫拃鍛粶闁靛洤娲ㄩ埀顒佺⊕閵囩偟绱為敓锟�闂侀潧妫撮幏锟�  闂佺ǹ绻楀▍鏇㈠极閻愬灚瀚梺鍨儏閳ь剙绉归弻銊р偓闈涙啞閻h京鈧敻鍋婇崰鏍х暦閿燂拷
核心提示: 对于 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:演化 架构 紧急

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