《重構》--- 重構原則
01-29
重構的定義
重構(名詞):對軟體內部結構的一種調整,目的是在不改變軟體之可觀察行為前提下,提高其可理解性,降低其修改成本。
重構(動詞):使用一系列重構準則(手法〕,在不改變軟體之可觀察行為前提下,調整其結構。
添加新功能和重構是兩種截然不同的行為,添加新功能時,你不應該修改既有代碼,只管添加新功能。重構時你就不能再添加功能,只管改進程序結構。此時你不應該添加任何測試,只在絕對必要時才修改測試。
為何重構
- 改進軟體設計
- 為了短期目的,或是在理解整體設計之前據修改代碼,程序將逐漸失去自己的結構。重構很像是在整理代碼,你所做的就是讓所有東西回到應該的位置上。代碼結構的流失是累積性的。愈難看出代碼所代表的設計意涵,就愈難保護其中設計,於是該設計就腐敗得愈快。經常性的重構可以幫助代碼維持自己該有的形態。
- 使軟體更易被理解
- 代碼好的表達自己的用途
- 幫助理解複雜的代碼
- 幫助找到 bug
- 重構根據理解修改代碼,可以很快發現 bug
- 提高編程速度
- 良好的設計是快速開發的根本
何時重構
反對專門撥出時間進行重構。在我看來,重構本來就不是一件「特別撥出時間做」的事情,重構應該隨時隨地進行。你不應該為重構而重構,你之所以重構,是因為你想做別的什麼事,而重構可以幫助你把那些事做好。
第一次做某件事時只管去做;第二次做類似的事會產生反感,但無論如何還是做了;第三次再做類似的事,你就應該重構。
重構的時機
- 添加功能時重構
- 修復 bug 時重構
- code review 時重構
為什麼重構有用?
- 我們希望程序:
- 容易理解;
- 所有邏輯都只在唯一地點指定;
- 新的改動不會危及現有行為;
- 儘可能簡單表達條件邏輯
- 重構是這樣一個過程:它在一個目前可運行的程序上進行,企圖在不改變程序行為的情況下賦予上述美好性質,使我們能夠繼續保持高速開發,從而增加程序的價值。
- 我們希望程序:
怎麼對經理說?
- 不要告訴經理,因為工程師都是專業人士,添加新功能,而原本設計卻又使我無法方便地修改,那麼最快的方式就是重構。
間接層與重構
計算機科學是這樣一門學科:它相信所有問題都可以通過多一個間接層(Indirection)來解決。—— Dennis DeBruler
間接層的價值
- 允許邏輯共享
- 分開意圖和實現
- 隔離變化
- 封裝條件邏輯
重構的難題
- 資料庫
- 在對象模型和資料庫模型插入一個分隔層,隔離兩個模型各自的變化
- 修改已發布的介面
- 讓舊介面調用新介面。當你要修改某個函數名稱時,留下舊函數,讓它調用新函數。
- 不要過早發布介面
- 不要過度強調代碼所有權,每個人可以修改別人的代碼,方便介面改動
難以通過重構手法完成的設計改動
何時不該重構
- 系統太爛,需要重寫。重寫(而非重構)的一個清楚信號就是:現有代碼根本不能正常運作。試著做點測試,然後就發現代碼中滿是錯誤,根本無法穩定運作。記住,重構之前,代碼必須起碼能夠在大部分情況下正常運作。
- 接近項目 deadline
重構與設計
- 重構和設計師互補的
- 重構可以容易地使最初簡單的設計方案轉化成一個更加靈活的設計方案,那麼就不要過度設計,使用最初簡單的設計方案就可以。
重構與性能
性能改進的第一步是 profile,而不是猜測
重構可能使軟體性能變差,但是重構後有分解良好,結構清晰的程序。可以更加方便的做程序的 profile ,並根據 profile 的結果對性能熱點做改動。使性能改動更容易。
推薦閱讀:
※再送一本《數論基礎》
※讀書005《局外人》
※震驚!一款十二年前的遊戲竟蟬聯 Wii U 下載榜冠軍,原因居然是!———
※為什麼會變成這樣呢?
TAG:杂谈 |