重构大型C ++函数

时间:2009-05-06 02:30:40

标签: visual-c++ refactoring

在工作中,我们有一个用Visual C ++编写的遗留流程,它基本上由一个5000行功能组成。从本质上讲,程序只是一个大案例陈述,具有类似的剪切和粘贴代码,处理大量的案例逻辑。显然,我们希望重构此代码以将这些情况提取到单独的函数(或对象)中,并消除任何剪切和粘贴的代码。

我的问题是 - 有没有关于这种规模的重构努力的建议?是否有可以简化流程的自动化工具?

9 个答案:

答案 0 :(得分:6)

我的第一步是采取一些较大的案例,并首先将它们分成不同的功能。这将减少视觉混乱的开始,使您更容易进行下一阶段。

其次,确定不同案例的共性,并创建广义函数来代替它们。在一定程度上。如果你走得太远,你将拥有一个与你当前的switch语句一样糟糕的通用函数: - )

我从来没有见过一种工具能够做到头骨内部海绵状物质的一半工作。我建议只使用它。

答案 1 :(得分:3)

几点建议:

您可以使用Duplo等工具找到复制粘贴的代码。脚本(使用您选择的脚本语言)或具有多行搜索和替换的编辑器可以帮助您使用函数调用替换该代码。 (这也可以手动完成,但使用脚本或搜索和替换有助于消除错误的可能性。)

重构工具可以自动执行操作,例如将函数的一部分提取到新函数中。例如,Eclipse CDT可以执行此操作,并且它是免费的,并且可以编辑在其他IDE中维护的代码。这并不总是有效,但是当它工作时,看起来真是太神奇了,因为IDE拆分千行方法,只提取你想要的东西,并正确识别需要作为新参数传入的每个变量您的新方法...可以使用其他重构工具,例如Refactor! Pro(可用免费版本),但我没有使用它们。

更一般地说,Michael Feather的书Working Effectively with Legacy Code是做这类事情的标准工作。基本上,你需要设置特征测试 - 类似于单元测试,但目标是尽可能多地覆盖(表征)当前函数的行为,而不是测试可能的最小单位的正确性 - 然后应用重构一个一次。 (Feathers包含重构目录和其他对遗留代码特别有用的技术。)

答案 2 :(得分:3)

第一步是开发一个好的自动回归测试,如果你还没有。然后,当你将每个案例拉出一个函数时,你可以快速检查你没有破坏任何东西。

答案 3 :(得分:2)

www.wholetomato.com尝试Visual AssistX。它直接与VS6及以上版本的Visual Studio集成。它包含许多出色的开发功能,但您正在寻找的是重构功能。您可以看到该功能here。它确实有成本,但我认为它是使用Visual Studio进行开发时的“秘密武器”。

答案 4 :(得分:0)

我知道Eclipse强调将重构作为一项功能。在IBM's website上列出了所有有用的功能,但特别是“选择新方法”工具似乎适用于您的情况。

答案 5 :(得分:0)

这是一个广泛的问题。有一些自动化工具,但实际情况是你只需要研究代码并做出一些决定。代码中是否存在冗余?如果是这样,请考虑将冗余内容放在自己的函数中。

答案 6 :(得分:0)

  1. 不要试图一次性完成。
  2. 确定可能的重构目标。尽量缩小。
  3. 编写测试以验证该段代码的正确功能。
  4. 一旦你的所有测试都通过了,或者由于原始函数实际上有错误而失败,那就重构一下。
  5. 确保所有测试仍然通过。
  6. GOTO 2。

答案 7 :(得分:0)

接下来史蒂夫·法洛斯(Steve Fallows)所写的内容,在进行单元测试后,确保功能确实发生变化,创建一个新功能,并进行与原始工作相同的单元测试。

此刻他们都会失败。

然后,开始拉出每个case语句并将其放入它自己的函数中,并从new函数调用它,这样你最终只得到一个只有一个开关的函数,每个case只调用一个函数。 / p>

一旦移动了所有功能,您就可以查看是否需要重构任何其他功能,但是,从单元测试开始,以确保功能不会丢失。

每个新功能也应该有自己的单元测试,顺便说一句。

答案 8 :(得分:0)

我们的CloneDR可能会精确识别克隆的代码,并向您展示如何使参数化代码替换单个克隆。

您可以在链接中看到C ++的克隆报告,以及建议的参数化克隆块的外观。