我从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>
或者 <std/io/stream>
?我认为缺少默认库的结构化是 C++ 相对于 Java/C# 的一个弱点。
如果避免冲突的独特性是一个点(这也是 C# 和 Java 的一个点),那么使用项目名称或公司名称作为命名空间是一个好主意,你不觉得吗?
一方面,有人说 C++ 是最灵活的...但每个人都说 "不要这样做"? 对我来说,C++ 可以做很多事情,但在许多情况下,即使是最简单的事情,它的语法也很可怕,相比之下 C# 更好。
更新2
大多数用户说创建超过两个级别的深度嵌套是无意义的。那么 Win8 开发中的 Windows::UI::Xaml 和 Windows::UI::Xaml::Controls::Primitives 命名空间怎么办?我认为微软使用命名空间是有道理的,而且确实比只有2个级别更深。 我认为更大的库 / 项目需要更深的嵌套(我讨厌类名像 ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace...然后你也可以把一切都放到全局命名空间中。)
更新3-结论
大多数人说 "不要这样做",但是...甚至 boost 的嵌套层次也比一个或两个层次深。是的,它是一个库,但是:如果你想要可重用的代码-把自己的代码当作你给别人的库。我还使用更深的命名空间嵌套来进行发现。
namespace
е…ій”®еӯ—зҡ„дҪҝз”ЁжҳҜеҗҰжңүж»Ҙз”Ёпјҹ - Nawaz