这两个类和命名空间?
这个问题是关于我看到自己使用的模式越来越多:既具有类和相关概念命名空间。 我认为这主要动机是C ++语言的文物,但不完全。
我想顶级的问题是:这是一个好主意? 既具有类和相关概念命名空间?
低级别的问题:
做这个的最好方式是什么?
嵌套在名称空间内类?:
namespace Foo_Namespace {
class Foo_Class {
...
};
}
或者单独,同行,类和命名空间?:
class Foo_Class {
...
};
namespace Foo_Namespace {
// non-class free functions, etc.
}
我必须承认,我对命名空间内嵌套类倾斜。 尽管它会导致难看的名字。 但是,即使我这样做,我应该用什么样的命名约定:
以下是太长,导致真丑名Foo_Namespace :: Foo_Class
namespace Foo_Namespace {
class Foo_Class {
...
};
}
这是没有必要使用任何后缀或指标的名称:
namespace Foo {
class Foo {
...
};
}
但后来我发现自己不确定的,当我看着富::酒吧(),如果这是一个免费的功能条中的命名空间::美孚,即::富::酒吧(),或在命名空间类Foo的成员函数::富::富::酒吧()。
而像::富::富::酒吧名字仍然不是,嗯,不错。
目前,我做
这是没有必要使用任何后缀或指标的名称:
namespace Foo_ns {
class Foo {
...
};
}
主要是因为我一般是先创建类,再后来认识到,一个命名空间将是很好。
我不知道我是否应该恢复我已经很多年没有使用的命名约定:_c类,_ns的命名空间:
namespace Foo_ns {
class Foo_c {
...
};
}
细节:
我不想重复我上面已经说过,但我会添加更多一点。
据我所知,除了一个类中使用一个命名空间的最实际的原因是,你被允许做的免费功能的前置声明命名空间中的,但你不能做向前的一类的一些方法声明。 一类,即你必须声明它全有或全无。 而与一般的免费功能,并在特定的命名空间免费功能,您可以零碎声明。 零部件可以在不同的头文件中声明。 而不是#包括一个巨大的头,只有库进行大规模的类,你可以使用前置声明只是一个或两个功能。 等等。
(参见,例如, http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Forward_Declarations ,虽然谷歌netly归结相对正向声明而非包括头部)。
另一个原因是,一个命名空间允许类本身保持较小。
一类最大的优点是一类可以传递给一个模板,而命名空间是不可能的。
我喜欢有嵌套在命名空间中的类,Foo_ns / Foo_ns :: Foo_c,而不是让他们成为同行Foo_ns / Foo_c,因为经常一类需要辅助类,如Foo_ns / Foo_ns :: Foo_c / Foo_ns :: Foo_Helper_c。 如果类和命名空间是对等的,这似乎很奇怪有Foo_ns / Foo_c但Foo_ns :: Foo_Helper_c。
我喜欢的命名空间,因为我与安德烈Alexandresciu同意: http://laser.inf.ethz.ch/2012/slides/Alexandrescu/1-C++%20course%20parts%201%20and%202.pdf
Class methods vs. free functions
• Conventional wisdom: methods are cool, free functions are so 1960s
• Yet:
◦ Free functions improve encapsulation over methods
◦ Free functions may be more general
◦ Free functions decouple better
◦ Free functions support conversions on their left-hand argument
Surprising fact #2
Making a function a method should be
your last, not first, choice
(c) 2012– Andrei Alexandrescu. 32 / 59
这比在类的方法来创建免费的功能。
但有时仅仅类必须使用 - 例如用于模板。
命名约定明智
我用Foo_ns / Foo_ns :: Foo_c过去
我使用Foo_ns / Foo_ns ::现在富
(顺便说一句,我倾向于使用Class_Names_With_Underscores_and_Initial_Caps,没有驼峰。)
如果这是有道理的,我可能会在的Elid命名空间中_ns后缀 - 例如,在空间和类(ES)不需要具有相同的名称。
我不喜欢让他们具有相同的名称。 考虑命名空间FOO内部类Foo构造函数:
::富::富::美孚()与:: Foo_ns ::富::美孚()
后者不是要好得多,但少了几分扑朔迷离。
我认为,我通常会创建其自己的阶级,没有命名空间嵌套它。 事实上,我可能添加了一些静态方法,之前我意识到嵌套在命名空间中的类会更好。 通过该阶段可以是重构一个疼痛,我有时最终创建转发功能,即从类静态方法前进到自由功能在命名空间,或反之亦然。 这使我后悔僵尸跳级wthin命名空间从第1步的权利。
结论
我现在的BKM是Foo_ns / Foo_ns ::美孚,即
namespace Foo_ns {
class Foo {
...
};
}
我会很感激任何建议,任何改进。
还是我打破了这样做呢?