组织不良实践的子命名空间?

时间:2010-11-17 18:09:07

标签: c++ namespaces organization

将子命名空间用于纯粹的组织目的会被视为不良做法吗?例如:

namespace vehicles
{
    namespace cars
    {
        // Stuff here
    }

    namespace boats
    {
        // More stuff here
    }
}

我可以看到这对大型项目会有什么问题,因为很多时候输入vehicles::cars::function会很不方便。那么小项目呢?

4 个答案:

答案 0 :(得分:9)

为什么在一个小项目中输入vehicles::cars::function会不那么不方便?

记住命名空间应该用于什么目的。他们应该避免名字冲突,而不是其他。

如果您发明了这样一个复杂的命名空间结构,我很想在每个文件的顶部放置一些using namespace ...,那么它就会破坏命名空间的目的。

它也没有告诉我很多我不知道的事情。您要在boats命名空间中放置一些我不知道的名称只是一条船?在命名空间中的任何内容中,我是否需要澄清“这属于船只”?很可能没有,然后拥有命名空间是没有意义的。

一般情况下,在找到优点的内容之前,不要问使用任何语言功能的问题 。每个功能都需要证明自己的合理性。那么你提出的命名空间会解决什么问题呢?

如果它无法解决真正的实际问题,那么无论如何,这都是一个坏主意。

我一直认为查看不同语言的标准库是有益的。

.NET使用具有长名称的深层嵌套命名空间。简单动态数组的全名是System.Collections.Generic.List<T>

因此,没有人使用命名空间。每个人只需将using System.Collections.Generic放在需要使用List的每个文件的顶部。

正因为如此,您遇到另一个 List课程时遇到了麻烦。你也想对此做同样的事情,瞧,你有两个List类冲突。

C ++使用非常扁平的namespcae结构,其中名称空间也有非常短的名称。

C ++中的等价类只是std::vector。因此,人们通常会输入命名空间前缀,因此,当我向项目中添加另一个矢量类时,*它可以正常工作。没有名称冲突,因为当我想引用标准库向量时,我使用std::前缀。

答案 1 :(得分:5)

嗯,为了它的价值,我尝试在几年前在一个中等规模的项目中使用深度嵌套的命名空间,这绝对是地狱 - 我花了我整个时间写typedef :)在Java中,包工作非常好,因为您可以只导入每个.java文件的顶部,而不会出现重大问题。在C ++中,这是一个痛苦的屁股,因为在头文件中使用指令/声明是不好的做法 - 因此,你最终要么(a)完全限定标题中的所有内容(bleurgh)或(b)使用很多typedef(也是bleurgh)。不酷 - 我的建议是避免像瘟疫一样,除非你喜欢写下这样的东西:

centipede::autoseg::hierarchygeneration::ragbuilders::RAGBuilder<...>

这不是一种类型,而是一句话......

答案 2 :(得分:3)

恕我直言,这是不错的做法!还要考虑使用别名来解决每次都必须输入完全限定名称而不是在需要时注入整个命名空间...

答案 3 :(得分:2)

命名空间的一个原因是出于组织目的,你制作它们的细微程度取决于个人偏好 - 我个人保持相当通用,例如我有TransferObjects。车辆,但不是那么精细。除非你有很多类型,否则我没有看到进入那么多细节的重点。但这取决于你。

如果这是一个小项目,那么代码库是否应该相对较小且易于导航,从而无需采用这种方法?