我可以理解一级命名空间的用途。但是 3 级命名空间。看起来很疯狂。这有什么实际用途吗?或者这只是一个误解?
9 回答
分层命名空间确实有一个用途,因为它们允许逐步更精细的定义。当然,单个提供者可能会产生两个具有相同名称的类。通常第一级由公司名称占据,第二级指定产品,第三级(可能更多)我提供域。
命名空间隔离还有其他用途。一种流行的情况是将工厂模式的基类放在它自己的命名空间中,然后由提供者将派生工厂放在它们自己的命名空间中。例如System.Data
,System.Data.SqlClient
和System.Data.OleDbClient
。
显然这是一个见仁见智的问题。但这真的归结为组织。例如,我有一个项目,它有一个插件 api,它的函数/对象看起来像这样:
plugins::v1::function
当 2.0 推出时,它们将被放入 v2 子命名空间。我打算只弃用但永远不会删除将来应该很好地支持向后兼容性的 v1 成员。这只是“理智”用法的一个例子。我想有些人会有所不同,但就像我说的,这是见仁见智的问题。
大型代码库将需要它。以 boost 为例。我认为没有人会称提升代码为“疯狂”。
如果您考虑这样一个事实,即在层次结构的任何一个级别上,人们只能非常粗略地理解大约 10 个项目,那么两个级别最多只能给您 100 个。一个足够大的项目将需要更多,因此很容易最终达到 3 个级别。
我在我的公司 yyy 从事 XXX 应用程序,我正在编写一个 GUI 子系统。所以我使用 yyy::xxx::gui 作为我的命名空间。
当您需要多个级别时,您可以轻松地发现自己处于一种情况。例如,您的公司为其所有代码都有一个巨大的命名空间,以将其与第三方代码分开,而您正在编写一个库,您希望将其放入自己的命名空间中。通常,只要您有一个非常庞大且复杂的系统,按层次划分,使用多个命名空间级别是合理的。
这取决于您的需求和编程风格。但好处之一namespace
是有助于划分名称空间(因此得名)。使用单个命名空间时,随着项目规模和复杂性的增加,名称冲突的可能性也会增加。
如果您正在编写旨在共享或重用的代码,这将变得更加重要。
我同意申请。大多数使用多级命名空间的人(根据我的经验)来自 Java 或 .NET 背景,其中噪音明显减少。我发现好的类前缀可以代替多层命名空间。
但是我已经看到在 boost(和其他库)中很好地使用了多个命名空间级别。一切都在 boost 命名空间中,但允许(鼓励?)库在它们自己的命名空间中。例如 - boost::this_thread 命名空间。它允许诸如...
boost::this_thread::get_id()
boost::this_thread::interruption_requested()
“this_thread”只是一个自由函数集合的命名空间。您可以对类和静态函数(即定义自由函数的 Java 方式)做同样的事情,但是当语言有自然的方式时,为什么要做一些不自然的事情呢?
只需查看 .Net 基类库,就可以看到名称空间层次结构得到了很好的利用。它在一些地方深入四到五层,但大多数只有两三层,而且组织非常适合寻找东西。
代码库越大,对分层命名空间的需求就越大。随着您的项目变得越来越大,您发现您需要以更容易找到东西的方式对其进行分解。
例如,我们目前使用 2 级层次结构。然而,我们现在谈论的一些较大的部分将它们分成 3 个级别。