我从 C++ 切换到 Java 和 C#,并认为命名空间/包的使用在那里更好(结构良好)。然后我回到 C++ 并尝试以相同的方式使用命名空间,但在头文件中所需的语法很糟糕。
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
以下对我来说似乎也很奇怪(为了避免缩进):
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
{
有没有更短的方式来表达上述事情?我错过了类似的东西
namespace MyCompany::MyModule::MyModulePart::...
{
public class MyClass
更新
好的,有人说 Java/C# 和 C++ 中的用法概念不同。真的吗?我认为(动态)类加载不是命名空间的唯一目的(这是一个非常技术推理的观点)。为什么我不应该将它用于可读性和结构化,例如考虑“IntelliSense”。
目前,命名空间与您可以在那里找到的内容之间没有逻辑/粘合。Java 和 C# 在这方面做得更好……为什么要包含<iostream>
和拥有命名空间std
?好的,如果您说逻辑应该依赖标头来包含,为什么 #include 不使用“智能感知”友好语法,例如#include <std::io::stream>
or <std/io/stream>
?我认为默认库中缺少的结构化是 C++ 与 Java/C# 相比的一个弱点。
如果 Avid 冲突的唯一性是一个点(这也是 C# 和 Java 的一个点),一个好主意是使用项目名称或公司名称作为命名空间,你不这么认为吗?
一方面有人说 C++ 是最灵活的……但每个人都说“不要这样做”?在我看来,C++ 可以做很多事情,但与 C# 相比,在许多情况下,即使是最简单的事情,它的语法也很糟糕。
更新 2
大多数用户说创建比两个级别更深的嵌套是无稽之谈。好的,那么 Win8 开发中的 Windows::UI::Xaml 和 Windows::UI::Xaml::Controls::Primitives 命名空间呢?我认为微软对命名空间的使用是有道理的,而且它确实比 2 级更深。我认为更大的库/项目需要更深的嵌套(我讨厌像 ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace 这样的类名......那么你也可以将所有内容放入全局命名空间。)
更新 3 - 结论
大多数人说“不要这样做”,但是……即使是 boost 的嵌套也比一两层更深。是的,它是一个库,但是:如果您想要可重用的代码 - 将您自己的代码视为您将提供给其他人的库。我还使用更深的嵌套来使用命名空间进行发现。