【问题标题】:Any good C++ refactoring tools that could handle this scenario任何可以处理这种情况的优秀 C++ 重构工具
【发布时间】:2011-06-10 11:11:03
【问题描述】:

我有一个大型 C++ 代码库,其中包含几个我打算重写的用于错误记录的函数,定义如下;

void LogError(ErrorLevel elvl,LPCTSTR Format,...);  // Literal version
void LogError(ErrorLevel elvl,UINT ResourceID,...); // Resource version

我打算将这些重写为一个函数

void LogError(ErrNo No,...);

在这种情况下,ErrNo 将是一个枚举,用于从外部文件中查找其余的错误详细信息。虽然我正在使用并喜欢 Visual Assist,但它似乎不适合这种事情。我认为执行此重构的最简单方法是编写一个小程序,该程序使用搜索输出的结果来查找此函数的所有出现,例如

    c:\cpp\common\Atlas\Comps\LSADJUST.cpp
        LSAFormNormalEquations (174):    LogError(elvl_Error,IDS_WINWRN0058,i+1,TravObs.setup_no,TravObs.round_no
        LSAFormNormalEquations (180):    LogError(elvl_Error,IDS_WINWRN0059,i+1,TravObs.setup_no,TravObs.round_no
        LSAFormNormalEquations (186):    LogError(elvl_Error,IDS_WINWRN0060,i+1,TravObs.setup_no,TravObs.round_no
    c:\cpp\common\Atlas\Comps\LSADJUSTZ.CPP
        LSAFormNormalEquationsZ (45):    LogError(elvl_Note,_T("Adjusting heights by least squares"));
    c:\cpp\Win32\Atlas\Section\OptmizeSectionVolumes.cpp
        OnSectionOptimizeVolumes (239):    LogError(elvl_Note,"Shifted section at chainage %0.1lf by %0.3lf",Graph.c1,Offset);

然后解析和修改源。是否有任何其他工具可以为我简化这项任务?如果查看related question,则表明那里没有太多东西。我不介意花一点钱买一个相当容易使用的工具,但没有时间或预算做更多的事情。

【问题讨论】:

  • 一次搜索有多少次点击?在这种情况下,我经常发现全局搜索加上 VS 宏已经很有帮助了。
  • @sbi - 1217 次点击。足以保证编写一些代码而不是手动执行。特别是考虑到我手动完成此类工作的注意力很短;)
  • 如果你有一个列出所有这些的输出窗口,你可以使用快捷方式从一个到另一个(F4 for me),并使用另一个(Ctrl+Shift+P for我,您也许可以将F4 合并到宏中)。这很简单,我想。我想我做了比这个更糟糕的替换。
  • 我已经用 Codewright 的正则表达式搜索和替换做了类似的事情。不过要定期备份,因为一个错字很容易破坏整个代码集:-)
  • @Tony:如果没有 VCS 的备份,我不敢做这样的事情。

标签: c++ refactoring


【解决方案1】:

如果您使用的是 Unix,使用sed 编辑您的所有源代码可能会处理大部分更改。您必须手动完成一些更改。我过去曾使用过这种技术。

【讨论】:

  • 您可以在 Windows 上使用 cygwin 或 MSYS。
  • @sbi 是的,但纯粹的 Windows 程序员可能不知道如何使用它们。安装 cygwin 并学习如何使用多个 Unix 程序来执行一次重构有点过分。
  • 确实如此。但是,您通常可以询问同事。这就是我一直做的。 :)
  • 或powershell,它是免费的,在Windows7中是默认的。
【解决方案2】:

四处寻找能满足我需求的轻量级的东西让我一片空白,而学习 SED 虽然有价值,但对于一些并不能完全解决我的问题的东西来说,这是相当大的工作量。我最终编写了自己的工具来执行代码库的单独副本所需的重构,直到我很高兴它完全符合我的需要。这涉及从 Visual Assists 查找所有引用选项中获取输出,并使用它来重构代码库。我会发布代码,但就目前而言,它非常糟糕,并且在不同的代码库下可能会失败。一般问题可以更好地表述为这样的

  • 对于 C++ 代码库,查找函数 fn 的每一次出现,其参数为 a,b,...n
  • 从源文件中删除 fn 的出现
  • 将参数提取为文本变量
  • 添加更多变量,例如实例编号、源文件名等...
  • 在删除 fn 的地方,编写一个可以包含可用变量的格式化字符串
  • 将类似格式的字符串附加到一个或多个外部文件(例如资源文件等...)

我猜上述功能对于已经解析源代码的人来说很容易实现,并且会将指向该问题的链接传递给 Whole Tomato 作为增强建议。

编辑:对于任何感兴趣的人,VA forum here 有一些跟进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-06
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多