從重構到預重構#
軟體開發過程中,團隊經常在大型專案進行到一半時停下來重新思考並重寫程式,藉以讓設計更乾淨、效率更好。這種做法稱為「重構」(refactoring),由 Martin Fowler 在《Refactoring: Improving the Design of Existing Code》中發揚光大。重構雖然有效,但會耗用大量時間與成本。
本書提出的概念稱為「預重構」(prefactoring):在動手寫程式之前,就先將前人或自己過往累積的經驗轉化為設計上的判斷,避免日後出現代價昂貴的中途調整。書名來自 refactoring,但意涵相反——把問題前置處理,而不是事後補救。
預重構並不保證日後完全不需要重構,但能顯著減少重構的次數與規模。
三個「極致」原則#
書中許多指南乍看極端,因為它們圍繞著三個核心理念延伸:
- 極致抽象(Extreme Abstraction):用合適的抽象資料型別與概念建模,避免直接使用原始型別堆砌語意。
- 極致關注點分離(Extreme Separation of Concerns):把不同職責拆到不同的方法、類別或模組,降低耦合。
- 極致可讀(Extreme Readability):讓程式自我表達意圖,閱讀者不需揣測即可理解。
如果說 Extreme Programming(極限編程)把幾項好實踐推到極致,那麼 Prefactoring 也用同樣的精神對待設計。
指南而非鐵律#
書中將觀念稱為「指南」(guidelines)而非「設計模式」(design patterns),原因是:
- 指南是建議實踐,可在多種情境出現,不一定具備標準的模式格式。
- 部分指南其實近於設計模式,作者引用《Design Patterns》(Gamma、Helm、Johnson、Vlissides 等人)的觀點:「有人眼中的模式,是另一個人眼中的設計原則。」
- 指南的目標是引發思考與比較,而非提供唯一解。
將書中指南拿來與自己團隊的開發習慣比對,可以更清楚現有做法的取捨,並可能催生新的實踐。
設計範例:Sam 的 CD 出租店#
為了讓抽象指南變得具體,全書以一個虛構客戶 Sam 的 CD 出租系統為主線,從需求訪談、初版設計、到迭代擴張一路推進。這個範例靈感來自 Martin Fowler 重構書中的影帶店例子,並非真實存在的店家。
書中也說明:
- 沒有絕對客觀的方法可以衡量設計的「好壞」,方法數、行數、類別數等指標只在極端情況有意義。
- 作者以「直覺」評估設計優劣,類似重構書中的「程式異味」(code smells):好的設計帶來「肚子暖暖」的感覺,糟糕的設計則讓人「胃裡翻攪」。
適合的讀者#
本書預設讀者:
- 已熟悉物件導向設計的基本概念。
- 對 UML 類別圖、序列圖、狀態圖有基本認識。
- 至少熟悉一種物件導向語言(Java、C++、C#、Ruby 或 Python 等)。
全書結構概覽#
本書共 17 章,整體跟隨 Sam 系統的開發歷程,並在第 3、6 章插入較通用的開發與物件導向討論。重點脈絡如下:
- 第 1 ~ 2 章:介紹預重構與系統初貌,建立共同詞彙並運用極致抽象。
- 第 3 章:插入一般開發議題,包含全局觀、介面契約、與程式溝通、一致性、錯誤處理等。
- 第 4 ~ 8 章:從大局設計、類別劃分、職責分離,進到第一次釋出與回顧。
- 第 9 ~ 14 章:透過新需求逐步引入關聯、狀態、介面、適配、報表、發票、信用卡與多店擴張等主題。
- 第 15 ~ 16 章:兩個真實或近真實的案例(列印伺服器、反垃圾郵件系統)。
- 第 17 章:結語。
- 附錄 A、B:所有指南條列與範例系統的原始碼。
本書並非語言或框架手冊;範例採用偽程式碼,命名混合多種語言慣例,目的是讓概念跨語言可用。