如何减轻类声明远离文件中的所有者命名空间声明?

Posted

技术标签:

【中文标题】如何减轻类声明远离文件中的所有者命名空间声明?【英文标题】:How to mitigate class declaration being far from its owner namespace declaration in a file? 【发布时间】:2009-12-01 18:05:38 【问题描述】:

所以,我已经看到命名空间在将声明组织到各自的组中是多么有用,但现在出现了一个问题。

在 C 中创建库和在 C++ 中创建库之间的区别在于,在 C 中,您必须在声明前加上它们所属的前缀,例如,我们将命名为 MyMath 的库可能有一个向量类,名字可能是MM_Vector。

在 C++ 中,您将拥有一个命名空间 MyMath,其中声明了一个 Vector 类。

现在这里的区别在于 C,只需转到类声明,您就会立即知道如何使用它。在 C++ 中,您必须检查特定类属于哪个命名空间(实际上只有在声明不在​​命名空间声明附近的文件中存在问题,如果在两者之间声明了常量和枚举,这可能很常见)。虽然我更喜欢使用命名空间来组织,但在我看来,这仍然是一个有效的论点,因为它很烦人。

人们做了什么来减少这种烦恼?

【问题讨论】:

【参考方案1】:

在his book 的第 8 章中,Stroustrup 推荐了如下样式:

MyMath.h

namespace MyMath 
  class Vector;
;

Vector.h

#include "MyMath.h"

class MyMath::Vector 
  public:
  Vector();
  // ...
;

Vector.cc

#include "Vector.h"

MyMath::Vector::Vector()  /* ... */ 

将开放的命名空间声明限制为对其内容的声明会产生简短的摘要。完全限定的定义允许编译器捕捉错别字。

正如您所关注的那样,这种风格的类声明和定义明确了每个类的父命名空间——牺牲了 Go 人所说的 stuttering。

【讨论】:

我发现这种风格最容易维护,因为在声明点和定义点都包含大量信息。我必须维护几个不同的软件,并且更喜欢那些采用这种风格的软件,因为它们要求我在脑海中保留更少的“状态”。【参考方案2】:

使用提供快速提示和符号导航的 IDE 和/或使用文档生成器(例如 Doxygen)。

【讨论】:

【参考方案3】:

“仅在声明不在​​命名空间声明附近的文件中存在问题,如果在两者之间声明了常量和枚举,这可能很常见)。”

如果这让您感到困扰,请执行以下操作:

namespace MyMath 
    constants and enumerations go here


namespace MyMath 
    class goes here


namespace MyMath 
    another class goes here

与类不同,您不必一起定义命名空间。括号并不意味着“这就是一切”,它们只是表示一个范围,其中所有定义都在该命名空间中,并且所有符号都在该命名空间中查找。

【讨论】:

【参考方案4】:

应该没有问题。只要确保任何标题中都没有using 语句,并且没有单一的源文件。如果这是一个大问题,请完全限定您的课程。

【讨论】:

【参考方案5】:

您描述的问题归结为您所处的心态。在开发代码时,您很清楚您正在使用MyMath::Vector,因此您希望看到尽可能少的混乱,并且添加using namespace MyMath;using MyMath::Vector; 子句。

几个月后,有人进入您的代码,知道Vector 来自哪个命名空间。他可能会争辩(就像你一样)这个using 声明使代码更难理解。

这就是优秀 IDE 的用武之地:您可以将命名空间(对于大型系统来说可能会变得非常大)留出,但是在调试/编辑代码时,IDE 可以完美地提示您符号所在的位置声明、定义、引用等...

【讨论】:

以上是关于如何减轻类声明远离文件中的所有者命名空间声明?的主要内容,如果未能解决你的问题,请参考以下文章

命名空间

命名空间

将在自动加载的命名空间类文件中声明的函数转换为全局函数

命名空间

关于命名空间namespace

包含命名空间的类模板的转发声明会导致编译错误