在本指南中,您將了解重構源代碼的所有內容:好處、挑戰、工具和最佳實踐,以及重構和技術債務之間的區別。
一個人在他的筆記本電腦上工作A man working on his laptop computer
我們都在尋找清理代碼、降低復雜性和改進功能的方法。重構提供了前進的道路。
本指南將涵蓋以下主題:
- 什么是重構?
- 重構有什么好處?
- 技術債務與重構
- 重構指標
- 代碼重構示例
- 代碼重構工具
- 重構和工程經理面臨的挑戰
- 高級管理層對重構的支持
- 團隊支持和重構:沖刺還是馬拉松?
- 文檔和重構
什么是重構?
根據兩本關於重構的書籍的作者 Martin Fowler的說法
“重構是改變軟件系統的過程,它不會改變代碼的外部行為,但會改善其內部結構。這是一種清理代碼的嚴格方法,可以最大限度地減少引入錯誤的機會。本質上,當你重構時,你是在改進編寫代碼后的設計。”
重構有什么好處?
源代碼重構提供了許多優勢。它將混亂、不正確和/或重復的代碼變成干凈的代碼。它解決了多個開發人員貢獻自己的代碼時可能出現的標准化問題。重構提供了更高的可讀性並提高了源代碼的可維護性以及整體結構和功能。重構可以使代碼更容易擴展和添加新功能。刪除不必要的部分(例如重復)也可以使代碼使用更少的內存並更快地執行。
例如,在 2014 年,Kickstarter 工程師面臨用戶數量呈指數增長導致查詢性能下降的挑戰。作為回應,他們將 MySQL 查詢重構為 Redis,並將典型的加載時間縮短了 100 毫秒以上,從而減少了加載時間的差異,並使網站整體速度更快。
技術債務與重構
使用虛擬現實模擬器對抗窗戶上的粘合劑的商人的全長Full length of businessman
簡而言之,重構是消除或減少技術債務的一種方式。
重構對於保持長期的代碼質量、安全性和性能至關重要。如果不定期進行保理,開發人員就會背負巨額的技術債務。隨着錯過更多代碼重構的機會,這種債務會增加,因此,新的開發變得困難,尤其是基於遺留代碼的開發。
重構指標
使用指標可以讓您確定您真正需要對代碼執行的主要修復操作的優先級。它阻止您嘗試一次完成所有事情,並首先專注於最重要的任務。
此外,您需要衡量源代碼重構效果的指標——這不僅僅是改變低效代碼,而是改變低效代碼以增加價值。**要獲得真正的價值,您需要進行單元測試(例如單元測試失敗的數量)和功能測試。其他指標可能包括發現更少的錯誤和降低圈復雜度——重構應該旨在降低復雜度。具有高復雜度的方法或函數(例如超過 350 行的那些)是很好的重構目標。
在工作流和任務方面,重構如何與更廣泛的團隊目標或里程碑相適應也是值得考慮的。這應該包括更小的代碼大小和更易於理解的代碼。
代碼重構示例
代碼重構的例子有很多,但為簡潔起見,我們將重點介紹幾個:
- 紅色、綠色、重構
重構與單元測試密切相關。最常見的形式之一是敏捷方法固有的測試驅動開發 (TDD)。在編寫代碼之前編寫測試。本質上,測試應該驅動程序,說明代碼應該做什么。
Red、Green、Refactor 是 TDD 的一個例子:
- 紅色:編寫沒有實現代碼的測試套件,確保它失敗。
- 綠色:編寫實現代碼,足以讓測試套件通過。
- 重構:尋找優化和改進代碼的方法。
- 提取方法又名提取函數
- 將現有方法中的一段代碼移動到一個明確命名的新方法中,以解釋其功能。這種技術有助於降低復雜性並提高代碼的可讀性。
- 提取變量
如果您遇到一個難以理解的表達式,或者它在整個代碼中的多個位置重復,則提取變量重構可以將此類表達式的結果或其部分放入一個不太復雜且更易於理解的單獨變量中。這降低了復雜性和代碼重復。
- 抽象分支
抽象分支用於以漸進的方式對軟件系統進行大規模更改,允許您在更改仍在進行時定期發布系統。這消除了在嘗試合並代碼時可能出現問題的分支上重構代碼的復雜性。
- 組合方法
過長的代碼難以理解且難以更改。Compose 方法是指可用於簡化方法和刪除代碼重復的一系列操作。其中包括 Inline Method、Inline Temp、Replace Temp with Query、拆分臨時變量和刪除參數分配。
代碼重構工具
您需要專業的重構工具嗎?Martin Fowler 說自動化工具很有幫助,但不是必不可少的。他指出:
*“許多語言都有可以自動執行許多常見重構的 IDE。這些是我的工具包中非常有價值的部分,可以讓我更快地進行重構。但這些工具並不是必不可少的——我經常在沒有工具支持的情況下使用編程語言工作,在這種情況下,我依賴於采取小步驟,並使用頻繁的測試來檢測錯誤。”
許多開發環境使重構的機械方面自動化。關鍵的代碼重構工具是:
- Visual studio intellicode
- Eclipse IDE
- Spring Tool Suite 4
- Rider
- IntelliJ IDEA
- SonarQube
- Stepsize
重構和工程經理面臨的挑戰
要解決導致需要重構的問題,需要探索公司的運作方式。在開始重構過程之前,請回答幾個問題:
- 哪些任務獲得第一優先權?
- 發展速度如何?
- 開發人員是否感到快速發布代碼的壓力?
- 有哪些流程來處理技術債務?
- 進行了哪些類型的代碼審查?
- 您的團隊是否具備重構的適當技能?
- 公司的文件標准是什么?
如果不解決導致需要重構的潛在問題,問題只會激增。
高級管理層對重構的支持
投資基礎設施和維護在您的公司中可能並不受歡迎。
很容易爭辯說,重構所花費的時間就是遠離新工作所花費的時間。
但值得關注重構的更大好處以及它們與工作流、客戶、收入和業務增長的關系。重構做得好,可以改進需要運行良好的代碼,以提供吸引新客戶和回頭客的有效更新和趨勢功能。這就是軟件公司即使在產品成功發布很久之后仍然保持競爭力的方式。
更好的是通過量化團隊當前花費多少時間來修復由於原始代碼中的問題而導致的錯誤或錯誤,從而獲得高級管理層對重構的支持。具體來說,是一天一小時嗎?一天兩小時?保持一周以上的記錄,當您得知您的團隊每年花費數周或數月來修復遺留代碼時,您可能會感到震驚。
團隊支持和重構:沖刺還是馬拉松?
計算機網絡Computer network
重構對你的團隊來說很難嗎?一提到它,人們會呻吟嗎?成功重構的最大標志是計划好的、有目的地和記錄的操作。Ron Jeffries 是極限編程軟件開發方法的三位創始人之一,他將重構比作清理領域:
“我們采用我們被要求構建的下一個功能,而不是繞過所有雜草和灌木,我們花時間清理其中一些路徑。”
然而,他強調糟糕的代碼需要很長時間才能清理干凈,並支持一種比簡單地深入研究更深思熟慮的方法:
“我們改進了我們工作的代碼,而忽略了我們不需要工作的代碼。很可能,我們會再次訪問這個地方。
通常在同一個 Sprint 中,我們發現后續功能實際上使用了我們之前清理過的區域。我們立即開始從增量重構中受益。如果我們等到大批量進行,我們會付出更多努力,將任何福利推遲到更晚,並且可能會在尚未提供福利的地方浪費精力。”
產品工程師兼首席技術官Andreas Klinger是 Fix-it Friday 的粉絲。
“Fix-it Friday 的規則很簡單:除非您當前的項目着火了,否則請利用周五來投資進行一些小的改進。讓工程師選擇他們的工作。盡量不要通過微觀管理從中獲取“樂趣”。有些人會嘗試新的庫。有些會從積壓中刪除錯誤。兩者都很好。嘗試鼓勵任務的平衡。”
無論您采用哪種方法,都需要加以考慮。詢問您的團隊哪些代碼最妨礙他們的工作效率。
- 什么代碼修復會對您的其他代碼產生最大的影響?
- 哪些修復將提供最大的回報?
您不太可能有大量時間專門用於重構而犧牲所有其他項目,但不要低估定期、一致、專用的小型重構的影響。這些加起來並結合起來,有一個顯着的好處。
文檔和重構
標准化命名約定等文檔可以確保每個人都在同一頁面上。Xerox 高級開發人員對審查重構的研究發現,缺乏文檔是最大的挑戰之一。
記錄您的重構工作會導致花費時間,並為未來的團隊成員提供上下文。
另外,記錄你的成功——重構的最大收獲是什么?這些可以納入同行評審嗎?
淹沒在需要重構和技術債務的代碼中?
選擇一個比較好的編輯器優先的問題跟蹤器,用於幫助工程師實現健康的代碼庫:
- 直接從編輯器創建和查看代碼問題
- 跟蹤和優先考慮代碼改進,如技術債務
- 使用我們的 Jira 集成為您的 sprint 添加關鍵問題