【问题标题】:Distribution of many small classes多小班分布
【发布时间】:2011-01-04 23:49:27
【问题描述】:

我有一个名为EventArgs 的基类。从中派生出许多表示特定类型事件的事件参数的专业化。这些事件的使用者可能需要一些、许多或很少的这些参数类。

我的问题是,您是否会为 each 类型提供一个头文件(例如,50 多个不同的头文件),您是否会尝试将它们分组并有一个“共同' 的头文件,还是你会小心翼翼地把它们扔到一个可以包含在内的易于使用的头文件中?

另一种方法可能是拥有 50 个头文件,然后我可以引入一些包含特定头文件的“家族”头文件。不确定这些东西的命名约定,所以很明显在哪里。

我知道可能没有硬性规定,但想知道其他开发人员在发现自己编写了许多小类时都做了什么。

提前致谢。

【问题讨论】:

    标签: c++ include header-files project-layout


    【解决方案1】:

    在以下一种情况下,我必须将两个类放入单独的标题中:

    • 它们很大
    • 它们不相关或不太可能一起使用
    • 它们每个都引入了自己的头文件依赖项

    否则,将它们分开没有多大意义。我知道有些人有这个“每个标题一个类”规则,但在你的情况下它看起来不合理。

    什么是“家庭”,包括大量小文件,在某些构建系统(和文件系统)中,这可能会影响编译时间,无论如何我认为这样做没有意义 - 通常人们会使用文档或 IDE 来查找类,而不是查看头文件名。所以你这样做只是为了简化包含,但为什么不把它们放在同一个标​​题中。

    【讨论】:

    • 好点。许多这些“小”类具有完全不同的依赖关系。苹果和橙子。从理论上讲,“将他们分组”听起来不错,但正如我评论 krakover 的解决方案一样,有很多人没有家人,只有他们自己。线在哪里画的?
    • @Moo-Juice:如果依赖关系完全不同,我可能会将它们分开。同样,这取决于,因为如果依赖关系不同但“依赖深度”非常小(例如,一个依赖于 Apple,另一个依赖于 Orange,但两者都只是没有其他依赖关系的结构),将它们分组可能会更好
    • 这几乎就是我现在使用的策略。我正在研究一个芯片供应商提供的 USB 堆栈(不是 _HCI 堆栈之一),它看起来像是由暑期学生编写的。它为每个描述符类型和每个请求类型都有一个单独的文件。大多数文件是 50 行软件许可证和 2-6 行 #define 常量。所以我将所有请求收集到一个 .h 文件中,并将所有描述符收集到一个 .h/.cc 对中(我正在将堆栈转换为 C++)。现在更容易阅读,打开的窗口更少,一个目录被三个文件替换。
    • @Mike: 不相关但...我当然希望您在升级到 C++ 时将 #define 转换为实常数 :)
    【解决方案2】:

    我会根据用户可能希望一起使用的类别将它们分组。无论如何,50 多个微小的头文件似乎太多了。

    【讨论】:

    • 这也是我的第一个想法。然后我意识到有“流氓”类,没有家庭的衍生品,而且几乎是独立的。我的想法是,如果你沿着家庭路线走,应该很明显哪些包含文件有什么......除了流浪的。虽然 50 多个头文件看起来太多了,但至少你有一个共同的规则“包含你想要使用的那些”。这是我目前的困境:)
    • 我不明白为什么您不能在需要时拥有一个“家庭”。它仍然将 50 个文件减少到更少。
    【解决方案3】:

    难道不是所有的变体都是模板吗?

    【讨论】:

    • 好吧,每个派生词都有完全不同的成员和访问者。除了共同的基类之外,它们彼此没有任何共同之处。基类在那里,因此可以将它们传递给函子。
    【解决方案4】:

    我在开发 GUI 库时遇到过类似的情况。最初所有组件(它们是小类)都共享相同的头文件和源文件。这工作得很好。后来我尝试将它们放在单独的文件中,但它确实没有任何改进。它只会增加花费大量时间搜索这些文件的负担。

    除此之外,也许您可​​以从 Poco C++ 库中获得一些灵感。这个库通常遵循每个标题一个类的习惯用法,但也有例外。例如,使用基于宏的系统将整个异常层次结构编码在一个头文件和源文件上(参见Exception.hException.cpp)。

    【讨论】:

      【解决方案5】:

      如果它们属于相同的继承层次结构,请将它们放在相同的 .h 文件中。它可以帮助您确定课程的正确顺序。 c++ 中鲜为人知的编译时检查之一依赖于 .h 文件中类的正确顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多