你实际应用中使用哪些C++重构技术?

5
我将创建现有自动化C++重构工具的比较表,并探索创建这样的免费开源工具的能力。
我的问题是:你在日常工作中真正使用了哪些重构?像重命名变量/类/方法之类的明显内容是很常见的,但对于C++是否有特定的内容,例如处理模板、STL、拷贝构造函数、初始化程序等?
我对建立C++开发人员每天面临的所有小问题的现实图像感兴趣,这些问题至少在理论上可以自动化。我正在与我的同事交流,但那可能还不够。
谢谢您的帮助。

3
祝你好运,创造一个合格的C++解析器来使这样的工具发挥作用。 - Jim Brissom
当我在开发C++时,我并没有使用IDE中的太多重构支持。实际上,我并没有找到真正有用的重构工具。我的建议是学习设计模式,阅读Meyer的Effective C++,然后再看101编码标准。从一开始就学会正确地编写代码。 - Daniel Lidström
@Daniel:重构是开发人员的主要工具,无论是什么程序。遵循KISS原则,你不会仅仅为了使用模式而深入其中,而是只在需要的时候逐个使用它们...因为你不是神谕。 - Matthieu M.
@Jim:CLang提供了一个完整的C++解析器库,其主要目标之一是提供易于重写或源到源的转换。 - Matthieu M.
C++解析器很难,而预处理器加剧了这种混乱。C++名称解析更难。C++流分析可能同样困难。在重构后仍然必须能够重新生成C++源文本。你会发现所有这些都相当困难。 - Ira Baxter
6个回答

2

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

我知道的一个是Visual Assist for VS。


1

1
这是我昨天想出来的一个 C++ 设计模式:抛弃继承,采用策略

1
我第一次读到这句话时,想到的是放弃继承,转而使用政治手段 - graham.reeds
是不是Alexandrescu比你更早想到这个,还是你才意识到政策有多好? - Matthieu M.

1

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

  • 重命名是其中之一
  • 修改函数签名是另一个(特别是由于函数几乎必须复制:在头文件中声明,在源文件中实现)
  • 重命名/移动文件(更新包含指令)

请注意,尽管这是基本操作,但很少处理得好。我最主要的抱怨是,注释通常不会更新(我不是在说doxygen自动生成的无用垃圾)。因此,如果我描述了头文件中类的使用方式或在另一个源文件中使用此类的理由,则注释现在已过时,因为通过重命名类,没有人会知道它是什么...

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

  • 当更改函数签名时,需要更新所有调用点,开发者需要帮助进行本地化。
  • 通过继承,能够对层次结构中的所有类进行操作:更改函数签名(再次)或添加/删除虚拟覆盖。
  • 使用模板:概念提案已被放弃,如果您能综合传递的类型要求(必需的方法/内部类型),那么当修改这些要求(通过修改模板定义)时,会通知正在使用此模板且不再符合其要求(需要进行更新)的类列表。请注意,在仅重命名类型/方法的情况下,您可能希望自动传播更改,只要它不会破坏其他内容。

祝好运...


仅仅重命名就很难。想象一下将I重命名为J...在I的声明和使用之间的作用域中有一个J("遮蔽")。这包括具有多重继承的干预作用域;J甚至可能不会在实际的干预作用域声明中显式出现。享受吧。 - Ira Baxter

1

我希望得到支持的一种重构方法是注入方法。这是提取方法的相反操作。

因为也许我会发现可以重新排列代码以获得更好的清晰度或效果;但我目前不知道是否有工具支持这种操作。


0

这些都是非常基础的东西... - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接