1.什么是重構
重構(Refactoring):在不改變軟件的功能和外部可見性的情況下,為了改善軟件的結構,提高清晰性、可擴展性和可重用性而對軟件進行的改造,對代碼內部的結構進行優化。
2.為何重構
1)改進軟件設計(整理代碼)
重構和設計是相輔相成的,它和設計彼此互補。有了重構,你仍然必須做預先的設計,但是不必是最優的設計,只需要一個合理的解決方案就夠了,如果沒有重構、程序設計會逐漸腐敗變質,愈來愈像斷線的風箏,脫韁的野馬無法控制。重構其實就是整理代碼,讓所有帶著發散傾向的代碼回歸本位。
2)提高代碼質量和可讀性,使軟件系統更易理解和維護
"任何一個傻瓜都能寫出計算機可以理解的程序,只有寫出人類容易理解的程序才是優秀的程序員"。有些程序員總是能夠快速編寫出可運行的代碼,但代碼中晦澀的命名使人暈眩得需要緊握坐椅扶手,試想一個新兵到來接手這樣的代碼他會不會想當逃兵呢?
軟件的生命周期往往需要多批程序員來維護,我們往往忽略了這些后來人。為了使代碼容易被他人理解,需要在實現軟件功能時做許多額外的事件,如清晰的排版布局,簡明扼要的注釋,其中命名也是一個重要的方面。一個很好的辦法就是采用暗喻命名,即以對象實現的功能的依據,用形象化或擬人化的手法進行命名,一個很好的態度就是將每個代碼元素像新生兒一樣命名,也許筆者有點命名偏執狂的傾向,如能榮此雅號,將深以此為幸。
對于那些讓人充滿迷茫感甚至誤導性的命名,需要果決地、大刀闊斧地整容,永遠不要手下留情!
3)幫助盡早的發現錯誤(Defects)
孔子說過:溫故而知新。重構代碼時逼迫你加深理解原先所寫的代碼。程序員經常對自己的程序邏輯不甚理解的情景,曾為此驚悚過,后來發現這種癥狀居然是許多程序員?;嫉?quot;感冒"。當你也發生這樣的情形時,通過重構代碼可以加深對原設計的理解,發現其中的問題和隱患,構建出更好的代碼。
4)提高編程速度
良好設計是維持軟件開發速度的根本,重構可以幫助你更快的開發軟件。因為它防止系統腐敗變質。甚至還可以提高設計質量。當你發現解決一個問題變得異常復雜時,往往不是問題本身造成的,而是你用錯了方法,拙劣的設計往往導致臃腫的編碼。
改善設計、提高可讀性、減少缺陷都是為了穩住陣腳。良好的設計是成功的一半,停下來通過重構改進設計,或許會在當前減緩速度,但它帶來的后發優勢卻是不可低估的。
3.何時重構
1)重構應該是隨時隨地進行。不應該為重構而重構。
2)三次法則:第一次做某件事只管去做;第二次做類似的事會產生反感,但無論如何還是可以去做 第三次 再做類似的事情,就應該重構了。
3)添加功能
4)修復bug
5)復審代碼,即Code Review時候
重構可能會引入更多見階層,重構往往需要把大型對象拆成多個小型對象。把大型函數拆成多個小型函數。間接層是把雙刃劍:一是你需要管理多分內容。
但間接層有以下作用:
1)允許邏輯共享,小函數復用性高。
2)分開解釋意圖和實現:可以選擇類名和函數名解釋實現意圖的做法。
3)隔離變化
4)封裝條件邏輯:對象有一種奇妙的機制:多態消息,可以靈活而清晰地表達條件邏輯。將條件邏輯轉化為消息形式,往往能降低代碼的重復。增加清晰度并提高彈性。
4.何時不該重構
1)代碼是在太混亂了,設計完全錯誤。
2)如果項目已近最后期限,應該避免重構。
3)重構還不如重新編碼。即重構的工作量顯著的影響Estimate
5.重構流程
1)讀懂代碼(包括測試例子代碼)
2)進行重構
3)運行所有的Unit Tests
6. 重構與設計
1)很多人都把設計看作軟件開發的關鍵換進。而把編程看作只是機械式的低級勞動。
2)另外的觀點就是:重構可以取代預先設計。你不必要做任何設計,只管按照最初的想法開始編碼,讓代碼運作,然后再將它重構成型。
實際上重構與設計是互補的,程序應該是先設計,而在開始編碼后,設計上的不足可以用重構來彌補.設計應該是適度的設計,而不必過度的設計.如果能很容易的通過重構來適應需求的變化,那么就不必過度的設計,當需求改變時再重構代碼 。
7.重構與性能
三種快速編寫軟件的方法:
1)時間預算法
在設計時就對程序花費的時間進行預算,通常用于性能要求極高的實時系統.普通的企業應用程序一般對性能要求不高.只要不太慢就可以了 。
2) 持續關注法
要求程序員在任何時間都要設法保持系統的高性能.這個方法有個缺陷,就是大部分的程序90%的優化工作都是白費勁,這樣會浪費大量的時間 。
3) 良好的分解方式
這個方式是在開發程序階段不對性能投以任何關注,直到進入性能優化階段,再分析程序中性能差的程序,然后對這些程序進分解,查出性能差的程序,進行優化。
轉自:http://blog.csdn.net/hguisu/article/details/7591081
原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2821