創提部落格
希望我們能與您分享和探討成長中的點點滴滴
什麼是遺留程式碼:有效地處理遺留程式碼的8個小貼士
分享到
處理舊的而不是您自己編寫的歷史遺留程式碼將是一份苦差事。但是,除非您是從頭開始一個項目,否則這是不可避免的。這意味著您需要一種更好的方式來處理遺留程式碼。
這就是為什麼我們提供了一些指導,解釋什麼是遺留程式碼、如何有效地處理遺留程式碼的最佳實踐,以及靜態程式碼分析如何説明重構程式碼。
本文將包含如下幾個部分:
• 什麼是遺留程式碼?
• 為什麼有效地處理遺留程式碼是一項挑戰?
• 處理遺留程式碼的8個小貼士
• 能有效處理遺留程式碼的工具
什麼是遺留程式碼?
遺留程式碼是繼承自其他人或繼承自舊版本軟體的源程式碼。它也可以是任何您無法理解並難以更改的程式碼。
為什麼有效地處理遺留程式碼是一項挑戰?
處理舊的或不熟悉的程式碼所面臨的最大挑戰可能是您對它的假設。
您可能會認為這些程式碼很糟糕。不管是誰寫的,他都不知道自己在做什麼。您本可以做得更好。
但事實是,程式碼之所以這樣編寫,通常是有原因的。如果程式碼不是您寫的,您可能不知道具體原因。
這就是為什麼在對程式碼庫進行改進時需要格外小心。您不能只對一個區域進行快速修復。可能存在一些您沒有意識到的依賴項。
這就是為什麼知道什麼時候維護或更改程式碼庫是至關重要的。
處理遺留程式碼的8個小貼士
您不可能在一夜之間就改進繼承的程式碼。但是,您可以循序漸進地改進它。
無論您是剛剛開始,還是已經做了一段時間,您都應該遵循以下8個小貼士。
1. 測試程式碼
理解程式碼的一種方法是創建特徵測試用例和單元測試用例。您還可以使用程式碼品質工具(比如,靜態程式碼分析工具)來識別您程式碼中的潛在問題。
這將幫助您理解程式碼的實際功能。而且,它會顯示任何可能存在問題的區域。一旦您理解了程式碼,您就可以更有信心地進行更改。
2. 查看文檔
查看原始需求文檔將幫助您理解程式碼的來源。
將文檔放在手邊可以説明您在不破壞系統的情況下改進程式碼。如果沒有這些資訊,您可能會意外地做出引入不良行為的更改。
3. 只在必要時重寫程式碼
您可能會忍不住重寫繼承的程式碼庫,但這種做法通常是個錯誤。
重寫所有程式碼需要花費太多的時間,浪費太多的程式師。而且,即使您這樣做了,重寫程式碼也會引入新的缺陷,或刪除隱藏的功能。
4. 嘗試重構
最好是嘗試重構遺留程式碼,而不是重寫程式碼。而且,最好是循序漸進地。
重構是指在不改變其功能的情況下更改程式碼結構的過程。
這樣可以清理程式碼,使其更容易理解,還能消除潛在的錯誤。
當您重構程式碼時,最好:
• 重構有單元測試的程式碼,這樣您就知道您有些什麼了。
• 從程式碼的最深層開始,因為這是最容易重構的。
• 在重構後進行測試,以確保您沒有破壞任何東西。
• 有一個安全網,例如持續集成,這樣您就可以恢復到以前的版本。
5. 在不同的評審週期中進行更改
不要一次進行太多的更改。在同一個評審週期中和功能更改一起重構程式碼不是一個好主意。
另外,這也使得程式碼審查更加容易。個別的更改對審查員來說比大量的更改更明顯。
6. 與其他開發人員協作
您可能不是非常瞭解程式碼庫,但您的一些開發人員同事可能十分瞭解。向最瞭解程式碼庫的開發人員提問要快得多。
所以,如果可能的話,儘量與比您更瞭解程式碼庫的人協作。對程式碼的另一種觀察角度可能會幫助您更好地理解它。
7. 保持新程式碼整潔
有一種方法可以避免程式碼出現更多問題,即通過確保新程式碼是整潔的。新程式碼的編寫應該遵循最佳實踐。
您無法控制繼承程式碼的品質,但您可以確保您新添加的程式碼是整潔的。
8. 做深入研究
隨著時間的推移,處理繼承的程式碼庫變得越來越容易。初級開發人員可能不理解為什麼程式碼庫沒有被重構(並且可能熱衷於重構它),但是高級開發人員知道什麼時候該保留它們。
瞭解更多關於程式碼庫的資訊將有利於您改進它。
Michael C. Feathers撰寫的這篇文章是一個很好的起點,其中包含了一些關於如何更改程式碼庫的良好示例。
另一個不錯的來源是Martin Fowler撰寫的《重構:改進現有程式碼的設計》一書。該書提供了許多有效地重構程式碼的建議。
能有效處理遺留程式碼的工具
您總是需要處理繼承程式碼或避開它。畢竟,這些程式碼的存在是有原因的。它在運行而且運行結果可能足夠好,以致您可以不顧已知的問題。
更改程式碼也有很好的理由。您可能添加一個功能,修復一個缺陷,或者改進設計。
在理想的情況下,您會不斷地重寫舊的或不熟悉的程式碼,直到完全調試完畢。但這很有可能是不切實際的。
因此,您需要做的是找出您能更改的程式碼,而不要管其他的。
靜態程式碼分析
一種方法是使用程式碼品質工具,比如靜態程式碼分析工具。您可以設置一個基線,然後對新程式碼進行分析,以確保它是整潔的。您還可以抑制程式碼庫中的結果。
例如,Helix QAC和Klocwork就很容易做到這一點。
分析遺留程式碼
Helix QAC可以根據規則(通常來自編碼規範)檢查您的程式碼庫,您將得到違規行為的診斷。您還可以按嚴重程度進行優先順序排序,這意味著您可以首先集中精力修復最容易出錯的部分。
設置基線
您還可以為程式碼庫設置基線(baseline)。也許程式碼本來就很好,而您不想變動它。設置基線意味著遺留程式碼庫不會被納入到分析工具中。這樣您可以專注於發現新程式碼中的問題,並確保其整潔。
Helix QAC可以輕鬆設置基線
使用抑制
您還可以使用抑制來為程式碼庫創建例外情況,從根本上忽略其中的違規行為。您可以對特定類別中的特定規則或違規行為設置抑制。
Helix QAC允許您抑制遺留程式碼庫中發現的診斷
確保合規
在某些情況下,您可能會從一個項目到另一個項目複用源程式碼。但是,有些源程式碼沒有根據編碼規範開發。如果您需要實現合規(如MISRA合規),這可能會產生問題。通過使用Perforce靜態程式碼分析工具,如Helix QAC for C/C++或Klocwork for C, C++, C#, Java, JavaScript, Python,很容易看到程式碼中的錯誤所在。