3

我的工作室有一个庞大的代码库,已经开发了 10 多年。我们开始使用的编码标准是由内部少数开发人员开发的,而且早在我们不得不担心任何与 C++ 相关的标准之前。

最近,我们在内部启动了一个小型研发项目,我们更新了编码约定以更适合我们的环境。研发工作将被整合到现有的项目代码中。我们面临的一个主要问题是,我们现在有两个工作领域的两个标准,现在代码库将交叉。我不希望工作室有两个标准,实际上我很高兴能推进一个单一的标准。(我们如何进入这种情况并不重要——只是我们是,我希望我们不会是。)

问题在于重构现有代码。我不太希望有两个看起来不同的代码库(一个相对较小,一个非常大)。我有兴趣对现有代码库之一进行一些重构,以使其符合其他标准。问题是,代码库越小(IMO),标准就越受欢迎。

我开始四处寻找可以为我进行大规模重构的工具。我对重新排列和收紧代码不感兴趣。我有兴趣改变一些事情,比如

class my_class {}
....
class my_class A;

class MyClass {}
....
class MyClass A;

基本上是在做函数/变量级别的重命名。我不想使用 Visual Assist 之类的东西,因为这需要很长时间。我有超过 10000 个源/头文件和数十万行代码。一次使用 VA 一个课程将是一个时间杀手,不值得付出努力。

我确实在 SO 的另一篇文章中遇到了Vera。这似乎可以完成这项工作并且做得很好。我想知道是否有人对我所处的情况有使用 Vera 的特定经验,或者对可能完成工作的工具有任何其他建议。我认为这个工具真正理解代码结构很重要,这样我们就不会只是以搜索/替换的方式重命名变量,因为如果不小心这样做会导致微妙的错误。

编辑:虽然我的示例显示我将从在名称之间使用 _ 到驼峰式类型表示法,但换一种方式可能对我们更有利。我真的在寻找一种有助于大规模重命名的通用解决方案。

谢谢。

4

6 回答 6

9

我的过程是每次有人触摸给定模块时重命名。最终,所有模块都将被重构,但增量方法将导致更少的代码损坏(假设您有一套完整的测试。;))

于 2008-10-15T23:26:35.380 回答
2

我已经使用自定义脚本进行了这样的更改。如果可以,我会使用 sed。否则,我将使用对正则表达式有良好支持的脚本语言。这是一个粗略的 hack,肯定会引入错误,但除非你找到更好的解决方案,否则它是一条前进的道路。

于 2008-10-15T23:26:49.890 回答
2

除非您有 (1) 一套相当完整的可靠和自动化测试,以及 (2) 一个理解 C++ 语义的重构工具(我还没有听说过这样的工具),否则我建议不要进行自动重命名。在我工作的任何地方,实践总是只重构你目前正在处理的模块。这是一个漫长但相对轻松的过程。

于 2008-10-16T08:28:52.573 回答
0

我认为重命名变量会很棘手-幸运的是,您将从 _ 约定变为大写,所以它不会那么难(尽管 _ 更容易阅读并且更好)

我会采用代码美化器(例如Artistic StyleUncrustify)并修改它们以进行转换。您只需要一些自定义规则即可进行此转换,因此不会太难。

于 2008-10-15T22:54:51.653 回答
0

恕我直言,变量重命名根本不值得努力。重要的是代码是健壮的、可读的和高性能的。只需采用以前使用的任何样式,然后将时间花在重要的事情上。

于 2008-10-16T01:29:04.853 回答
0

您可能需要考虑研究由 Mozilla 人员使用、创建和维护的“猪肉”,以进行很大程度上自动化的 C++ 源代码分析,包括重构等源代码转换。它可以使用 JavaScript 编写脚本,并支持非常复杂的语义分析和转换。所以重命名符号是猪肉更容易做的事情之一。

现在GCC 插件正在开发中,未来这些事情可能会变得更容易。

于 2009-05-18T04:27:03.860 回答