什麼是遺留程式碼:有效地處理遺留程式碼的8個小貼士

創提科技
2022/08/09

分享到

處理舊的而不是您自己編寫的歷史遺留程式碼將是一份苦差事。但是,除非您是從頭開始一個項目,否則這是不可避免的。這意味著您需要一種更好的方式來處理遺留程式碼。
 
這就是為什麼我們提供了一些指導,解釋什麼是遺留程式碼、如何有效地處理遺留程式碼的最佳實踐,以及靜態程式碼分析如何説明重構程式碼。


本文將包含如下幾個部分:
 
     • 什麼是遺留程式碼?
 
     • 為什麼有效地處理遺留程式碼是一項挑戰?
 
     • 處理遺留程式碼的8個小貼士
 
     • 能有效處理遺留程式碼的工具


什麼是遺留程式碼?
 
遺留程式碼是繼承自其他人或繼承自舊版本軟體的源程式碼。它也可以是任何您無法理解並難以更改的程式碼。


為什麼有效地處理遺留程式碼是一項挑戰?
 
處理舊的或不熟悉的程式碼所面臨的最大挑戰可能是您對它的假設。
 
您可能會認為這些程式碼很糟糕。不管是誰寫的,他都不知道自己在做什麼。您本可以做得更好。
 
但事實是,程式碼之所以這樣編寫,通常是有原因的。如果程式碼不是您寫的,您可能不知道具體原因。
 
這就是為什麼在對程式碼庫進行改進時需要格外小心。您不能只對一個區域進行快速修復。可能存在一些您沒有意識到的依賴項。
 
這就是為什麼知道什麼時候維護或更改程式碼庫是至關重要的。


處理遺留程式碼的8個小貼士
 
您不可能在一夜之間就改進繼承的程式碼。但是,您可以循序漸進地改進它。
 
無論您是剛剛開始,還是已經做了一段時間,您都應該遵循以下8個小貼士。


1. 測試程式碼
 
理解程式碼的一種方法是創建特徵測試用例和單元測試用例。您還可以使用程式碼品質工具(比如,靜態程式碼分析工具)來識別您程式碼中的潛在問題。
 
這將幫助您理解程式碼的實際功能。而且,它會顯示任何可能存在問題的區域。一旦您理解了程式碼,您就可以更有信心地進行更改。


2. 查看文檔
 
查看原始需求文檔將幫助您理解程式碼的來源。
 
將文檔放在手邊可以説明您在不破壞系統的情況下改進程式碼。如果沒有這些資訊,您可能會意外地做出引入不良行為的更改。


3. 只在必要時重寫程式碼
 
您可能會忍不住重寫繼承的程式碼庫,但這種做法通常是個錯誤。
 
重寫所有程式碼需要花費太多的時間,浪費太多的程式師。而且,即使您這樣做了,重寫程式碼也會引入新的缺陷,或刪除隱藏的功能。


4. 嘗試重構
 
最好是嘗試重構遺留程式碼,而不是重寫程式碼。而且,最好是循序漸進地。
 
重構是指在不改變其功能的情況下更改程式碼結構的過程。
 
這樣可以清理程式碼,使其更容易理解,還能消除潛在的錯誤。
 
當您重構程式碼時,最好:
 
    • 重構有單元測試的程式碼,這樣您就知道您有些什麼了。
 
    • 從程式碼的最深層開始,因為這是最容易重構的。
 
    • 在重構後進行測試,以確保您沒有破壞任何東西。
 
    • 有一個安全網,例如持續集成,這樣您就可以恢復到以前的版本。


5. 在不同的評審週期中進行更改
 
不要一次進行太多的更改。在同一個評審週期中和功能更改一起重構程式碼不是一個好主意。
 
另外,這也使得程式碼審查更加容易。個別的更改對審查員來說比大量的更改更明顯。


6. 與其他開發人員協作
 
您可能不是非常瞭解程式碼庫,但您的一些開發人員同事可能十分瞭解。向最瞭解程式碼庫的開發人員提問要快得多。
 
所以,如果可能的話,儘量與比您更瞭解程式碼庫的人協作。對程式碼的另一種觀察角度可能會幫助您更好地理解它。


7. 保持新程式碼整潔
 
有一種方法可以避免程式碼出現更多問題,即通過確保新程式碼是整潔的。新程式碼的編寫應該遵循最佳實踐。
 
您無法控制繼承程式碼的品質,但您可以確保您新添加的程式碼是整潔的。


8. 做深入研究
 
隨著時間的推移,處理繼承的程式碼庫變得越來越容易。初級開發人員可能不理解為什麼程式碼庫沒有被重構(並且可能熱衷於重構它),但是高級開發人員知道什麼時候該保留它們。
 
瞭解更多關於程式碼庫的資訊將有利於您改進它。
 
Michael C. Feathers撰寫的這篇文章是一個很好的起點,其中包含了一些關於如何更改程式碼庫的良好示例。
 
另一個不錯的來源是Martin Fowler撰寫的《重構:改進現有程式碼的設計》一書。該書提供了許多有效地重構程式碼的建議。


能有效處理遺留程式碼的工具
 
您總是需要處理繼承程式碼或避開它。畢竟,這些程式碼的存在是有原因的。它在運行而且運行結果可能足夠好,以致您可以不顧已知的問題。
 
更改程式碼也有很好的理由。您可能添加一個功能,修復一個缺陷,或者改進設計。
 
在理想的情況下,您會不斷地重寫舊的或不熟悉的程式碼,直到完全調試完畢。但這很有可能是不切實際的。
 
因此,您需要做的是找出您能更改的程式碼,而不要管其他的。


靜態程式碼分析
 
一種方法是使用程式碼品質工具,比如靜態程式碼分析工具。您可以設置一個基線,然後對新程式碼進行分析,以確保它是整潔的。您還可以抑制程式碼庫中的結果。
 
例如,Helix QACKlocwork就很容易做到這一點。


分析遺留程式碼
 
Helix QAC可以根據規則(通常來自編碼規範)檢查您的程式碼庫,您將得到違規行為的診斷。您還可以按嚴重程度進行優先順序排序,這意味著您可以首先集中精力修復最容易出錯的部分。


設置基線
 
您還可以為程式碼庫設置基線(baseline)。也許程式碼本來就很好,而您不想變動它。設置基線意味著遺留程式碼庫不會被納入到分析工具中。這樣您可以專注於發現新程式碼中的問題,並確保其整潔。

 

什么是遗留代码:有效地处理遗留代码的8个小贴士-1.jpg
Helix QAC可以輕鬆設置基線


使用抑制
 
您還可以使用抑制來為程式碼庫創建例外情況,從根本上忽略其中的違規行為。您可以對特定類別中的特定規則或違規行為設置抑制。


 什么是遗留代码:有效地处理遗留代码的8个小贴士-2.jpg
Helix QAC允許您抑制遺留程式碼庫中發現的診斷


確保合規
 
在某些情況下,您可能會從一個項目到另一個項目複用源程式碼。但是,有些源程式碼沒有根據編碼規範開發。如果您需要實現合規(如MISRA合規),這可能會產生問題。通過使用Perforce靜態程式碼分析工具,如Helix QAC for C/C++或Klocwork for C, C++, C#, Java, JavaScript, Python,很容易看到程式碼中的錯誤所在。