【问题标题】:What are the "detail" and "impl" folders for?“detail”和“impl”文件夹有什么用?
【发布时间】:2014-11-05 17:45:22
【问题描述】:

在使用 STL 和 boost 时,我不断看到名为“detail”或“impl”的文件夹。 这些文件夹的用途是什么?你怎么知道这里有什么?

这些只是接口的私有实现吗?

【问题讨论】:

  • 这就是为您提供闪亮的公共界面所需的所有肮脏管道,是的。但是你自己找找,你猜和谁同意 intertubes 并不能真正帮助你学习任何东西。 (对于你来说,如果你想知道如何实现类似的东西,那就看看吧。)
  • 您应该只担心文档告诉您需要担心的头文件。
  • @remyabel:当然,但好奇(并询问)是可以的。有时,您确实必须担心它们(例如在(不常见的)错误情况下,您必须深入挖掘事物的核心)。
  • @Cornstalks 是的,但这似乎不是这个问题的本质。
  • @remyabel:也许我们的阅读方式不同,因为这就是我对这个问题的理解。

标签: c++ boost stl


【解决方案1】:

这些文件夹的用途是什么?

这些只是接口的私有实现吗?

基本上,是的。 Boost 和标准库的实现通常会在其中放置不属于它们公开的公共接口但需要公共接口的实现可以访问的东西。

你怎么知道这里有什么?

这是一个很难回答的问题,因为它意味着您可以从外部查看,得出关于这些目录中的内容应该位于何处的结论。您应该将这些目录视为“内部没有用户可维护的部件”的模拟。您可以查看并四处寻找,但您永远不知道会发现什么,它甚至可能在 Boost 版本或您的 C++ 环境之间发生变化。

强烈建议您在应用程序中直接使用这些目录中的头文件,这会导致代码不可移植,即使对 Boost 或您的 C++ 编译器进行微小升级也会导致代码中断。

话虽如此,您没有理由不能在这些目录中探索以了解其背后的工作原理!

【讨论】:

  • 这实际上是有道理的。谢谢你的直接回答。
【解决方案2】:

details 文件夹是一种抽象技术,用于将不在模块公共 API 中的成员移动到子命名空间和子文件夹中,以隐藏开发人员可能不关心的成员,并用于实现 Private 实现(pimpl) 设计模式;一种由增压头 Herb Sutter 发明的图案。 pimpl 模式使用共享对象模型来创建跨平台 pimpl,这些 pimpl 使用 .ipp 文件和前向声明在 boost 中实现(即 impl),这大大降低了编译器的速度。 Piml 主要用于处理依赖于系统时钟、计时器、锁、线程、图形、音频或自定义硬件等的硬件和操作系统相关设备。

details 文件夹和命名空间应该增加它们使您的 API 更清洁和更模块化的好处,但有更清洁、更简单、更优雅、符合 UML 的解决方案,并且 PIMPL 设计模式存在许多问题不是工程最佳实践。其中一些原因是:

  • 详细的文件夹和命名空间结构需要更多的体力劳动和时间来处理。
  • Piml 不兼容 UML,并且不能很好地用于测试驱动开发。
  • Pimpl 会大大降低编译器的速度。
  • details 文件夹和命名空间创建了一个带有耦合问题的杂乱依赖关系图。
  • 以上原因增加了软件开发的成本。
  • Pimpl 不是编写可移植的跨平台和跨语言代码所必需的。
  • 拥有干净的公共 API 只是 doxygen 设置、命名约定和文件组织问题。

如需详细说明为何不应使用详细信息文件夹,请联系Kabuki Toolkit Application Framework

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2012-10-14
    • 2022-06-20
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多