C++ 组织不良做法的子名称空间?

C++ 组织不良做法的子名称空间?,c++,namespaces,organization,C++,Namespaces,Organization,纯粹出于组织目的使用子名称空间会被认为是不好的做法吗?例如: namespace vehicles { namespace cars { // Stuff here } namespace boats { // More stuff here } } 我可以看出这在大型项目中会是一个问题,因为经常键入vehicles::cars::function会很不方便。不过,小项目呢?我认为这是一个不错的做法!还要考虑使用

纯粹出于组织目的使用子名称空间会被认为是不好的做法吗?例如:

namespace vehicles
{
    namespace cars
    {
        // Stuff here
    }

    namespace boats
    {
        // More stuff here
    }
}

我可以看出这在大型项目中会是一个问题,因为经常键入
vehicles::cars::function
会很不方便。不过,小项目呢?

我认为这是一个不错的做法!还要考虑使用别名来每次都要键入完全限定名,而不需要注入整个命名空间……< /p> < p>为什么< <代码>车辆不那么不方便?::汽车:函数< /代码>在一个小项目中有多大?

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

如果你发明了这样一个复杂的名称空间结构,我很想在每个文件的顶部放一些使用名称空间的
,那么它就违背了名称空间的目的

它也没有告诉我很多我不知道的事情。你打算在你的
名称空间中放些什么,光从名字我就不知道是船?我是否需要在名称空间中的任何内容上澄清“这属于船只”?很可能不是,那么拥有名称空间就没有意义了

一般来说,在你发现使用任何语言功能的好处之前,不要问它有什么问题。每个功能都需要证明自己。那么,您提议的名称空间将解决什么问题呢

如果它不能解决一个真实的问题,那么不管其他什么,它都是一个坏主意

我一直认为研究不同语言的标准库是很有启发性的

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

因此,没有人使用过名称空间。每个人只要在需要使用列表的每个文件的顶部放置一个
using System.Collections.Generic

正因为如此,当你遇到另一个
列表
类时,你就会遇到麻烦。您也需要这样做,瞧,有两个
List
类发生冲突

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


<> > C++中的等价类简单地是代码> STD::向量< /代码>。因此,人们通常会键入名称空间前缀,因此,当我向项目中添加另一个向量类时,*它可以工作。没有名称冲突,因为我在引用标准库向量时使用了
std::
前缀。

名称空间的一个原因是出于组织目的,创建它们的粒度取决于个人偏好-我个人将它们保留得相当通用,例如,我会使用TransferObject。车辆,但不去任何细颗粒比。除非你有很多种类型,否则我认为没有必要详细讨论那么多。但这取决于你


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

好吧,为了它的价值,几年前我曾在一个中型项目上尝试使用深度嵌套的名称空间,但那绝对是地狱——我花了全部时间用Java编写typedefs:),软件包工作得很好,因为您可以只导入每个.java文件顶部的内容,而不会出现重大问题。在C++中,这是一个痛苦的屁股,因为它是坏的做法,把指令/声明在头文件-结果,你要么(a)完全限定所有的头(BLUGHH)或(b)使用大量的字体(也BLUGURH)。不酷——我的建议是避免像瘟疫一样,除非你喜欢写这样的东西:

centipede::autoseg::hierarchygeneration::ragbuilders::RAGBuilder<...>
蜈蚣::autoseg::hierarchygeneration::ragbuilders::RAGBuilder
这不是一种类型,这是一句话……

取决于什么东西和更多的东西。请注意,在小程序中观察风格的唯一原因是在预期大程序时习惯它。风格、良好实践、设计模式等在小程序中很少重要,因为它们中的大多数都是为了易于维护和易于扩展。我认为“其他的”部分不重要。我认为名称空间中最有价值的东西是ADL,以及将独立函数包含到class@Armen:您也可以使用没有名称空间的。最终,名称空间是对代码进行细分。ADL是绕过代码的一种方式,将代码绑定在一起。@ Aman:但是我同意ADL是使名字空间在C++中工作的重要部分。如果没有,我们可能会在代码中使用<代码>…>代码>……在C++中随处可见,否定名称空间的优势。我知道一个公司没有得到“使用”,到处都写满了限定类型名称。你可以想象代码混乱。你为什么要用typedefs呢?我认为
使用
指令将是正确的工具。当然,您不会将它们放在头的顶部,但是您可以在本地、内部使用它们,而且它们不会污染任何东西。如果在函数中经常使用某些内容,请使用abcd::efgh::MyClass放置
位于函数顶部。另一种方法是本地
名称空间po=boost::program\u options
缩写名称空间。@Ela782:您可以在函数中使用using(尽管您必须在每个函数中重复它们),但如果这样做,您仍然必须完全限定成员变量的类型。您可以在不使用typedefs的情况下绕过这个问题,方法是将您的类包装在一个虚拟名称空间中,使用using指令将内容导入该名称空间,然后将您的类重新导入到封闭的名称空间中,但这有点不太妥当。名称空间缩写是可行的,但可以说会稍微妨碍可读性,并有助于解决您希望在第一个pla中不存在的问题