你在实践中使用了什么C ++重构?

时间:2010-11-18 11:14:46

标签: c++ refactoring automated-refactoring

我将创建现有自动化C ++重构工具的比较表,并探索创建此类工具(免费和开源)的能力。

我的问题是:你在日常工作中使用了哪些重构?有一些显而易见的事情,比如重命名变量/类/方法,但是有没有特定于C ++的东西,比如处理模板,STL,复制构造函数,初始化器等等?

我有兴趣构建C ++开发人员每天在编码中面临的所有小问题的真实画面,并且至少在理论上可以实现自动化。我和同事们谈话但这可能还不够。

提前致谢。

6 个答案:

答案 0 :(得分:2)

从答案可以清楚地看出,很少有C ++程序员见过真正的重构工具。是的,它们非常罕见,并且非常适合您使用的IDE。这是不可避免的,否则没有好的方法可以找出哪些源代码文件为最终的可执行文件贡献代码。预处理器使其更具挑战性,您需要知道宏值。需要源代码解析器,但还不够。

VS的Visual Assist是我所知道的。

答案 1 :(得分:1)

看看Joshua Kerievsky的Martin Fowler的Refactoring: Improving the Design of Existing CodeRefactoring to Patterns。这些反过来引用了GoF Design Patterns书,所以也可以这样做。

如果你能超越基本的重命名功能和提取功能,那么你可能会成为胜利者。

答案 2 :(得分:1)

这是我昨天提出的C ++设计模式: Ditch继承支持策略

答案 3 :(得分:1)

正如你所说,有明显的事情:

  • 重命名是一个
  • 更改函数签名是另一个(特别是因为函数几乎必须重复:标题中的声明和源中的实现)
  • 重命名/移动文件(包含指令的更新)

请注意,虽然这是基本的,但它很少得到妥善处理。我的主要抱怨是评论通常不会更新(我不是在谈论doxygen自动生成的无用杂乱)。因此,如果我在头文件中描述类的使用,或者在另一个源文件中使用此类的理由,那么注释现在已经过时了,因为通过重命名类,现在没有人会知道它所引用的内容......

然而,有更多有趣的案例:

  • 更改功能签名时,需要更新所有呼叫站点,开发人员需要帮助才能对其进行本地化
  • 使用继承,能够对层次结构的所有类进行操作:更改函数签名(再次)或添加/删除虚拟覆盖。
  • 使用模板:已删除概念提议,如果您可以合成对传递的类型(必要的方法/内部类型)的要求,那么当更改这些要求(通过修改模板定义)时,会收到通知此模板正在使用的类列表,并且不再符合它(并且应该更新)。请注意,如果它只是重​​命名类型/方法,您可能希望自动传播更改,只要它不会破坏任何其他内容。
祝你好运......

答案 4 :(得分:1)

我希望支持的一个重构实际上是 inject 方法。或多或少与 extract 方法相反。

因为我可能会看到我可以重新排列生成的代码以获得更好的清晰度或效果;但我不知道目前有这方面的工具支持。

答案 5 :(得分:0)

我使用http://www.devexpress.com/Products/Visual_Studio_Add-in/RefactorCPP/使用此工具我重命名变量/类/方法,更改函数体,初始值设定项