命名空间内的范围功能与课堂内的功能

Scoping functions within namespace versus within class

本文关键字:功能 课堂 范围 命名空间      更新时间:2023-10-16

我在标头文件中有一堆功能(func1((,func2((,...(,我想给出一些范围。我知道2个实现:

  1. class bunchOfFunctions
    {
    public:
    static void func1();
    static void func2();
    ...
    };
    
  2. namespace bunchOfFunctions
    {
    void func1();
    void func2();
    ...
    };
    

在两个选项中,我都可以以相同的方式访问功能,即通过 bunchOfFunctions::func()。我更喜欢名称空间方法(较小的键入(,但是我在工作场所也看到了第一个实现方法。

哪种选项更好?还有其他选项吗?

除了突出显示点,

spread:可以将namespace扩展到多个文件中,其中必须在一个地方定义Class

可读性和可理解性:通常开发人员对Class的固有理解以及namespace是什么。

"更好"取决于您的定义。您在范围中寻找什么素质?这里没有一个尺寸适合所有答案。但这是两种方法的一些属性:

  1. 有必要符合函数名称的必要性。
    在课堂上,您必须必须bunchOfFunctions::func1()利用这些功能。同时,命名空间允许您拉动使用使用声明的功能
    using bunchOfFunctions::func1;
    
    并在大多数范围中使用它不合格。如果您希望,您甚至可以通过使用指令将所有名称空间的所有成员都可以无限制的名称查找。课程没有等效的机械师。
  2. 混音。
    没有区别。别名一个班级写的
    using BOF = bunchOfFunctions;
    
    同时使用名称空间的同时
    namespace BOF = bunchOfFunctions;
    
  3. 隐私。
    班级可以有私人成员。因此,您可以将功能声明放在私人访问说明符下,并在公共内联成员中使用它们。名称空间没有这种机制。取而代之的是,我们依靠约定,并将声明放在"不要触摸此"内部名称空间下,通常称为bunchOfFunctions::detail
  4. 参数依赖查找。
    C 具有一种机制,可以通过检查呼叫中包含 grimuments 的名称空间来从不合格的调用中找到函数声明。为此,该功能必须在实际的名称空间中。课堂的静态成员不受这样的查找。因此,对于任何成员类型

这四个是我头顶的。判断自己的需求。至于"还有其他选项吗?" ,这是您今天将此类功能分组为C 的唯一两种方法。在C 20中,我们将有模块!这将为代码提供另一个级别的分组。

此外,我还要补充一点,回到类的标准定义以及名称空间的内容可以帮助做出这样的决策。

名称空间是一个声明的区域,为标识符(类型,函数,变量等(提供了范围。名称空间用于将代码组织成逻辑组,并防止可能发生的名称碰撞,尤其是当您的代码库包括多个库时。

在面向对象的编程中,类是用于创建对象的可扩展程序编码模板,为状态(成员变量(提供初始值和行为的实现(成员函数或方法(。

虽然听起来可能相似,但它们是相当具体的。因此,如果您的功能是相关的,但不一定与同一对象相关,我会为是否将其放入课堂上而感到困难。特别是如果将这些功能组合在一起一堂课可能会违反单个责任原则:https://en.wikipedia.org/wiki/single_responsibility_principle_principle