重構原則


一般在介紹一樣新技術之前,我們都要大致講講它的歷史、主要原理等等。當然,這些東西很枯燥,很容易誘發我們的瞌睡蟲。但是不說,又不能讓人理解。好在不是太多。

如果您已經了解重構的定義、原理以及如何重構,那么請跳過本小節。好了,書歸正傳。


返回總目錄


 

一、何謂重構(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 
歡迎轉載,但任何轉載必須保留完整文章,在顯要地方顯示署名以及原文鏈接。如您有任何疑問或者授權方面的協商,請給我留言

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM