实用程序在命名空间或类中的功能?

时间:2015-06-07 13:39:54

标签: c++ qt namespaces

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

#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 个答案:

答案 0 :(得分:1)

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

例如:

  1. 您的功能似乎不共享数据。
  2. 命名空间启用ADL(Argument Dependent name Lookup)。
  3. 请参阅几种风格指南中的任何一种。这是来自Google's的剪辑:

    *非成员,静态成员和全局职能 首选将非成员函数放在命名空间中; ... 不是仅创建类来对不共享静态数据的静态成员函数进行分组,而是使用命名空间。 *