Martin Fowler《重構:改善既有代碼設計》第 1 章 `statement()` 重構範例,是驗證 IDE 自動重構能力的標準基準。本文在 Eclipse (含中文語言包) 中逐步實操,**重命名、抽取方法、移動方法、內聯臨時變數、修改方法簽名** 等核心重構,評估其成熟度與輔助價值。
Eclipse 偵測到區塊內讀取 `each`、修改 `thisAmount` 兩個區域變數,**預設全視為參數**,生成:
private double amountFor(Rental each, double thisAmount) { ... }
**不符合預期**:`thisAmount` 應為回傳值而非參數。
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 — **極具實用價值**。
選中 `amountFor` 方法 → Refactor → Move → 目標類選 `Rental` → Eclipse 自動:
將 `frequentRenterPoints` 計算邏輯抽取為 `Rental.getFrequentRenterPoints()`:
// 原 statement() 內
if (each.getMovie().getPriceCode() == Movie.NEW_RELEASE && each.getDaysRented() > 1)
frequentRenterPoints++;
// 重構後
frequentRenterPoints += each.getFrequentRenterPoints();
Eclipse **Extract Method** → **Move Method** 組合完成。
重構後 `statement()` 中:
double thisAmount = amountFor(each); // 單次使用
result += thisAmount;
選中 `thisAmount` → Refactor → Inline → 直接以 `amountFor(each)` 取代 — **消除中間變數,簡化資料流**。
| 重構類型 | 成熟度 | 關鍵優勢 | 注意事項 |
|---|---|---|---|
| 重命名 (Rename) | ⭐⭐⭐⭐⭐ | 跨檔案全域更新、預覽、撤銷/重做 | 注意排除字串常值/註解/設定檔 (需手工) |
| 抽取方法 (Extract Method) | ⭐⭐⭐⭐ | 自動分析參數/回傳值、預覽 | 複雜控制流 (多返回點/異常) 需手工調整 |
| 移動方法/欄位 (Move) | ⭐⭐⭐⭐ | 自動更新引用、處理可見性 | 跨專案移動需確保依賴關係 |
| 內聯 (Inline) | ⭐⭐⭐⭐ | 消除冗餘臨時變數/常數 | 僅限單一引用點 |
| 修改方法簽名 (Change Method Signature) | ⭐⭐⭐⭐ | 參數重排/新增/刪除/預設值 | 呼叫端需手工調整非重構語言 (JS/JSP/XML) |
| 抽取介面/超類 (Extract Interface/Superclass) | ⭐⭐⭐ | 快速定義契約 | 實作細節仍需手工遷移 |