c ++命名空间用法和命名规则

时间:2009-03-02 18:13:13

标签: c++ namespaces

在项目中,我们正试图就名称空间使用达成一致。 我们决定第一级是“productName”,第二级是“moduleName”。

productName::moduleName

现在,如果模块是一种实用程序模块,则添加第三个命名空间没有问题。例如,添加“str”:productName :: utilityModuleName :: str - 来划分所有“字符串”相关内容的空间。

如果模块是主要业务模块,我们有很多机会,几乎没有协议。

例如

class productName::mainModuleName::DomainObject

class productName::mainModuleName::DomainObjectSomethingElseViewForExample

可以在

namespace productName::mainModuleName::domainObject
class Data
class ViewForExample

我们为什么要创建内部非私有类而不是名称空间? 我们为什么要创建所有方法都是静态的类(除非这个类是模板参数的情况除外)?

项目包含1Gb的源代码。 那么,在c ++中划分命名空间模块的最佳实践是什么?

4 个答案:

答案 0 :(得分:39)

用于命名空间的名称空间:

命名空间仅用于建立上下文,因此您没有命名配置。

一般规则:

不需要指定太多的上下文,并且会带来更多的不便。

所以你想要用最好的判断,但仍然遵循以下两条规则:

  • 使用命名空间时不要太笼统
  • 使用命名空间时不要太具体

对于如何使用命名空间名称,以及仅使用基于相关代码组的命名空间,我不会那么严格。

为什么过于笼统的命名空间无效:

将命名空间从产品名称开始划分的问题在于,您通常会拥有一个代码组件,或者一些多个产品通用的基本库。

您也不会在Product1中使用Product2名称空间,因此明确指定它是没有意义的。如果您在Product1中包含Product2的文件,那么这个命名转换是否仍然有用?

为什么过于具体的命名空间没有帮助:

如果命名空间太具体,则这些不同命名空间之间的界限开始模糊。您开始来回使用彼此内部的名称空间。此时,最好在同一名称空间下将公共代码一起概括。

包含所有静态vs模板的类:

  

“我们为什么要创造内心而不是   私有类而不是名称空间?   我们为什么要创建所有类   方法是静态的“

一些差异:

  • 可以使用using关键字
  • 隐含命名空间
  • 命名空间可以是别名,类是类型,可以是typedef'ed
  • 可以添加命名空间;您可以随时为其添加功能并直接添加到其中
  • 如果不创建新的派生类
  • ,则无法添加类
  • 命名空间可以有前向声明
  • 通过课程,您可以拥有私人会员和受保护的会员
  • 类可以与模板一起使用

究竟如何划分:

  

“项目由1Gb源代码组成   码。那么,最佳实践是什么?   在命名空间中划分模块   C ++?“

如果没有确切的源代码,确切地说如何划分代码是太主观了。基于模块划分虽然听起来合乎逻辑,但不是整个产品。

答案 1 :(得分:5)

这一切都是主观的,但我会毫不犹豫地超过3级。它在某些方面变得太笨重了。因此,除非你的代码库非常非常大,否则我会保持它非常浅。

我们将代码划分为子系统,并为每个子系统设置命名空间。如果实际上它们可以跨子系统重用,那么实用程序将进入它们自己的命名空间。

答案 2 :(得分:3)

在我看来,您正在尝试使用名称空间作为设计工具。它们并非旨在用于此目的,它们旨在防止名称冲突。如果没有冲突,则不需要命名空间。

答案 3 :(得分:0)

我根据其用法划分名称空间:

我有一个单独的命名空间,我已经定义了所有的接口(纯虚拟类)。

我有一个单独的命名空间,我已经定义了我的库类(比如db库,处理库)。

我有一个单独的命名空间,我有我的核心业务(业务逻辑)对象(如purchase_order等)。

我想,它是关于以某种方式定义它,这在将来变得难以处理。因此,您可以检查当前设计所面临的困难。

如果你认为他们没事,你就应该坚持下去。