Eclipse JDT 提供業界領先的自動重構引擎。本文以 Martin Fowler《重構》第一章「視頻店租賃系統」為例,實地測試 Eclipse 重構功能在代碼結構層面的支援程度與局限,探索「工具輔助重構」的最佳實踐。
Customer, Rental, Movie)Alt+Shift+T 打開重構彈出菜單
從 Customer.statement() 中提煉 amountFor(Rental) 方法。
重構 → 提煉方法each 和 thisAmount 均作為參數 (未識別 thisAmount 為輸出參數)double thisAmount = 0; 移至 switch 之前,再次提煉each 為輸入參數,thisAmount 為返回值

private double amountFor(Rental each) {
double thisAmount = 0;
switch (each.getMovie().getPriceCode()) {
case Movie.REGULAR:
thisAmount += 2;
if (each.getDaysRented() > 2) thisAmount += (each.getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE:
thisAmount += each.getDaysRented() * 3;
break;
case Movie.CHILDRENS:
thisAmount += 1.5;
if (each.getDaysRented() > 3) thisAmount += (each.getDaysRented() - 3) * 1.5;
break;
}
return thisAmount;
}
each → aRental、局部變量 thisAmount → result (重構 → 重命名,全局更新引用)將 amountFor 移至 Rental 類,重命名為 getCharge()。
重構 → 移動 → 目標類選 Rental、新方法名 getChargeCustomer 保留委託樁方法:private double amountFor(Rental aRental) { return aRental.getCharge(); }private 導致 Rental.getCharge() 被迫為 private重構 → 更改方法簽名 將 getCharge() 改為 public重構 → 內聯 移除 Customer.amountFor() 委託,直接調用 each.getCharge()重構 → 內聯臨時變量 消除 thisAmount 變量

將積分邏輯提煉為 getFrequentRenterPoints() 並移至 Rental。
Eclipse 無法自動生成 frequentRenterPoints += getFrequentRenterPoints(rental) 形式,因局部變量在賦值左側。需手動調整:
RentalpublicCustomer 中委託方法Replace Temp with Query:將累加變量提煉為查詢方法。
Eclipse 不支援此重構 (截至測試版本)。需手動實現:
// 手動重構後
private double totalCharge() {
return rentals.stream().mapToDouble(Rental::getCharge).sum();
}
private int totalFrequentRenterPoints() {
return rentals.stream().mapToInt(Rental::getFrequentRenterPoints).sum();
}
消除 Movie.getCharge() 中的 switch-case,引入價格策略繼承體系。
getCharge() 至 Movie:Eclipse 提示「找不到接收者」getMovie() 獲取 _movie 字段直接訪問Rental 需手動改為 int daysRentedgetFrequentRenterPoints()生成代碼結構:
// Movie.java
public double getCharge(int daysRented) {
switch (getPriceCode()) { ... }
}
// Rental.java
public double getCharge() {
return _movie.getCharge(_daysRented);
}
終點:Eclipse 無法自動執行「引入狀態模式/策略模式」這類架構級重構。
Price 抽象類及 RegularPrice, NewReleasePrice, ChildrensPrice 子類Movie 持有 Price 引用,委託計價邏輯priceCode 返回具體策略這印證了 Fowler 的觀點:自動重構工具止於「代碼結構級操作」,架構設計決策仍屬人類智慧領域。
| 類別 | 功能 | 成熟度 | 建議 |
|---|---|---|---|
| 代碼結構級 | 重命名 (類/方法/字段/變量) | ⭐⭐⭐⭐⭐ | 放心使用,全局引用自動更新 |
| 提煉方法/變量/常量 | ⭐⭐⭐⭐ | 參數分析偶有偏差,需預覽確認 | |
| 移動方法/字段 | ⭐⭐⭐⭐ | 委託樁自動生成,需配合內聯清理 | |
| 內聯方法/臨時變量 | ⭐⭐⭐⭐ | 安全可靠 | |
| 簽名變更 | 更改方法簽名 (參數/返回類型/拋出異常) | ⭐⭐⭐⭐ | 強大,支持重排參數 |
| 架構設計級 | 提煉接口/超類 | ⭐⭐⭐ | 基礎骨架生成,細節需手工 |
| 推拉方法 (Pull Up/Push Down) | ⭐⭐⭐ | 適用於明確繼承層次調整 | |
| 引入設計模式 (State/Strategy/Decorator...) | ⭐ | 不支援,屬於設計決策 |
Preview 按鈕是安全網,必看再應用Ctrl+Z 可回滾重構,鼓勵嘗試掌握 Eclipse 重構快捷鍵 (Alt+Shift+R/T/M/L),讓重構成為日常編碼流暢一部分,而非階段性大手術。