一般在介紹一樣新技術之前,我們都要大致講講它的歷史、主要原理等等。當然,這些東西很枯燥,很容易誘發我們的瞌睡蟲。但是不說,又不能讓人理解。好在不是太多。 如果您已經瞭解重構的定義、原理以及如何重構,那麼請跳過本小節。好了,書歸正傳。 返回總目錄 一、何謂重構(What) 視上下文的不同,重構有兩種定 ...
一般在介紹一樣新技術之前,我們都要大致講講它的歷史、主要原理等等。當然,這些東西很枯燥,很容易誘發我們的瞌睡蟲。但是不說,又不能讓人理解。好在不是太多。
如果您已經瞭解重構的定義、原理以及如何重構,那麼請跳過本小節。好了,書歸正傳。
一、何謂重構(What)
視上下文的不同,重構有兩種定義:
重構(名詞):對軟體內部結構的一種調整,目的是在不改變軟體可觀察行為的前提下,提高其可理解性,降低其修改成本。
重構(動詞):使用一系列重構的手法,在不改變軟體可觀察行為的前提下,調整其結構。
1、重構的目的是使軟體更容易被理解和修改。
2、重構不會改變軟體的可觀察的行為——重構之後軟體的功能一如以往。
在使用重構技術開發軟體時,有兩種截然不同的行為:添加新代碼,以及重構。這便是“兩頂帽子”。
添加新功能時,你不應該修改既有代碼,只管添加新功能。通過測試,你可以衡量自己的工作進度。
重構時你就不能再添加新功能,只管改進程式結構,只在絕對必要時才修改測試。
二、為何重構(Why)
1、重構改進軟體設計
2、重構使軟體更容易理解
3、重構幫助找到bug
4、重構提高編程速度
三、何時重構(When)
這裡作者提出:幾乎任何情況下,都反對專門撥出時間進行重構。重構應該隨時隨地進行。你不應該為重構而重構,之所以重構,是因為你想做別的什麼事,而重構可以幫你把那些事做好。
三次法則:第一次做某事只管去做;第二次做類似的事,雖然會反感但也可勉強去做;第三次再做類似的事,你就該重構了。
事不過三,三則重構。
1、添加功能時重構
最常見的時機就是給軟體添加新特性的時候,可以幫助我理解需要修改的代碼。
如果你發現自己需要為程式添加一個特性,而代碼結構使你無法很方便地達成目的,那就先重構那個程式,使特性的添加比較容易進行,然後再添加特性。
2、修補錯誤時重構
調試過程中運用重構,為了讓代碼更具可讀性,可以加深自己的理解,找出bug。
3、覆審代碼時重構
重構可以幫助我覆審別人的代碼,還可以幫助代碼覆審工作得到更具體的結果。
四、怎麼對經理說(How)
“該怎麼對經理說重構的事”?
對於“質量驅動”型的經理:
在覆審中使用重構就是一個不錯的辦法。大量的研究顯示,技術覆審是減少錯誤、提高開發速度的一條重要途徑。
隨便找一本關於覆審、審查或者軟體開發的書看看,從中找出最新引證,應該可以讓大多數經理認識覆審的價值。
對於“進度驅動”型的經理:
最好的辦法就是不告訴他。經理要我儘快完事,至於怎麼完成,那就是我的事了。我認為最快的方式就是重構,所以我就重構嘍。
其實,大多數重構都為程式引入了更多的間接層。間接層是一把雙刃劍,因為每次一個東西分成兩份,就需要多管理一個東西。
間接層也有其存在的價值。
1、允許邏輯共用
比如一個子函數可以在兩個不同的地點被調用,或者基類中的某個函數被所有子類所共用。
2、分開解釋意圖和實現。
你可以選擇每個類和函數的名字,這給了你一個解釋自己意圖的機會。
3、隔離變化。
4、封裝條件邏輯。
五、重構的難題
1、資料庫
- 絕大多數的商用程式都與其背後的資料庫結構緊密耦合。
- 無論多麼小心的進行系統分層,降低耦合度,資料庫結構的改變還是讓你不得不進行漫長且繁瑣的數據遷移工作
2、修改介面
對於已經發佈的介面(published interface),無法僅僅修改調用者就能安全的修改介面。你必須同時維護新舊兩個介面,幸運的是,這並不難,請儘量這麼做:讓舊介面調用新介面。同時,使用C#中的Obsolete標記舊介面。
不要過早發佈介面。請修改你的代碼所有權政策,使重構更順暢。
3、難以通過重構手法完成的設計改動
我們很難將不考慮安全性需求時構造起來的系統重構為具備良好安全性系統。
何時不該重構
1、重新編寫所有代碼的時候
有時候既有代碼太混亂,重構不如重寫來的簡單。
重寫有一個清楚的訊號:現有代碼根本能不正常運行,代碼裡面滿是錯誤,無法穩定運行。
2、項目已近最後期限
重構的確能提高生產力。如果最後沒有足夠時間,就表示你其實早該重構。
六、重構與設計
重構肩負一項特殊使命,它與設計彼此互補。
重構可以帶來更簡單的設計,同時又不損失靈活性,降低了設計過程的難度,減輕了設計的壓力。
七、重構與性能
關於重構,有一個常被提出的問題:它對程式的性能將造成怎樣的影響?
- 並不贊同為了提高設計的純潔性而忽視性能,把希望寄托於更快的硬體身上也絕非正道。雖然重構可能使軟體運行更慢,但它使軟體的性能優化更容易。
- 除了實時系統,其他任何情況下“編寫快速軟體”的秘密就是:首先寫出可調的軟體,然後調整它以求獲得足夠的速度。
八、小結
重構的第一步,永遠都是為即將修改的代碼建立一組可靠的測試環境。好的測試,是重構的根本。
重構技術就是以微小的步伐修改程式。如果你犯下錯誤,很容易便可發現它。
任何一個傻瓜都能寫出電腦可以理解的代碼。唯有寫出人類容易理解的代碼,才是優秀的程式員。
代碼首先是給人閱讀的,其次才是讓電腦運行的。
重構的節奏是怎麼樣的?可以用這樣一個迴圈來表示:
while(重構){ 測試(); 小修改(); }
好吧。理論知識就是這麼多。To Be Continued...
本次分享到此結束。如果這篇文章對你有幫助的話,評論或推薦下吧!
作者:NaYoung
出處:http://www.cnblogs.com/liuyoung/p/7819501.html
歡迎轉載,但任何轉載必須保留完整文章,在顯要地方顯示署名以及原文鏈接。如您有任何疑問或者授權方面的協商,請給我留言