命名空间或类中的实用程序函数

Utility functions in a namespace or in a class?

本文关键字:实用程序 函数 命名空间      更新时间:2023-10-16

直到现在,如果我需要一些常用的实用程序函数,我会将它们移到实用程序类中。以这样的方式:

#pragma once
class QDate;
class QDateEdit;
class QDialog;
class QWidget;
class GuiUtils final
{
public:
    static void moveDialog( QDialog* aDialog, const int aMargin = 4 );
    static void setMainWidget( QWidget* aParent, QWidget* aChild, const int aMargin = 0 );
    static void setValueBlocked( QDateEdit* aDateEdit, const QDate& aDate );
private:
    GuiUtils();
};
class DateUtils final
{
public:
    static QDate today();
    static QDate yesterday();
    static QDate firstDayOfWeek();
    static QDate firstDayOfMonth();
    static QDate firstDayOfQuarter();
    static QDate firstDayOfYear();
    static int quarter( const QDate& aDate );
    static int quarter( const int aMonth );
private:
    DateUtils();
};

但我知道还有其他的选择。我可以把所有函数移到一个命名空间中。以这样的方式:

#pragma once
class QDate;
class QDateEdit;
class QDialog;
class QWidget;
namespace gui_utils
{
    void moveDialog( QDialog* aDialog, const int aMargin = 4 );
    void setMainWidget( QWidget* aParent, QWidget* aChild, const int aMargin = 0 );
    void setValueBlocked( QDateEdit* aDateEdit, const QDate& aDate );
};
namespace date_utils
{
    QDate today();
    QDate yesterday();
    QDate firstDayOfWeek();
    QDate firstDayOfMonth();
    QDate firstDayOfQuarter();
    QDate firstDayOfYear();
    int quarter( const QDate& aDate );
    int quarter( const int aMonth );
};

对我来说,这似乎是创建实用程序类比名称空间更好的解决方案。我知道我需要输入更多,但是如果我需要为所有实用函数组定义一个新的名称空间,这对我来说似乎有点极端。我通常不创建新的命名空间,而是每次都创建类,所以我使用第一个选项。

但现在我想知道:

    使用命名空间有什么好处吗?
  • 在使用名称空间时是否有更好的性能?
  • 是否更符合C++的概念?
  • 还有其他使用名称空间的原因吗?
我很想知道你的意见,但我也需要解释。我不想重写我现有的代码,并以不同的风格编写新的代码,"只是因为"。我需要一些基于语言/性能或任何其他类型的解释,为什么要以这样或那样的方式使用它。

我相信在您的情况下,出于各种原因,使用名称空间是更好的选择。

例如:

  1. 似乎你的函数不共享数据。
  2. 名称空间启用ADL(参数依赖的名称查找)。

请参阅任何样式指南。这是来自Google的:

*非成员函数、静态成员函数和全局函数建议将非成员函数放在命名空间中;…与其创建类来对不共享静态数据的静态成员函数进行分组,不如使用名称空间。*