是否有一个可用的C ++重构工具?

时间:2009-09-07 09:38:02

标签: c++ refactoring

有没有人知道一个功能齐全的C ++重构工具,可以在大型代码库(大约100.000行)下可靠地工作?

我在过去的几年里一次又一次地尝试了我所能找到的东西:SlickEdit,Eclipse CDT。它们都没有用。

概要: 我花时间评估了“Visual Assist X”以及“Refactor for C ++”。两者都有一些令人印象深刻的功能,但两者都远非完美。如果没有人工修改,通常无法提取大量代码 - 因此无法获得回报。

“Visual Assist X”具有很好的功能,例如更完整的自动复合等。但它会导致如此多的闪烁并在某些点上减慢很多。

据我所知,答案是:“不,没有适合C ++的生产就绪重构工具”

2015年3月更新 至于今天的hdoghmens回复,我尝试了Resharper for C ++。 他的联系 https://www.jetbrains.com/resharper/没有提及C ++的任何内容。但我发现一年多前在这里宣布的Resharper C ++:

https://www.jetbrains.com/resharper/features/cpp.html

我尝试使用代码库为20MB的VC2010。

测试1:提​​取方法: 导致Resharper异常。没有更改源代码。

测试2:使用不同来源提取方法: 工作正常

测试3:更改提取函数的签名:破解C ++代码的结果:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

也许这就是为什么C ++没有列在主页上。

根据我的观点,这个问题的答案仍然是“不”

19 个答案:

答案 0 :(得分:41)

Visual Assist和Visual Studio使得处理大型代码库变得更加容易。视觉辅助非常适合追踪类或成员的使用方式,并且在重新命名时更有效,而不会出现误报而不是搜索和替换。

答案 1 :(得分:37)

我发现使用Visual Studio的Visual Assist X非常有用。另一个选择是Refactor for C++

答案 2 :(得分:23)

我预计clang将在未来几年内显着改变C ++重构工具的格局。它是一个开源的模块化编译器,它公开了一个用于解析和语义分析C ++代码的API。 IDE和其他工具将能够使用此API而不是编写自己的解析器和语义分析器的困难工作。

Google already made a large-scale refactoring tool using clang

答案 3 :(得分:17)

Mozilla有自己的重构工具Pork(WikiDeveloper Wiki)。 Here是Pork背后开发人员的博客。据我所知,Pork已成功用于Mozilla的重构。

如果你来自* nix land,猪肉应该会有所帮助,因为Visual Studio我也推荐使用Visual Assist。

答案 4 :(得分:9)

我们的DMS Software Reengineering Toolkit是一个转换引擎,旨在对大量代码(包括C ++)执行复杂的转换。它已被用于对数百万行代码的系统进行可靠的更改。它通过使用编译器精确的语言分析器和变换器来运行。

它有一个完整的C ++解析器,具有名称和类型解析,构建代码的AST,可以应用程序或源到源的转换(使用C ++表面语法)来修改这些树,并在保留注释的情况下重新生成可编译的输出。 (编辑:2011年7月1日:现在我们理解标准的C ++ 1X:)

它已被用于大规模的再造项目,包括C ++组件重新架构,以及语言之间的100%全自动翻译。 你可以在网站上看到这个。

DMS还用于构建任意源分析工具。示例包括克隆检测,测试覆盖率,智能差异(源代码结构和抽象编辑操作的比较,而不是简单插入和删除的行)等。

它不是(目前)是一种交互式重构工具。我们相信,要做好大多数重构,您需要深入控制和数据流分析。 DMS具有通用机制来支持这一点,此时该机制是针对C,COBOL和Java实现的,其中C ++是下一个。这是一项艰巨的工作。在这种问题得到很好解决之前,你不会从任何人那里看到很多严肃的C ++重构工具。 首先,您需要一个完整的C ++解析器: - }

编辑2011年7月5日:看起来我们要在交互式版本上运行。我们已经赢得了能源部第一阶段SBIR以调查如何执行此操作。请参阅http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx(在“德克萨斯州”下查找语义设计)。 不要指望结果匆忙;这只是获得工具的三阶段多年计划的开始。

编辑8/11/2011:第一个进展......我们现在处理所有C ++ 0x和OpenMP指令。

EDIT 1/4/2012:对C ++代码进行完全控制流分析。

EDIT 9/15/2014:现在已经掌握了C ++ 14前端解析器/转换引擎。在这一点上甚至可以非常可靠地重命名: - }

答案 5 :(得分:8)

如果您使用的是emacs,请尝试Xrefactory。它支持方法提取,类/函数/变量的重命名以及插入/删除/移动参数。它还具有非常好/快速的代码完成引擎。

答案 6 :(得分:6)

目前我不推荐任何用于C ++的重构工具,当然不适用于100k及以上的大型代码库。我一直希望这会像OP那样改变,我希望有一天能有所作为。我担心在我们看到任何非常好的工具之前,语言本身可能必须发生重大变化。

顺便说一句,SlickEdit是否放弃了重构功能?

答案 7 :(得分:3)

如果您使用emacs并且还没有尝试过,我建议尝试使用rtags(vim也有package可用)。它是一个基于clang的客户端/服务器应用程序,它索引C / C ++代码,包括以下功能:

  • 转到定义/声明
  • 找到所有参考文献,转到下一个/上一个
  • 重命名符号
  • 与clang的“fixits”整合

在看了talk之后,我决定尝试一下,它为我介绍了rtags(和emacs)。

(我不得不说,只有在我的QtCreator无法正确重命名某些符号之后我才走到这一步,这对于我现在使用这个优秀的IDE来说是一个显示阻碍)

除了rtags支持的内容之外,我还需要一些额外的功能,包括:

  • 创建函数定义/原型
  • 提取功能
  • 创建getter / setter方法

对于这些,我建议使用semantic-refactor包用于emacs(不确定是否有替代vim)

通常,基于clang的工具看起来非常很有希望。如果您对有关C ++重构的clang工具的更多信息感兴趣,包括具有大代码库的项目,Chandler Carruth会进行some great次会谈。

答案 8 :(得分:3)

我认为DMS software rengineering toolkit这样做了。它是一个代码转换引擎,专为大规模设计并处理C ++。不知道输出有多优雅。

答案 9 :(得分:2)

必须提到Klocwork作为商业代码重构套件。通过演示视频时看起来非常有前途。

答案 10 :(得分:1)

如果您希望重新设计代码库:MOOSE。但这是一大堆分析和再造工具,而不是编辑。

答案 11 :(得分:1)

现在有一个来自Microsoft的Visual Studio 2013的C ++重构扩展: http://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194

答案 12 :(得分:1)

CLion看起来很有希望。

免责声明:我还没有尝试过,因为我需要将我的项目转换为CMake格式才能使用它。

答案 13 :(得分:1)

如果您使用的是Visual C ++(Express Edition是免费的),您可以使用Visual Assist from www.wholetomato.com(链接到C ++重构功能)。

它有30天的试用期,我们发现它比Visual C ++产品本身的内置智能感知更快,功能更全。

答案 14 :(得分:1)

我建议你试试Lattix。它允许您分析大型C / C ++代码库以发现架构,识别有问题的依赖关系,并重新设计代码以改善模块化并减少技术债务。 Lattix还提供了许多算法来帮助重构过程。这些算法可帮助您弄清楚如何将元素从层次结构的一个部分移动到另一个部分,打破周期并移动子系统,以便可以改善子系统的耦合和内聚。以下是Lattix分析Android Kernel(160万LOC C / C ++)的结果。 完全披露:我为Lattix工作

答案 15 :(得分:1)

很抱歉,这么晚才发现这个问题。我的学生和助手从2006年左右开始从事C ++重构。大多数CDT重构基础结构都是由我在IFS软件学院的团队构建的。几年来,我们为Cevelop提供了我们的CDT版本,它支持C ++代码现代化的重构等。如果工作空间设置正确,Cevelop可以使用大型代码库。免费提供https://cevelop.com

答案 16 :(得分:1)

问题是C ++模板。截至2019年,我还不知道任何支持C ++模板的重构工具。我已经尝试了VS2019,VisualAssist,Clion,QtCreator。

考虑示例:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

如果我在foo::print上运行“重命名重构”,则bar::print也应自动重命名。因为它们是通过call_print函数模板实例化链接的。

答案 17 :(得分:0)

Definetely Resharper Ultimate是要走的路。保证幸福:)

截至2015年3月的测试版。

答案 18 :(得分:0)

我找到了Visual Studio 2013的以下插件: 微软Visual C++ Refactoring

它只是一个简单的重命名工具,但它完美无瑕。右键单击符号后,它会添加以下上下文菜单:

enter image description here