程式碼重構終極指南!!

語言: CN / TW / HK

我們一直在尋找各種方法來清理程式碼、降低複雜性和改善功能。而重構為我們指明瞭前進的方向。

1、什麼是重構?

Martin Fowler曾出版了兩本有關重構的書籍,他認為:

重構指的是,在不改變程式碼的外部行為,只改善其內部結構的方式下,修改軟體系統的過程。重構是一種有條理的清理程式碼的方式,可以最大程度地減少引入bug的機會。本質上,重構意味著在程式碼編寫完成後,改進程式碼的設計。

2、重構有什麼好處?

重構原始碼有數不清的好處。首先,重構可以將混亂、不正確和/或重複的程式碼轉換成整潔的程式碼。它可以解決多位開發人員協同工作時可能引發的程式碼標準化問題。重構可以提高可讀性,改善原始碼的可維護性以及整體結構和功能。重構可以使程式碼更易於擴充套件和新增新功能。刪除不必要的程式碼(比如重複程式碼)可以減少程式碼所使用的記憶體,並加快執行速度。

例如,在2014年,Kickstarter的工程師面臨著一個巨大的挑戰:由於使用者數量呈指迅速增長,導致查詢效能下降。為此,他們將MySQL查詢重構為Redis,減少了100毫秒的載入時間,從而減少了載入時間的差異並提高了網站的整體速度。

3、技術負債與重構

簡而言之,重構是消除或減少技術負債的一種方式。

重構對於長期維持的程式碼質量、安全性和效能至關重要。如果沒有定期的重構,開發人員就會承受巨大的技術負債。重構程式碼的機會越少,技術負債就會越多,開發新功能也會變得越來越難。

4、重構的指標

我們可以通過各種指標,衡量重構程式碼的優先順序。在指標的幫助下,我們可以有條不紊地計劃重構,每一次都專心完成最重要的任務。

此外,你需要通過指標來衡量重構的效果。我們不僅需要重構低效的程式碼,而且還可以通過修改低效程式碼增加價值。為了獲得真正的價值,你需要進行測試,包括單元測試和功能測試。除此之外,還有一些其他方面的指標,比如發現的bug數減少,以及降低迴圈複雜性(重構的目標是降低複雜性)。高度複雜的方法或功能(比如超過350行的方法或功能)就是良好的重構物件。

此外,我們還需要考慮,如何將重構融合到更廣泛的團隊目標或有關工作流和任務的里程碑中。

5、程式碼重構示例

程式碼重構的示例非常多,為了簡潔起見,我們介紹以下幾種:

紅色,綠色和重構

重構與單元測試息息相關。最常見的形式之一就是敏捷方法固有的測試驅動開發(Test-Driven Development,即TDD)。你可以在編寫程式碼之前先編寫測試。從本質上來說,應該由測試來驅動程式,說明程式碼應該執行的操作。

紅色,綠色和重構是測試驅動開發的一個示例:

  • 紅色:編寫沒有實現程式碼的測試套件,必然會失敗。
  • 綠色:編寫實現程式碼,剛剛好可以通過測試套件。
  • 重構:尋找優化和改進程式碼的方法。

提取方法(又名提取函式)

將程式碼片段從現有方法移到新方法中,而新方法的名稱明確說明了其功能。這種技術有助於降低複雜性並提高程式碼的可讀性。

提取變數

如果遇到難以理解的表示式,或者該表示式在整個程式碼中重複了多次,則可以通過提取變數重構,將表示式或其中一部分放入一個複雜度較低且更易於理解的變數中。這樣可以減少複雜性和程式碼重複。

按抽象建立分支

按抽象建立分支可以逐步對軟體系統進行大規模地修改,而你則可以一邊修改程式碼,一邊定期釋出系統。這種方法可以降低在分支上重構程式碼的複雜性,避免在合併程式碼時出現問題。

方法組合

程式碼過長不便於理解,而且也不方便修改。方法組合指的是一系列的操作,將方法改成順序結構並刪除重複的程式碼。這些操作包括內聯方法、內聯模板、用查詢代替模板、拆分臨時變數以及刪除對引數的賦值等。

6、重構程式碼的工具

你需要專業的重構工具嗎?Martin Fowler表示,自動化的工具有幫助但不是必需的。他指出:

“許多語言都有IDE,可以自動執行許多常見的重構。這些是非常有價值的工具,可以幫助我更快地重構程式碼。但是,這些工具不是必不可少的,我經常在沒有工具支援的情況下編寫程式,每次只邁出一小步,並通過頻繁的測試來發現錯誤。”

許多開發環境都可以自動化重構,一些常見的重構工具包括:

  • Visual studio intellicode
  • Eclipse IDE
  • Spring Tool Suite 4
  • Rider
  • IntelliJ IDEA
  • SonarQube

7、重構與工程經理的難題

為了解決引發重構需求的問題,首先我們需要弄清楚公司的運營方式。在著手重構之前,請先回答下列幾個問題:

  • 哪些任務最優先?
  • 開發的速度如何?
  • 開發人員是否感覺到了快速交付程式碼的壓力?
  • 解決技術負債的流程都有哪些?
  • 實施了哪些型別的程式碼稽核?
  • 團隊成員是否具備適當的重構技能?
  • 公司的文件標準是什麼?

如果不解決引發重構需求的根本問題,那麼問題只會愈演愈糟。

8、高階管理層對重構的支援

你們公司可能並沒有在基礎設施和維護上投入太多資金。

可能會有人說,應該將花費在重構上的時間投入到新功能開發上。

但是,我們仍然應該看一看重構的好處,以及它們與工作流程、客戶、收入和業務增長的關係。重構得當可以改善程式碼,交付有效更新以及急需的功能,從而吸引新客戶和回頭客。即使在成功釋出產品之後,軟體公司也可以通過這種方式保持競爭力。

為了獲取高層管理的支援,還有一個更好的方法,即量化團隊當前花費在修復原始程式碼中的錯誤或bug上的時間。具體一點,比如每天一個小時?每天兩個小時?持續記錄一個星期,你就會驚訝地發現原來團隊每年需要花費數週或數月時間來修復遺留的程式碼。

9、團隊支援與重構:一個Sprint還是馬拉松?

很難在團隊內部開展重構工作?提及重構就會哀聲載道?順利開展重構的最重要的標誌就是有計劃、有目標以及有文件記錄的行動。Ron Jeffries(極限程式設計的三大創始人之一)將重構比喻為清道:

“花些時間清出一條道來,那麼下一次我們就可以直奔我們要構建的下一個功能,而無需繞過雜草和灌木叢。”

但是,他強調指出,糟糕的程式碼需要花費很長的時間來清理,而且重構應該經過深思熟慮:

“如果我們只改進手頭的程式碼,而忽略目前不涉及的程式碼,那麼以後必然會走回頭路。”

在同一個Sprint中,我們經常發現後面的功能用到了我們之前清理過的程式碼。我們就會立即享受重構的好處。如果我們等積攢了一堆技術負債,再開始重構,那麼我們享受的好處會延遲,甚至可能會在一些沒大有用的地方浪費精力。

產品工程師兼首席技術官Andreas Klinger是Fix-it Friday的粉絲,他表示:

“Fix-it Friday的規則很簡單:除非當前的專案十萬火急,否則週五的工作就應該是重構。讓工程師選擇他們的工作。我們不應該因為微觀管理而抹殺這種樂趣。有些人會嘗試新的庫。有些人會修復積壓的bug。這兩種工作都很好。我們嘗試鼓勵大家平衡這些任務。”

無論採用哪種方法,你都需要慎重思考,詢問團隊哪些程式碼最影響他們的效率。

  • 修復哪些程式碼對你的其他程式碼產生的影響最大?
  • 解決哪些問題得到的回報最多?

你不太可能找到一整塊專門的時間來重構程式碼,重構程式碼必然會犧牲你花費在其他專案上的時間,但請不要低估定期堅持開展小範圍的重構帶來的影響。聚沙成塔,集腋成裘,最終你會獲得豐厚的回報。

10、文件與重構

標準化命名約定之類的文件可以讓每個人都達成共識。Xerox的高階開發人員的研究發現,缺乏文件是重構最大的難題之一。

記錄重構的工作內容不僅可以記錄花費的時間,而且還可以為將來的團隊成員提供說明。

最後,你還通過文件記錄下自己的成功:重構帶來的最大成功是什麼?這些可以成為程式碼稽核的考慮因素嗎?

作者 | Alex Omeyer<br> 譯者 | 彎月<br> 出品 | CSDN(ID:CSDNnews)<br> 原文連結:https://medium.com/swlh/the-ultimate-engineers-guide-to-code-refactoring-c38372632906

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2021最新版)

2.終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!

3.阿里 Mock 工具正式開源,幹掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式釋出,全新顛覆性版本!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!