Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套名称空间是一种过分的做法吗? 我正在编写一个C++程序,它有大量的类。在我的头脑中,我可以把它们想象成不同的集合。例如,有一个用于读取和存储配置数据的类集合,还有一个用于使用各种小部件绘制用户界面的集合_C++_Namespaces - Fatal编程技术网

嵌套名称空间是一种过分的做法吗? 我正在编写一个C++程序,它有大量的类。在我的头脑中,我可以把它们想象成不同的集合。例如,有一个用于读取和存储配置数据的类集合,还有一个用于使用各种小部件绘制用户界面的集合

嵌套名称空间是一种过分的做法吗? 我正在编写一个C++程序,它有大量的类。在我的头脑中,我可以把它们想象成不同的集合。例如,有一个用于读取和存储配置数据的类集合,还有一个用于使用各种小部件绘制用户界面的集合,c++,namespaces,C++,Namespaces,每个集合都可以整齐地存储在单独的名称空间中,这似乎是明智的。配置部分有一个“screen”类,GUI部分也有一个“screen”类,但它们彼此不同。我可以重命名一个“gui\u screen”和另一个“config\u screen”,但这就是名称空间的意义,不是吗?为了去掉这些前缀,我们发明了分隔事物的方法 然后,我的一部分人认为将这些名称空间存储在一个主名称空间中会比较整洁,这样我的代码就不会干扰其他任何名称空间。我想这也可能使代码更具可读性 或者我只是无缘无故地创建了过于复杂的数据层次结构

每个集合都可以整齐地存储在单独的名称空间中,这似乎是明智的。配置部分有一个“screen”类,GUI部分也有一个“screen”类,但它们彼此不同。我可以重命名一个“gui\u screen”和另一个“config\u screen”,但这就是名称空间的意义,不是吗?为了去掉这些前缀,我们发明了分隔事物的方法

然后,我的一部分人认为将这些名称空间存储在一个主名称空间中会比较整洁,这样我的代码就不会干扰其他任何名称空间。我想这也可能使代码更具可读性


或者我只是无缘无故地创建了过于复杂的数据层次结构?

定义名称空间你没有做任何层次结构,所以我看不出问题出在哪里,反正名称空间只是为了解决你的问题。

如果你的名称空间有“gui”和“config”等常用名称,将来,您的代码可能是一个库的一部分,该库将与不在您控制下的其他代码链接,将所有“您的”名称空间嵌套到一个单独的命名名称空间(除了嵌套的名称空间外,可能没有其他内容)中确实是一个好主意,该名称空间将它们标识为“您的”。这样做真的没有什么坏处,特别是如果,正如您所想,它可以以一种有助于可读性的方式来完成。(这与类继承的深层嵌套层次结构大不相同,因为每一层都添加了不同的功能,代码的读取器或维护者必须在多个文件之间跳跃,才能查看或更改添加的内容!)我个人喜欢根据文件/类的功能对它们进行分组。我通常从一个名称与我将使用的名称空间匹配的文件夹开始。最后,如果一个名称空间需要在另一个应用程序中重用,您可以轻松地将其取出并构建到它自己的dll中并共享它


它还提供了很好的intellisense功能,因此当我深入研究名称空间时,我可以只看到属于这组功能的类。

不,在我看来,你一点也不过分


并且抵制使用
声明或(天哪!)
指令的诱惑!习惯于总是键入所有名称空间只需花费很少的时间,一旦习惯了,代码就更容易阅读和理解。(《哪个
屏幕
类型又是这个,
gui
config
?》)

这不是过分的。嵌套名称空间是合理的,例如
piku::gui::screen


您也可以将它们折叠到
piku\u gui\u screen
,但是使用独立的嵌套名称空间,您可以获得这样的优势:如果您在
piku::gui
中,您可以轻松访问该名称空间中的所有名称(例如
screen
将自动解析为
piku::gui::screen
).

就我个人而言,我从未见过超过两个级别的名称空间嵌套有意义或有用。您描述的内容听起来不错,但我不会比project::component更深入,除非您有一个切实的、可证明的理由,即“没有它,这就中断了”。换句话说,
foo::bar::screen
是合理的,
foo::bar::ui::screen
是非常值得怀疑的,超过这一点几乎肯定会带来更大的复杂性。

在我看来,每个开发人员一个名称空间就足够了——你(大概)控制您在自己的代码中定义的所有类型名称,并且您不太可能希望在同一项目中对不同类型使用相同的类型名称

我认为名称空间的主要用途是处理两个独立开发人员碰巧选择相同类型名称的情况——没有名称空间,您将无法在同一项目中使用两个开发人员的代码。单个开发人员的代码库OTOH中的多个名称空间只会增加复杂性和键入开销,几乎没有或根本没有补偿好处


当然是所有的IMHO。

这并不重要,因为对于名称空间,在
piku::gui
中,您可以只说
screen
。你不能跳过普通的前缀。@sbi:是的,这正是我的观点。太好了。这就像.NET中的com.microsoft.foo一样,Java中也有类似的东西,不是吗。@piku:是的,就像那些Java包一样。这是一样的,尽管一个区别是Java包不是分层的,只是为了划分名称空间和文件系统。“com”包中没有一个类“com.micosoft.Foo”可以被称为“microsoft.Foo”(除非他们在我学习Java后对其进行了更改)。C++命名空间是层次化的,如果您在或使用命名空间PIKU,那么代码> GUI::屏幕< /Cord>查找代码> PIKU::GI::Suth。这种差异可能很少真正起作用,但事实就是如此。+1:在任何情况下,尽量避免使用
。。。它最终只会引起不必要的悲伤。