首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

演化架構與緊急設計:積累慣用模式,從 Struts 代碼庫發現隱性設計元素

     編輯:Java 相關知識

緊急設計核心思想

Big Design Up Front 假設能預見所有設計,但實現過程中會不斷遇見意外。敏捷採用「最後可靠時刻」原則:推遲決策直到掌握更多上下文,發現代碼中已成為事實的「慣用模式」,將其提煉為有效抽象。

指標組合發現慣用模式

使用 CKJM 計算 Struts 2 代碼庫兩指標:

  • WMC (Weighted Methods per Class):類圈複雜度總和,反映內部複雜度。
  • Ca (Afferent Coupling):被其他類引用次數,反映影響範圍。

單看 WMC 最高的是 DoubleListUIBean (Ca=3),改進收益低。
按 Ca 排序,Component 被 177 類引用,雖複雜度中等,改進連鎖效應巨大。

綜合選 UIBean (WMC=53, Ca=22) 深入分析。

JavaNCSS 定位熱點方法

UIBean.evaluateParams() 圈複雜度 43,佔類總複雜度大頭。代碼充滿結構性重複:

if (label != null) { addParameter("label", findString(label)); }
if (labelPosition != null) { addParameter("labelposition", findString(labelPosition)); }
// ... 20+ 同結構塊

全代碼庫搜尋揭示慣用模式

命令查找包含 evaluateParams 或 evaluateExtraParams 的類:

find . -name "*.java" | xargs grep -l "void evaluate.*Params"

結果 27 個類(UIBean、TextField、Form、Table 等)皆含此模式。慣用模式浮現:大量 UI 元件需自定義參數處理,各自重複實作。

改進第 1 步:元編程消除結構性重複

protected void handleDefaultParameters(String paramName) {
    try {
        Field f = UIBean.class.getField(paramName);
        if (f.get(this) != null) addParameter(paramName, findString(paramName));
    } catch (Exception e) { throw new RuntimeException(e); }
}
public void evaluateParams() {
    addParameter("templateDir", getTemplateDir());
    addParameter("theme", getTheme());
    String[] defaultParameters = {"label","labelPosition","requiredPosition", ...};
    for (String s : defaultParameters) handleDefaultParameters(s);
}

效果:減少 66 行代碼,圈複雜度降 18 點,未來修改集中在單一方法。

改進第 2 步:長期解決方案——參數處理子框架

將參數處理機制抽象為獨立類層次,視為 Struts 一等公民,徹底解決橫切關注點。

案例研究:異步行為演進

ThoughtWorks 專案早期需上傳圖片異步化,技術主管拒絕引入消息隊列,採用簡單輪詢。兩年後 3 處異步需求成瓶頸,才引入最簡佇列。因等待「最後可靠時刻」,避免了兩年不必要的複雜度,且對需求理解更深,選型更精準。

總結

  • 每個代碼庫都有慣用模式,需主動發現(指標、全文搜尋、結構重複)。
  • 短期用元編程/重構消除重複,長期提煉子框架。
  • 緊急設計 = 保持警覺 + 推遲決策 + 讓代碼引領設計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved