创建许多只包含许多文件的头文件(就像集线器文件一样)

时间:2017-02-28 12:48:20

标签: c++ include header-files

It is a bad idea to stuff a lot of #include into 1 file.

我的情况有点不同 - 我要创建多于一个的中心文件只包含一些 #include: -

PhysicCommonHub.h: -

#include "PhysicCompound.h"    //~ 100 lines
#include "PhysicConstraint.h"  //~ 100 lines
#include "PhysicDummy.h"       //~ 100 lines
#include "PhysicUtil.h"        //~ 100 lines
//In real case, I include around 5 files.

GraphicCommonHub.h: -

#include "GraphicMesh.h"           //~ 100 lines
#include "GraphicLightSource.h"    //~ 100 lines
#include "GraphicUtil.h"           //~ 100 lines

我的情况(和激励)是: -

  • 每当我想要包含一个文件时,大约有30%我还希望在同一个 hub 中有另一个文件。
  • 例如,如果包含PhysicCompound.h,则有30%的更改,我还必须包含PhysicConstraint.h,而PhysicDummy.h则需要包含30%等等。

因此,如果我要加入PhysicCompound.h,我只会加入PhysicCommonHub.h

优势: -

  • 代码更清晰(缩短)
  • 方便,生产力提高(稍微多一点)

缺点: -

  • 可维护性降低(有点?)
  • 编译时间增加了一点

问题

  1. 值得吗?是糟糕的主意还是糟糕的做法?是否只是依赖"? 在实际业务中是否有阈值(百分比)? 更具体地说,创建一些集线器文件是否可能是一个好的决定?

  2. 如何仅使用前向声明的集线器技术? 更具体地说,有任何情况下这是一个好的决定吗?

  3. PhysicForwardHub.h: -

    class PhysicCompound;
    class PhysicConstraint;
    class PhysicDummy;
    class PhysicUtil;
    

    从投票结束开始,我将假设它依赖于#34;即答案是"是"对于这两个问题。 (?)

1 个答案:

答案 0 :(得分:1)

我不会将您的方法描述为"不良做法"。我将其形容为可怕的做法。

实际上,您的每个"集线器标头"将与您链接的问题中描述的效果相同。

将这些标题拆分(所以有多个"集线器标题",就像你描述的那样)可能会减轻与包含许多其他标题的单个标题相关的一些影响。但是,这不是您的方法的建议。这是一个单一的全球标题有多糟糕的迹象 - 你的方法简直不那么糟糕,而不是提供一些好的"替代方案。

虽然您已将对可维护性或编译的影响描述为"有点" (即暗示它们并不重要),现实情况是影响非常显着。这些影响在小型项目中可能并不明显,但在大型项目中它们很糟糕。影响包括构建时间增加了几个数量级,并且显着降低了生产力(包括开发人员在等待新代码编译时略显大拇指,因此他们可以对其进行测试)。

仅将此技术用于前向声明不会获得太多收益。总会有代码需要完整的类型定义,而不仅仅是前向声明。并使用您的"集线器标头"实际上,对于前瞻性声明来说,仅仅是楔形的一个薄边 - 毕竟,这是一个小小的步骤说"好吧,我已经为前向声明做了....现在为带有类定义的标题...."。

实际上,尽管需要考虑确定每个编译单元中需要哪些标头,但这种努力通常只是实际实现新代码所花费时间的一小部分。所以你所描述的是虚假经济 - 减少对代码的思考,以一种影响整个项目的各种生产力指标的方式。