“detail”和“impl”文件夹是用来做什么的?

4
当我在处理STL和boost时,经常看到名为“detail”或“impl”的文件夹。这些文件夹有什么用?你如何知道哪些内容应该放在此处?
这些文件夹只是接口的私有实现吗?

1
这就是需要完成的繁琐工作,以便为您提供闪亮的公共接口。但是,请自行查看,仅凭猜测和网上某人的认可并不能真正帮助您学习任何东西。(当然,只有在想要了解如何实现类似功能时才观看。) - Deduplicator
你只需要关注文档指示你关注的头文件即可。 - user3920237
2
@remyabel:当然,好奇是可以的(并且提问也没问题)。有时候,你确实需要担心它们(比如在出现错误的(不经常发生的)情况下,你必须深入挖掘事物的内部)。 - Cornstalks
1
@remyabel:也许我们只是理解方式不同,因为我是这样理解这个问题的。 - Cornstalks
你知道怎样可以在仪表板下面点火启动汽车吗?那么,这有点像细节处理。对你来说不需要这样做。使用点火开关启动汽车,除非你是机械师或汽车贼,否则不要碰那些电线。 :) - Chris Uzdavinis
显示剩余2条评论
2个回答

7
这些文件夹的目的是什么?
基本上,是的。这是Boost和标准库实现通常放置那些不属于他们公开接口的东西,但需要被公共接口的实现访问的地方。
你如何知道哪些东西应该在这里?
这是一个有点难回答的问题,因为它意味着你可以从外部来判断这些目录中的东西应该放在哪里。你应该将这些目录看作“内部没有用户可维修的零件”的类比。你可以看看里面并探索一下,但你永远不知道你可能会发现什么,甚至在Boost或你的C++环境的版本之间也可能会发生变化。
直接在应用程序中使用这些目录中的头文件是不鼓励的,并且会导致不可移植的代码,即使是对Boost或C++编译器进行轻微的升级也可能会导致代码崩溃。
话虽如此,你也可以探索这些目录的内部,以了解其工作原理!

这其实很有道理。感谢您直截了当的回答。 - Todd

1

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

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

  • 详细的文件夹和命名空间结构需要更多的手动操作和时间来处理。
  • Piml不符合UML标准,并且在测试驱动开发方面表现不佳。
  • Pimpl显著地降低了编译器的速度。
  • 详细的文件夹和命名空间创建了一个杂乱无章的依赖关系图,存在耦合问题。
  • 上述原因增加了软件开发的成本。
  • 为了编写可移植的跨平台和跨语言代码,Pimpl并不是必需的。
  • 拥有一个干净的公共API只需要doxygen设置、命名约定和文件组织问题。

关于为什么不应该使用详细文件夹的详细解释,请参见Kabuki Toolkit Application Framework


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接