我从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不使用“ IntelliSense”友好语法,例如#include <std::io::stream>
or <std/io/stream>
?我认为默认库中缺少的结构化是C ++与Java / C#相比的弱点之一。
如果对激烈冲突的唯一性是一个要点(这也是C#和Java的要点),那么一个好主意是使用项目名称或公司名称作为名称空间,您不这样认为吗?
一方面,有人说C ++是最灵活的……但是每个人都说“不要这样做”吗?在我看来,C ++可以做很多事情,但是与C#相比,即使在许多情况下最简单的事情,语法也很糟糕。
更新2
大多数用户说创建比两个级别更深的嵌套是胡说八道。好的,那么Win8开发中的Windows :: UI :: Xaml和Windows :: UI :: Xaml :: Controls :: Primitives命名空间呢?我认为Microsoft对名称空间的使用是有道理的,而且确实比2个层次更深入。我认为更大的库/项目需要更深层的嵌套(我讨厌ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace之类的类名,因此也可以将所有内容都放入全局名称空间中。)
更新3-结论
多数人说“不做”,但是...甚至增强的嵌套也比一两个层次更深。是的,它是一个库,但是:如果您想要可重用的代码,请像对待库一样对待自己的代码,然后将其交给其他人。我还使用更深层的嵌套来使用命名空间进行发现。
namespace
关键字吗?