【问题标题】:Is there a working C++ refactoring tool? [closed]是否有可用的 C++ 重构工具? [关闭]
【发布时间】:2010-11-26 04:26:40
【问题描述】:

有人知道一个功能齐全的 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。

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

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

测试 3:更改提取函数的签名:导致 C++ 代码损坏:

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

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

在我看来,这个问题的答案仍然是“否”

【问题讨论】:

标签: c++ refactoring


【解决方案1】:

Visual Assist 和 Visual Studio 使处理大型代码库变得更加容易。视觉辅助擅长跟踪类或成员的使用情况,并且在重命名它而不出现误报方面比搜索和替换更有效。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不幸的是,C++ 重构不适用于大型代码库(如果有的话)。
    • Refactor for C++ 和大型代码库具体会发生什么?
    • @IraBaxter 它只是坏了。重构选项要么不显示要么不完成。有奇怪的错误消息或根本没有。
    • C++ 重构即使对于小型代码库也不能很好地工作,它已损坏且根本无法使用。
    • @Nils:你能提供一个具体的例子来说明它不明白的地方吗?
    【解决方案3】:

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

    Google already made a large-scale refactoring tool using clang.

    【讨论】:

    【解决方案4】:

    Mozilla 有自己的重构工具,名为 Pork (Wiki, Developer Wiki)。 Here 是 Pork 背后的开发者的博客。根据我的阅读,Pork 已成功用于 Mozilla 的重构。

    如果你来自 *nix 领域,猪肉应该会有所帮助,对于 Visual Studio,我也推荐 Visual Assist。

    【讨论】:

      【解决方案5】:

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

      它有一个完整的 C++ 解析器,具有名称和类型解析,构建代码 AST,可以应用程序或源到源转换(使用 C++ 表面语法)来修改这些树,并在保留 cmets 的情况下重新生成可编译输出。 (编辑: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 阶段多年计划的开始。

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

      编辑 1/4/2012:对 C++ 代码进行完整的控制流分析。

      编辑 2014 年 9 月 15 日:现在拥有 C++14 前端解析器/转换引擎。即使在这一点上重命名也相当可靠:-}

      【讨论】:

      • 您的下载页面上似乎没有评估此工具的链接semanticdesigns.com/Products/RegisterEval.html 目前是否有 VS2010 或 VS2008 的试用版和定价?
      • 对于重构工具,“不要急于求成”。我们的一期研发任务已经结束,我们正在申请二期的资金。要讨论 DMS 及其评估方法,请联系公司。它不是那种你“下载来评估”的东西,就像 Enterprise Oracle 不是下载项目一样。
      • ... DMS 能够转换 VS2008/VS2010,但不能作为交互式工具,并且在预处理器指令方面存在限制。 (好消息是我们认为我们解决了这些问题的一个主要问题,并将在第二阶段研发计划中应用它)。
      • 感谢您的反馈,但它看起来不像我想要的工具类型。我不需要交互式,只需要可以在大型代码库上执行相当简单的转换,而不需要花费一条胳膊和一条腿,例如更改调用所采用的参数数量,将指针参数更改为引用。 VisualAssist 已经很接近了,但还需要更进一步。
      • ... DMS 的目的是实现代码转换的编码和无错误应用,无论是“重构”还是“不重构”。是的,这很难,我们还没有。我们比我见过的任何其他 C++ 工具更接近 IMNSHO,而且我们的工具基础没有任何问题。剩下的就是预处理器、代码规模以及对 C++ 语义进行适当编码以允许此类转换的严重问题。我会第一个说这是一个大项目。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

        • 随着 C++ 2011 标准的发布,语言确实发生了显着变化。额外的复杂性使问题变得更难,而不是更容易,因为所有用户都想要所有高级语言功能,重构能力:-{
        • 最近阅读了 Slickedit 的功能,似乎它通过启发式方法确定了与名称使用相对应的定义。它不会进行“正确”的 C++ 名称查找。这意味着您不能相信它的转换是正确的。如果你不介意检查它的工作,这对你来说可能没问题。在非常大的软件包上,这可能并不好。我的意见。
        【解决方案8】:

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

        • 转到定义/声明
        • 查找所有参考资料,转到下一个/上一个
        • 重命名符号
        • 与 clang 的“修复”集成

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

        (我不得不说我只是在我的 QtCreator 未能正确重命名某些符号之后才走到这一步,这对我现在使用这个伟大的 IDE 来说是一个障碍)

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

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

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

        通常,基于 clang 的工具看起来非常很有前途。如果您有兴趣了解有关 C++ 重构的 clang 工具的更多信息,包括具有大型代码库的项目,请参阅 Chandler Carruth 的 some great 讲座。

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • DMS 已被用于自动重新架构大量 C++ 代码。参见 Akers, R., Baxter, I., Mehlich, M. , Ellis, B. , Luecke, K.,案例研究:通过自动程序转换、信息和软件技术重新设计 C++ 组件模型 49(3):275 -291 2007。可从出版商处获得
          • 不知道你所说的“优雅输出”是什么意思。您从 DMS 获得的输出显然取决于您提供的内容以及您应用的转换。如果转换不涉及部分代码,那么该部分代码是否与最初一样优雅或不优雅。如果它确实触及了代码,那么优雅取决于转换的巧妙程度,就像编码人员的手动更改一样。我不认为这是优雅,但结果的格式可以是“保真”打印(原始格式),也可以是定义的漂亮打印样式。
          【解决方案10】:

          问题在于 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 函数模板实例化链接的。

          【讨论】:

            【解决方案11】:

            肯定不得不提到Klocwork 作为商业代码重构套件。当您浏览演示视频时,它看起来确实很有希望。

            【讨论】:

              【解决方案12】:

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

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

              【讨论】:

              • 我不认为你可以在快速版中使用插件
              • 我过去确实尝试过使用 VS C++ express 安装 VA,但没有成功。
              • 您不能在隔离模式下安装 Visual Studio 插件(Express 版本都在隔离模式下运行 IDE)。如果您是学生,您可以DreamSpark 或 MSDNAA 下载完整版的 Visual Studio。
              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

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

                【讨论】:

                • 是的,我已经看到了,但这只是第一次尝试,仅涵盖“重命名”。没有提取功能等。但我期待更多的来......
                【解决方案15】:

                明确地Resharper Ultimate 是要走的路。幸福有保障:)

                2015 年 3 月的 Beta 版。

                【讨论】:

                【解决方案16】:

                CLion 看起来很有希望。

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

                【讨论】:

                  【解决方案17】:

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

                  【讨论】:

                    【解决方案18】:

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

                    【讨论】:

                    【解决方案19】:

                    我找到了以下适用于 Visual Studio 2013 的插件: Visual C++ Refactoring 来自微软。

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2010-09-06
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-04-13
                      相关资源
                      最近更新 更多