博客
希望我们能与您分享和探讨成长中的点点滴滴
什么是遗留代码:有效地处理遗留代码的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,很容易看到代码中的错误所在。