重點整理第二Part
Chapter 2: 重構原則
何謂重構
- 名詞:對軟體內部結構的一種調整,目的是在不改變”軟體之可察行為”前提下,提高其可理解性,降低其修改成本
- 動詞:使用一系列重構準則(手法),在不改變”軟體之可察行為”前提下,調整其結構
- 更高效且受控的程式碼整理技術
- 重構目的
- 使軟體更容易理解且修改
- 效率最佳化
- 重構不會改變軟體”可受觀察之行為”
為何重構
- 重構是個工具,可以幫助你始終良好的控制自己的程式碼
- 重構改進軟體設計 : 經常性的重構可以幫助程式碼維持該有的型態,改進設計的重要方向就是消除重複程式碼
- 重構使軟體更易被理解 : 讓未來的開發者好理解,協助自己理解不熟悉的程式碼(擦掉窗戶上的污垢,使你看得更遠)
- 重構助你找到Bugs : 對程式碼的理解可以幫助找到Bugs,更有效地寫出強固穩健的程式碼
- 重構助你提高開發速度 : 良好設計是快速軟體開發的根本
何時重構
- 重構應該隨時隨地進行
- 三次法則 : 事不過三,三則重構
- 添加功能時一併重構 : 增加理解要修改的程式碼,讓未來新增特性可以更輕鬆,最主要原因是這是最快速流暢的過程
- 修補錯誤時一併重構 : 增加可讀性,更容易找到Bugs
- Code Reviews時一併重構 : 有助於開發團隊傳播知識和理解大型軟體系統,和團隊進行設計複審和個別複審者進行程式碼複審
- 為什麼重構有用
- 程式困難修改的原因 :
- 難以閱讀的程式,難以修改
- 邏輯重複得程式,難以修改
- 添加新行為時需要修改既有程式碼,難以修改
- 帶複雜條件邏輯的程式,難以修改
- 希望程式 :
- 容易閱讀
- 相同邏輯都只在唯一地點
- 新的改動不會危及現有行為
- 盡可能簡單表達條件邏輯
- 它在一個可執行的程式上進行,企圖在”不改變程式行為”賦予上述美好性質,讓我們保持高速開發,增加程式價值
- 程式困難修改的原因 :
怎麼跟主管說
- 品質驅動 : 技術複審是減少錯誤、提供開發速度的一條重要途徑,重構可以做為複審的一個方法
- 進度驅動 : 不要跟長官說,能在時程內完工就行了,怎麼做就自己決定
- 間接層價值
- 允許邏輯共享
- 分開解釋意圖和實作
- 將變化加以隔離
- 將條件邏輯加以編碼
- 找出不值得的間接層(寄生式間接層)並拿掉
重構的難題
- 資料庫 :
- 大多數商用程式都與DB Schema緊密耦合
- 資料遷移(Migration)
- 解決辦法之一: 在物件模型和資料庫模型間插入一個分隔層,這樣就可以各自變化,會增加系統複雜度,但提高靈活度
- 修改已發佈介面 :
- 必須同時維護新舊兩個介面,直到所有用戶都改好
- 讓舊介面呼叫新介面
- 使用Obsolete Or Deprecation標記
- 盡量不要發佈介面
- 難以藉由重構手法完成的設計改動
- 何時不該重構?
- 程式碼不能正常運作 : 重寫
- 先重構為”封裝良好的小型組件”,在判斷組件是要重構還是重寫
- 專案已近最後期限,也避免重構
重構與設計
- 彼此互補
- 適當的預先設計節省回頭工的高額成本,再搭配重構
- 持續重構可以應付變化帶來的風險,當下只需構築可執行的最簡化系統
- 請實際測量效率,不要臆測,通常都是錯的
1 |
|
重構與效率/性能(Performance)
- 時間預算法 : 用於效率要求極高的即時系統,分解設計時要做好預算,預先分配一定資源,資訊系統通常不用那麼高效
- 持續關切法 : 任何人在任何時間做任何事都要設法保持系統高效率,通常會讓程式更複雜、難以維護,因而減緩開發速度
- 關於效率 : 大半時間都耗在一小半程式碼,若所有程式碼都優化會有90%都是浪費時間
- 以一種”良好的分解方式”建造自己的程式,再用工具找出效率熱點,並集中關切
- 短程來看,重構會使軟體變慢,但軟體效率調整更容易
結論
- 事不過三,三則重構
- 相關技術 : UML示意圖,CRC卡,極限編程(Extreme Programming),搭檔編程(Pair Programming)