软件重构
维基百科,自由的百科全书
代碼重構指對軟體代碼做任何更動以增加可讀性或者簡化結構而不影響輸出結果。
軟件重構需要藉助工具完成,重構工具能夠修改代碼同時修改所有引用該代碼的地方。在極限編程的方法學中,重構需要單元測試來支持。
目录 |
[编辑] 重構代碼
在軟體工程學裡,重構代碼一詞通常是指在不改變代碼的外部行為情況下而修改源代碼,有時非正式地成為「清理乾淨」。在極限編程或其他敏捷方法學中,重構常常是軟體開發循環的一部分: 開發者輪流增加新的測試和功能,並重構代碼來增進內部的清晰性和一致性。自動化的單元測試保證了重構不至於讓代碼停止工作。
重構既不修正錯誤,又不增加新的功能性。反而它是用於提高代碼的可讀性或者改變代碼內部結構與設計,並且移除死代碼,使其在將來更容易被維護。特別是,在現有的程序的結構下,給一個程序增加一個新的行為會非常困難,因此開發人員可能先重構這部分代碼,使加入新的行為變得容易。
一個重構的小範例是修改一個變量的名稱使其具有更明確的含義,例如從單個字母的「 i 」重構為「 interestRate 」(利率)(圖一)。較複雜的重構是把一段 if 區塊中的代碼變為一個子程序(圖二)。更複雜一點的重構是用多態性來替換 if 條件式。「清理」代碼已經發生了幾十年,重構中最關鍵的認知是有意地「清理」代碼,透過從已知的紀錄裡一些常用的重構方法清理代碼,把它從增加新功能分開,然後個別的對代碼進行測試 (任何的行為改變都可能帶來錯誤)。新的實現切合實際需要以改善現有設計,並且不改變原軟件的意圖或行為。
重構面對業界調適接受方面的挑戰。首先,對重構長遠的影響需要更深入研究追蹤。又,重構存於資料庫輪廓(database schema) 的商業邏輯層幾乎是不可能或者非常困難的。最後,對介面造成影響的重構可能造成程式開發上的困境,除非程式員有對所有使用者介面的存取權。例如,程序員若改變某實體中的方法名稱,他要麽必須對整個專案裡頭所有連結到舊名的參考都加以編輯,要麽屈服於繼續維護使用舊名的殘株殘瓦介面。而該舊名的介面於內部呼叫該方法的新名。
[编辑] 源流
重構這個術語是從數字與多項式的因式分解類比而來。如,x2 − 1 可以被分解為 (x + 1)(x − 1), 這樣揭示了前面的形式不可見的內部結構(如兩個根+1和−1)。同樣,在軟件重構中,在可見結構上的改變通常會揭示原代碼中「隱藏」的內部結構。
上面數學的例子展示了「重構」的問題。一個表示式不盡然客觀地或者處處比另一個更好。它們每個強調不同的方程式的觀點,故其實用便多多少少隨著個別不同使用情況,以及各個數學家個性與風格變動。這個問題於軟體開發領域亦然;個別程式員可能對某既定演算法理想的程式形式實現會有不同的意見。
為了簡化測試,重構是分步驟完成的。當重構結束後,任何行為上的變化無疑都是錯誤並可透過除錯該程式的新行為個別修正。
馬丁·福勒的著作《重構》是一個經典參考書。雖然重構已經非正式的使用了很多年了,William F. Opdyke 在1993年的博士論文[1]卻是第一篇著名的關於的重構的文章,即使所有的理論與機制長久以來就以程式轉換系統存在。所有這些資源提供了一種常用重構方法的型錄索引──所有重構方法需要描述,包括怎樣辨識你需要 (或者不需要) 套用該方法,以及如何套用的問題。
[编辑] 重構方法簡單列表
下面是非常不完整的代碼重構清單。長一點的清單可以在福勒的重構書找到。因為研究者們繼續努力不懈的發明以及實現重構,完整清單可能永遠都不存在。
- 成員變數封裝(Encapsulate Field)
- 方法提取 (Extract Method) — 意思是轉換大型方法的部分變成新方法。透過拆分代碼成比較小點的區塊而促進方法可讀性。這也對函式通用。
- 一般化型別 (Generalize Type)
- 函數歸父 (Pull Up) — 或譯函數上移,指的是方法從子類移動到父類。
- 函數歸子 (Push Down) — 或譯函數下移,指的是方法從父類移動到子類。
- 方法更名 (Rename Method) — 對方法變更其名以更好的表達它的用途。
[编辑] 代碼重構自動化
許多軟體編輯器與整合環境支援重構自動化,又稱為重構瀏覽器。枚舉如下:
- IntelliJ IDEA (Java專用)
- Eclipse 給 Java 用的開發包 (JDK)
- NetBeans (Java 專用)
- Visual Studio 2005 (.NET專用)
- CodeGear Delphi
- Bicycle Repair Man (Python 專用,可與 emacs 與 vi 共用)
- Refactoring Browser,Smalltalk專用
[编辑] 辭源
首先使用「重構」一辭於出版文獻是於一篇文章:Refactoring: An Aid in Designing Application Frameworks and Evolving Object-Oriented Systems, Proceedings of the Symposium on Object Oriented Programming Emphasizing Practical Applications (SOOPPA),1990年9月,由 William F. Opdyke 與 Ralph E. Johnson 聯名出版 [2]。William Opdyke 的博士論文於「重構:物件導向框架」,伊利諾大學,1992年出版 [1]。「重構」術語幾乎至其後確定。
就英文新造字學來說,代碼重構(Refactoring)清楚地來自數學上的分解(factoring)。
[编辑] 參見
[编辑] 參考資料
- ^ 1.0 1.1 http://martinfowler.com/bliki/EtymologyOfRefactoring.html
- ^ http://www.cs.ucd.ie/staff/meloc/home/papers/thesis/Chapter2.pdf
[编辑] 參考書目
- 馬丁·福勒: 《重構:改進現有代碼的設計》,Addison-Wesley Professional 1999, ISBN 0201485672
- William C. Wake:《重構練習冊》,Addison-Wesley, ISBN 0-321-10929-5
- Joshua Kerievesky:《重構到模式》,Addison-Wesley, ISBN 0321213351
[编辑] 外部鏈接
- (英文)什麼是重構? (c2.com 文獻)
- (英文)Martin Fowler的關於重構的主頁
- (英文)William F. Opdyke在1993年發表的博士論文
- (英文)面向方面的重構,Ramnivas Laddad著
- (英文)軟件重構的縱覽,Tom Mens和Tom Tourwé著
- (英文)如何編寫難以維護的代碼,Roedy Green著
- (英文)重構工具
- (英文)重構 - alphabetical list
- (英文)重構為模式的目錄
- (英文)重構Java代碼
- (英文)通用重構連結
- (英文)微控制器軟體的重構
- (英文)Refuctoring — 重構的反面 (來自 Waterfall2006 會議的嘲諷)
- (英文)重構文獻
- (英文)重構相關短文

