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

Eclipse 自動重構實戰探索:以《重構》經典範例驗證 IDE 重構能力邊界

     編輯:Java 程式設計入門

Martin Fowler《重構:改善既有代碼設計》第 1 章 `statement()` 重構範例,是驗證 IDE 自動重構能力的標準基準。本文在 Eclipse (含中文語言包) 中逐步實操,**重命名、抽取方法、移動方法、內聯臨時變數、修改方法簽名** 等核心重構,評估其成熟度與輔助價值。

實驗環境

  • Eclipse 3.x (經典版本),安裝中文語言包。
  • 範例程式碼:`Customer`、`Rental`、`Movie` 三類,`Customer.statement()` 含 `switch` 計算費用與常客積分。

重構步驟 1:抽取方法 — 將 switch 邏輯提煉為 amountFor(Rental)

初次嘗試:選中 switch 區塊 → 右鍵 Refactor → Extract Method

Eclipse 偵測到區塊內讀取 `each`、修改 `thisAmount` 兩個區域變數,**預設全視為參數**,生成:


private double amountFor(Rental each, double thisAmount) { ... }

**不符合預期**:`thisAmount` 應為回傳值而非參數。

修正策略:將 `double thisAmount = 0;` 移至 switch 區塊**之前**


double thisAmount = 0; // 移到外部
switch (each.getMovie().getPriceCode()) { ... }

再次選中 switch 區塊 → Extract Method → Eclipse 正確識別:`each` 為參數、`thisAmount` 為回傳值。


private double amountFor(Rental each) {
    double thisAmount = 0;
    switch (...) { ... }
    return thisAmount;
}

預覽功能驗證

Eclipse 提供 **Preview** 按鈕,顯示重構前後差異 (類似 diff),確認無誤再 Apply — **極具實用價值**。

重構步驟 2:重命名參數與區域變數

  • `each` → `aRental` (右鍵 Refactor → Rename,或 `Alt+Shift+R`)。
  • `thisAmount` → `result` (同操作)。
  • Eclipse **全域更新所有引用**,包括方法簽名、方法體內讀寫、呼叫處實參 — **零遺漏**。

重構步驟 3:移動方法 — 將 amountFor 移至 Rental 類

選中 `amountFor` 方法 → Refactor → Move → 目標類選 `Rental` → Eclipse 自動:

  • 在 `Rental` 中建立方法 (存取 `this.getMovie().getPriceCode()`)。
  • 修改 `Customer.statement()` 呼叫為 `each.amountFor()`。
  • 處理 `Movie` 相關常數 (`REGULAR` 等) 的可見性 (若 `private` 則建議提升或生成 getter)。

重構步驟 4:以查詢取代臨時變數 — 移除 frequentRenterPoints 累加邏輯

將 `frequentRenterPoints` 計算邏輯抽取為 `Rental.getFrequentRenterPoints()`:


// 原 statement() 內
if (each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1)
    frequentRenterPoints++;

// 重構後
frequentRenterPoints += each.getFrequentRenterPoints();

Eclipse **Extract Method** → **Move Method** 組合完成。

重構步驟 5:內聯臨時變數 — 移除 thisAmount 區域變數

重構後 `statement()` 中:


double thisAmount = amountFor(each); // 單次使用
result += thisAmount;

選中 `thisAmount` → Refactor → Inline → 直接以 `amountFor(each)` 取代 — **消除中間變數,簡化資料流**。

Eclipse 重構能力評估總表

核心結論:工具輔助下的重構,而非自動重構

Eclipse 的重構引擎在 **程式碼結構層面** (命名、抽取、移動、內聯、簽名變更) 已高度成熟,**值得信賴並大量使用**。但在 **設計架構層面** (識別代碼氣味、決定重構時機與順序、評估權衡、跨邊界重構) 仍**完全依賴開發者判斷**。

實用功能加分項

  • Undo/Redo (Ctrl+Z / Ctrl+Y): 重構操作納入編輯歷史,一鍵回滾。
  • Refactoring History: 記錄本次會話所有重構操作,支援批次回滾。
  • Preview (預覽): 每次重構前必點,確認影響範圍。
  • Quick Fix (Ctrl+1) 整合: 編譯錯誤/警告直接提供重構建議 (如「Extract to local variable」)。

掌握 Eclipse 重構快捷鍵 (`Alt+Shift+R/T/M/L/I`)、善用預覽與撤銷、建立「小步重構、頻繁測試」肌肉記憶,是 Java 開發者提升代碼品質、應對技術債務的核心生產力槓桿。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
重構類型成熟度關鍵優勢注意事項
重命名 (Rename)⭐⭐⭐⭐⭐跨檔案全域更新、預覽、撤銷/重做注意排除字串常值/註解/設定檔 (需手工)
抽取方法 (Extract Method)⭐⭐⭐⭐自動分析參數/回傳值、預覽複雜控制流 (多返回點/異常) 需手工調整
移動方法/欄位 (Move)⭐⭐⭐⭐自動更新引用、處理可見性跨專案移動需確保依賴關係
內聯 (Inline)⭐⭐⭐⭐消除冗餘臨時變數/常數僅限單一引用點
修改方法簽名 (Change Method Signature)⭐⭐⭐⭐參數重排/新增/刪除/預設值呼叫端需手工調整非重構語言 (JS/JSP/XML)
抽取介面/超類 (Extract Interface/Superclass)⭐⭐⭐快速定義契約實作細節仍需手工遷移