在本指南中,您將瞭解重構原始碼的所有內容:好處、挑戰、工具和最佳實踐,以及重構和技術債務之間的區別。
一個人在他的膝上型電腦上工作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 新增關鍵問題