有没有人知道一个功能齐全的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
我用VC2010试用了一个20MB的代码库.
测试1:提取方法:导致Resharper异常.没有源代码更改.
测试2:使用不同来源的提取方法:正常工作
测试3:更改提取函数的签名:破解C++代码的结果:
bool myclass::do_work123(int& Filled*&, long, int&)
也许这就是为什么C++没有列在主页上.
我认为这个问题的答案仍然是"不".
Visual Assist和Visual Studio使得处理大型代码库变得更加容易.视觉辅助能够很好地追踪类或成员的使用方式,并且在重新命名时更有效,而不会出现误报而不是搜索和替换.
我发现使用Visual Studio的Visual Assist X非常有用.另一个选择是Refactor for C++.
我希望clang将在未来几年内显着改变C++重构工具的格局.它是一个开源的模块化编译器,它公开了一个用于解析和语义分析C++代码的API.IDE和其他工具将能够使用此API而不是编写自己的解析器和语义分析器的困难工作.
谷歌已经使用clang制作了一个大规模的重构工具.
Mozilla有自己的重构工具Pork(Wiki,Developer Wiki).这是Pork背后的开发者博客.据我所知,Pork成功用于Mozilla的重构.
如果你来自*nix土地,猪肉应该会有所帮助,因为Visual Studio我也推荐使用Visual Assist.
我们的DMS软件再造工具包是一个转换引擎,旨在对大量代码(包括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(在"Texas"下查找语义设计).不要指望结果匆忙; 这只是获得工具的3阶段多年计划的开始.
编辑8/11/2011:第一个进展......我们现在处理所有C++ 0x和OpenMP指令.
编辑1/4/2012:对C++代码进行完全控制流分析.
编辑2014年9月15日:现在已经掌握了C++ 14前端解析器/转换引擎.在这一点上甚至可以非常可靠地重命名: - }
如果您使用的是emacs,请尝试使用Xrefactory.它支持方法提取,类/函数/变量的重命名以及插入/删除/移动参数.它还具有非常好/快速的代码完成引擎.
目前我不推荐任何用于C++的重构工具,当然不适用于100k及以上的大型代码库.我一直希望这会像OP那样改变,我希望有一天能有所作为.我担心在我们看到任何非常好的工具之前,语言本身可能必须发生重大变化.
顺便说一下,SlickEdit是否放弃了它的重构功能?