正如我在关于@Nim的答复的评论中提到的,关键在于建立一个结构:practical。
如果是的话,请看一下。 NET框架,其名称空间有很长的地名,并且被深深地nes(Say,System.Collections.Generic.List<T>
)。 这一点同样适用于 Java。 你的名字非常长,充斥着大面积的空域,毫无效果。
我第一次创立了<代码>List级,Im将陷入名称碰撞,而这正是名称空间应当预防的。 (由于这似乎给一位评论员提出了错误的想法,当然我能够创建自己的名单类别。) 但每当我use时,我就有陷入冲突的风险。 “标准”<代码>List或其名称空间都非常常用,因此,我有很好的机会使用<>使用的这个名称空间,这意味着,如果我也想提及我的<>/><<>>>>。 在同一个档案中,我有冲突。
By contrast, the C++ standard library puts nearly everything in a simple std
namespace (and a few things in std::ios
)
从实际来看,网络名称空间实际上是一种浪费。 它们没有效果。 每份法典文件都有一份长长的<代码>使用X;使用Y;使用Z,因此,净效应是,在你写你的法典时,没有一个名称空间实际上有效。 为了编制目录,我只读到List<int>
。 名称空间基本上已经消失。
在C++中,人们被劝阻使用<密码>,使用带<><>>的空间,因此,为了使用标准图书馆符号,我们使用<代码>std prefix:std:vector<int>
。
烟雾使用类似东西:几乎所有东西都载于<条码>boost条码>。 然后将几个复杂的图书馆放在次名称空间,例如<代码>boost:filesystem或boost:mpl
,一些图书馆“内部使用”名称空间,通常名称为aux<>/code>,但意图是供用户看不见(或至少被忽视)。
这更能保护名称空间的优势:避免命名冲突。 我可以(而且人们通常会这样做,因为病媒具有若干不同的含义)界定了我自己的<条码> 条码>类别,并且与<条码>std:vector有冲突。
因此,你的名字空间如何被深层nes? 我倾向于像标准图书馆这样的东西加一比。 • 为一切目的创造新的名称空间,并缩短名称。
也许所有公司代码都使用一个共同的根基空间,即<代码>Cpy。
根据这一规定,每个产品都有一个名称空间,即<代码>Prod。 以及过去? 您的每个主要组成部分(Comp
)都有一个名称空间,而且这一空间基本上也属于这一空间。
这里的重要事情是,你实际上从来没有提及最外名空间。 页: 1 我几乎从未需要写到<代码>Cpy:Prod:Comp,因为我的代码已经放在头两个名称空间。 如果情况如此,名称空间结构就会太长,太深。
Then I sometimes do like Boost, and create small "internal" helper namespaces, typically called Aux
or Util
or similar. These should be small, and should only ever be accessed from their immediate parent namespace. A specific component might have a few classes that are for internal use only. So they are tucked away in a small Aux
namespace, mainly to keep them hidden from others that reference our component.
当然,你可能会问,最外围的“公司”名称空间究竟有什么目的。 难道说我们的所有法典都好是我们的公司吗? 第三方代码通常(hopeful)位于其自己的名称空间(say,boost:
),即使没有公司名称空间,我们也会冒着任何冲突的风险。 您不妨删除。
另一个需要考虑的事项是,如果你重新撰写供外部使用的图书馆部件,则名称空间结构应为 甚至缩短<>。 在公司内,你可以假定,每个人都已经在“公司”名称空间内写成密码,因此他们永远不必打出名称。 它基本上属于“自由”。 但是,如果外部用户必须提及你的代码,那么,这是他们必须打出的另外一层名称空间,这种空间已经迅速老。 整体“产品”名称空间可能是不可避免的(类似于std
或boost
),但你可能希望尽可能避免“产品”名称空间。 (Again,与两者一样,后者很少在根本名称下建立次名称空间)
底线是,您的国名空间必须是practical <>em>和usable。 如果你迫使用户在名称空间预设物中排出超过8个特性,就会失去意义,而且他们只是开始在任何地方使用<条码>。 您实际上只有need 称号空间,否则你会发生名字碰撞。 你们的控制权永远不应与第三方代码共用一个名称空间,因为你对自己增加的名字没有控制权(通常,第三方的校准通过将其图书馆放在一个共同的根基空间,例如<条码>。 但是,在你控制的法典中,有的只有,许多碰撞。 因此,没有比你实际需要确定更多的名称空间。