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