軟體工程/測試/重構簡介
程式碼重構是“重構程式碼的紀律方式”,[1]旨在改進軟體的一些非功能性屬性。通常,這是透過應用一系列“重構”來完成的,每個重構都是對計算機程式原始碼的(通常是)微小的改變,不會改變其功能需求。優點包括改進程式碼可讀性和降低複雜度以提高原始碼的可維護性,以及更具表現力的內部架構或物件模型以提高可擴充套件性。
| “ | 透過持續改進程式碼設計,我們讓程式碼更容易使用。這與通常發生的情況形成鮮明對比:很少進行重構,而將大量注意力放在快速新增新功能上。如果你養成不斷重構的習慣,你會發現擴充套件和維護程式碼更容易。 | ” |
—- 喬舒亞·凱里夫斯基,重構到模式 [2] | ||
重構並非在真空中進行,而是通常在為軟體新增功能的背景下進行重構過程
- "... 重構和新增新功能是兩個不同的但互補的任務" -- 斯科特·安布勒
概述
[edit | edit source]重構通常是由注意到程式碼異味而驅動的。[3]例如,手頭的函式可能非常長,或者它可能與另一個附近的函式幾乎完全相同。一旦識別出來,就可以透過重構原始碼或將其轉換為與以前行為相同但不再“有異味”的新形式來解決這些問題。對於一個長的例程,可以提取一個或多個更小的子例程。或者對於重複的例程,可以消除重複並使用一個共享的函式來代替它們。未能進行重構會導致積累技術債務。
重構活動有兩大類益處。
- 可維護性。修復錯誤更容易,因為原始碼易於閱讀,並且作者的意圖易於理解。[4]這可以透過將大型單片例程分解成一組單獨的簡明、命名清晰、單一用途的函式來實現。它可以透過將函式移動到更合適的類或刪除誤導性註釋來實現。
- 可擴充套件性。如果應用程式使用可識別的設計模式,並且它提供了一些以前可能不存在的靈活性,那麼擴充套件應用程式的功能更容易。[2]
在重構一段程式碼之前,需要一組可靠的自動單元測試。這些測試應該在幾秒鐘內[需要引用]證明模組的行為是正確的。然後,這個過程是一個反覆迴圈,進行小的程式轉換,對其進行測試以確保正確性,然後進行另一次小的轉換。如果在任何時候測試失敗,則撤消最後一次小的更改,並以不同的方式重新嘗試。透過許多小的步驟,程式從它所在的位置移動到您想要它所在的位置。極限程式設計和其他敏捷方法的支持者將這種活動描述為軟體開發週期的一個組成部分。
重構技術列表
[edit | edit source]以下是一些程式碼重構的示例;其中一些可能只適用於某些語言或語言型別。在 Fowler 的 Refactoring 書籍[3]和 Fowler 的 Refactoring 網站[5]上可以找到更長的列表。
- 允許更多抽象的技術
- 將程式碼分解成更多邏輯部分的技術
- 提取函式,將一個更大函式的一部分轉換成一個新函式。透過將程式碼分解成更小的部分,更容易理解。這也適用於函式。
- 提取類將程式碼的一部分從現有類移動到一個新的類。
- 改進程式碼名稱和位置的技術
- 移動函式或移動欄位 - 移動到更合適的類或原始檔
- 重新命名函式或重新命名欄位 - 將名稱更改為更能揭示其目的的新名稱
- 向上移動 - 在 OOP 中,移動到超類
- 向下移動 - 在 OOP 中,移動到子類
硬體重構
[edit | edit source]雖然術語重構最初專門指軟體程式碼的重構,但在近年來,用硬體描述語言 (HDL) 編寫的程式碼也被重構。術語硬體重構被用作重構硬體描述語言中程式碼的簡稱。由於 HDL 在大多數硬體工程師看來不被認為是程式語言,[8]硬體重構被認為是與傳統程式碼重構不同的領域。
Zeng 和 Huss 提出了對模擬硬體描述(在 VHDL-AMS 中)進行自動重構的方法。[9]在他們的方法中,重構保留了硬體設計的模擬行為。改進的非功能性度量是重構後的程式碼可以由標準合成工具處理,而原始程式碼則無法處理。數字 HDL 的重構,儘管是手動重構,但也得到了 Synopsys 研究員 Mike Keating 的調查。[10][11]他的目標是使複雜系統更容易理解,從而提高設計師的生產力。
在 2008 年夏季,關於 VHDL 程式碼重構的激烈討論出現在news://comp.lang.vhdl 新聞組上。[12]討論圍繞著一位工程師進行的特定手動重構,以及是否存在此類重構的自動化工具的問題。
截至 2009 年底,Sigasi 正在為 VHDL 重構提供自動化工具支援。[13]
歷史
[edit | edit source]過去,重構在開發流程中被避免。一個例子是 CVS(創建於 1984 年)不版本化檔案和目錄的移動或重新命名。
雖然重構程式碼已經非正式地進行了多年,但 William Opdyke 1992 年的博士論文[14]是第一篇專門研究重構的論文,[15]儘管所有理論和機制長期以來一直作為程式轉換系統可用。所有這些資源都提供了一個常見的重構方法目錄;重構方法描述瞭如何應用該方法以及何時應該(或不應該)應用該方法的指標。
Martin Fowler 的著作《重構:改善既有程式碼的設計》[3] 是該領域的權威參考書。
"重構" 一詞最早出現在 1990 年 9 月 William F. Opdyke 和 Ralph E. Johnson 發表的一篇文章中。 [16] Opdyke 的博士論文 [14] 於 1992 年出版,也使用了該術語。 [15]
"分解" 一詞至少從 1980 年代初就在 Forth 社群中使用 [需要來源]。 Leo Brodie 的著作《思考 Forth》 (1984) 第六章專門討論了這個主題。
在極限程式設計中,提取方法重構技術與 Forth 中的分解具有本質上相同的含義;將一個 "詞" (或函式) 分解為更小、更易於維護的函式。
許多軟體編輯器和 IDE 都支援自動化重構。以下是其中一些編輯器或所謂的重構瀏覽器。
- IntelliJ IDEA (用於 Java)
- Eclipse 的 Java 開發工具包 (JDT)
- NetBeans (用於 Java)
- 以及 RefactoringNG,一個用於重構的 NetBeans 模組,您可以在其中編寫程式抽象語法樹的轉換規則。
- Embarcadero Delphi
- Visual Studio (用於 .NET)
- JustCode (Visual Studio 的外掛)
- ReSharper (Visual Studio 的外掛)
- Coderush (Visual Studio 的外掛)
- Visual Assist (Visual Studio 的外掛,支援 VB、VB.NET、C# 和 C++ 的重構)
- DMS 軟體重構工具包 (為 C、C++、C#、COBOL、Java、PHP 和其他語言實現大規模重構)
- Photran,一個用於 Eclipse IDE 的 Fortran 外掛
- SharpSort,Visual Studio 2008 的外掛
- Sigasi Studio - VHDL 和 System Verilog 的獨立軟體或外掛軟體
- XCode
- Smalltalk 重構瀏覽器 (用於 Smalltalk)
- Simplifide (用於 Verilog、VHDL 和 SystemVerilog)
- Tidier (用於 Erlang)
- ↑ Scott Ambler
- ↑ a b Kerievsky, Joshua (2004). Refactoring to Patterns. Addison Wesley.
- ↑ a b c Fowler, Martin (1999). Refactoring: Improving the design of existing code. Addison Wesley.
- ↑ Martin, Robert (2009). Clean Code. Prentice Hall.
- ↑ Fowler 重構網站上的重構技術
- ↑ 用狀態/策略替換型別檢查程式碼
- ↑ 用多型性替換條件語句
- ↑ 硬體描述語言和程式語言
- ↑ Kaiping Zeng, Sorin A. Huss, "透過行為 VHDL-AMS 模型的程式碼重構進行架構細化"。ISCAS 2006
- ↑ M. Keating :"複雜性、抽象和複雜系統設計挑戰",在 DAC'08 教程 [1]"彌合驗證差距:從 C++ 到 RTL 的實際設計"
- ↑ M. Keating, P. Bricaud: 系統級晶片設計的複用方法手冊,Kluwer Academic Publishers,1999。
- ↑ http://newsgroups.derkeiler.com/Archive/Comp/comp.lang.vhdl/2008-06/msg00173.html
- ↑ www.eetimes.com/news/latest/showArticle.jhtml?articleID=222001855
- ↑ a b Opdyke, William F (1992). "重構面向物件的框架" (壓縮 Postscript). 博士論文. 伊利諾伊大學厄巴納-香檳分校. 檢索於 2008-02-12.
{{cite journal}}: Cite journal requires|journal=(幫助); Unknown parameter|month=ignored (幫助) - ↑ a b Martin Fowler,"MF Bliki:重構詞源"
- ↑ Opdyke,William F.;Johnson,Ralph E. (1990 年 9 月). "重構:一種設計應用程式框架和改進面向物件系統的方法". 面向物件程式設計研討會論文集,重點關注實際應用 (SOOPPA). ACM.
- Fowler, Martin (1999). 重構。改進既有程式碼的設計. Addison-Wesley. ISBN 0-201-48567-2.
- Wake, William C. (2003). 重構工作簿. Addison-Wesley. ISBN 0-321-10929-5.
- Mens, Tom 和 Tourwé, Tom (2004) 軟體重構調查,IEEE 軟體工程學報,2004 年 2 月(第 30 卷第 2 期),第 126-139 頁
- Feathers, Michael C (2004). 有效地處理遺留程式碼. Prentice Hall. ISBN 0-13-117705-2.
- Kerievsky, Joshua (2004). 重構到模式. Addison-Wesley. ISBN 0-321-21335-1.
- Arsenovski, Danijel (2008). Visual Basic 專業重構. Wrox. ISBN 0-47-017979-1.
- Arsenovski, Danijel (2009). C# 和 ASP.NET 專業重構. Wrox. ISBN 978-0470434529.
- Ritchie, Peter (2010). 使用 Visual Studio 2010 進行重構. Packt. ISBN 978-1849680103.
- 什麼是重構? (c2.com 文章)
- Martin Fowler 的重構主頁
- 面向方面的重構 由 Ramnivas Laddad 撰寫
- 軟體重構調查 由 Tom Mens 和 Tom Tourwé 撰寫
- 重構 在 DMOZ
- Java 程式碼重構
- 重構到模式目錄
- 從條件中提取布林變數 (重構模式,未在上述目錄中列出)
- 測試驅動開發與重構
- 重訪 Fowler 的影片店:重構程式碼,完善抽象