如何减轻类声明远离文件中的所有者命名空间声明?
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 可以完美地提示您符号所在的位置声明、定义、引用等...
【讨论】:
以上是关于如何减轻类声明远离文件中的所有者命名空间声明?的主要内容,如果未能解决你的问题,请参考以下文章