# 重構
# 何謂重構
- 一種行為獲得保存的轉變
- Martin Fowler: 對軟體內部結構的調整,目的在不改變軟體可察行為的前提下提高其可理解性,降低其修改成本。
- 為了安全的重構,必須做測試,確保改變沒有破壞任何東西。
- 最好的持續重構,不要分階段重構,而是程式碼需要改善,立刻動手就對了。
- 如果你的經理要求你在明天之前完成某個功能,請先完成那個功能,稍後再重構。重構必須與企業認同的優先價值和諧共存。
# 重構的好處
- 讓既有的程式更容易增加程式碼
- 改善既有程式碼的設計
- 更加了解程式碼
- 寫程式時較不令人厭煩
# 眾目睽睽
- 為了得到最好的重構結果,需要眾目睽睽的幫忙
- eXtreme Programming 建議 pair programming 和 collective code ownership (shared code)
- Shared code: 專案的程式碼屬於所有開發人員所共有,無論程式原始的作者是誰,只要大家看到程式中有問題或是設計不良的地方,都可以動手修改。來自:搞笑談軟工 (opens new window)
# 人類易讀的程式碼
# 保持程式碼簡潔
# 小步驟
- 重構應該拆成許多小步驟,會比用大步驟一口氣完成還要快。
- 假如紅燈持續太久,就是步驟還不夠小。
# 設計債
沒有堅持做以下三件事,就會招致設計債:
- 移除重複碼
- 簡化程式碼
- 讓程式碼目的更明確
# 演化出一個新體系結構
(故事)有一家公司有一個爛系統,之後決定要重構,而不整團打掉重練。
重構的方式:發展出一個框架層,由框架團隊開發,而應用團隊倚賴框架開發公共服務(common service)。
問題:很冒險。
- 如果框架團隊不了解應用團隊的需求,他們可能寫出錯誤的程式碼。
- 如果應用團隊得不到他想要的,可能會繞過框架來應付死線。
漸進式設計(evolutionary design) 提供更好的方法:
- 成立一個團隊
- 以應用層的需求來設計框架層
- 利用 持續重構 來改善應用層和框架層
# 複式重構與測試驅動重構
複式重構(Composite refactoring):以低階重構組成的高階重構。
本書提到的幾乎所有重構都是複式重構。
低階重構
- Extract Method
- Pull Up Method
- Extract Class
- Move Method
- ...
每次低階重構都要執行測試,確認改過的程式碼還能運作。
因此測試是複式重構不可或缺的一部分;如果沒有測試,過度的自信會讓你在低階重構過程中倍感艱辛。
測試驅動重構:先用測試驅動開發產生替換碼(replacement code)通過測試以後,把舊碼改成新碼,最後用原本的測資再測試一次。
# 複式重構的好處
本書的複式重構都對準了某個設計模式,並有以下的好處:
- 它們描述重構順序的完整規劃。
- 以安全有效的方式改善設計。
- 它們對於並非顯而易見的設計方向帶來啟發。
- 複式重構以起點(source)為出發帶往目標(destination)。本書的複式重構總是描述「合理朝 patterns 方向移動」的真實案例,讓那些並非顯而易見的設計方向更加清晰明確。
- 它們對 patterns 的實作提供深刻洞見。
- 實作 patterns 並無絕對正確的路,本書提供多種 patterns 的替代實作。如何重構成為那些 patterns,取決於你最初面對的問題。