C++ C++;目录重组

C++ C++;目录重组,c++,refactoring,C++,Refactoring,我有大约10个目录中大约500个文件的源代码。我需要重构目录结构-这包括更改目录层次结构或重命名一些目录 我正在使用svn版本控制。重构有两种方法:一种是保留svn历史(使用svn move命令),另一种是不保留。我认为使用EclipseCDT和svn插件(VisualStudio根本不适合目录重构)重构保存svn历史要容易得多 但是现在由于代码没有发布,我们可以选择不保存历史 尽管如此,仍然需要更改头文件的include指令,无论它们包含在何处。我正在考虑使用python编写一个小脚本——接收

我有大约10个目录中大约500个文件的源代码。我需要重构目录结构-这包括更改目录层次结构或重命名一些目录

我正在使用svn版本控制。重构有两种方法:一种是保留svn历史(使用svn move命令),另一种是不保留。我认为使用EclipseCDT和svn插件(VisualStudio根本不适合目录重构)重构保存svn历史要容易得多

但是现在由于代码没有发布,我们可以选择不保存历史


尽管如此,仍然需要更改头文件的include指令,无论它们包含在何处。我正在考虑使用python编写一个小脚本——接收从当前文件名到新文件名的映射,并根据需要进行重命名(使用类似于sed的东西)。有人做过这种目录重构吗?你知道好的相关工具吗?

如果你必须重写
#include
s才能做到这一点,那你就错了。将所有的
#include
更改为使用非常简单的目录结构,不分两个级别,只使用第二个级别来组织架构或操作系统依赖项(如
sys/types.h


然后将make文件更改为使用
-I
包含路径

瞧。你再也不必为此破解代码了,如果出现问题,编译器会立即崩溃

就历史而言,我个人觉得做这类事情更容易有一个干净的开始;归档旧的,创建一个新的存储库v2,从那里开始。相反的论点是,当存在大量的变更历史,或者存在大量针对现有代码的未决问题时


哦,你确实有很好的测试,而且你没有在即将发布的时候这样做,对吗?

我会保留历史记录,即使它需要一点额外的时间。能够通读提交日志并理解为什么函数X是以一种奇怪的方式编写的,或者这真的是一个逐个错误,因为它是由Oliver编写的,他总是出错

可以为以下用户提出反对保留历史记录的论点:

  • 您的代码可能会有令人尴尬的事情,比如亵渎和开发人员之间的争斗
  • 您不关心代码的提交历史,因为它不会在将来更改或维护

去年我在我们的代码库上做了一些类似的目录重构。如果您的代码在开始时结构合理,那么您可以使用您选择的语言编写的脚本(我使用Perl)完成大约75-90%的工作。在我的例子中,我们从一个大目录中的一组文件移动到一系列依赖于名称空间的嵌套目录。因此,声明类protocols::serialization::SerializerBase的文件位于src/protocols/serialization/SerializerBase中。从旧名称到新名称的映射是微不足道的,因此在树中的每个源文件中查找并替换#includes是微不足道的,尽管这是一个很大的变化。有一些奇怪的边缘情况,我们必须手工修复,但这似乎比任何事情都要手工完成或者编写我们自己的C++解析器要好得多。

< p>黑客shell脚本来执行Svn移动是微不足道的。在tcsh中,它是foreach F($FILES)。。。结束以调整一组文件。Perl和Python提供了更好的实用程序

这确实值得挽救历史。尤其是在试图追踪一些外来的虫子时。那些不从历史中吸取教训的人注定要重蹈覆辙,或者重蹈覆辙

至于更改所有文件。。。就在前几天,有一个类似的问题出现在:


同意-结构属于内部版本信息而不是代码。Mac编译器都允许您指定一个目录树,这样您就不必到处塞满那么多显式路径。当我开始使用VisualStudio时,我感到震惊!“然后将make文件更改为使用-I include路径”-include不应该太深,但我不想使-I路径复杂化。每个目录的顶层都应该有包装器,为目录提供“外观”。这就是Boost的工作方式;使用它只需要包含一个目录,我不认为使用哪种方式太重要,但包装文件意味着您必须阅读代码才能理解构建的工作原理;我希望能够找到Makefile中的所有内容。将太多目录添加到include路径也会带来麻烦。如果包含“file.h”,则在添加依赖项(或移植到新操作系统)时,比包含“dir/file.h”时,更容易发生文件名冲突,其中“dir”是描述项目的唯一名称。希望您的代码库使用基于源代码树根的路径,如“include”maybe/some/stuff.h而不是像#include“../../../stuff.h”这样的相对路径。