在命名空间或类中使用实用函数?

4

直到现在,如果我需要一些常用的实用函数,我会将它们移动到一个实用类中。就像这样:

#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 ++的概念?
  • 还有其他使用命名空间的原因吗?
我想知道您的意见,但我也需要解释。我不想重新编写我的现有代码,并以不同的风格编写新代码“只是因为”。我需要一些基于语言/性能或任何其他类型的解释,为什么要以这种或那种方式使用它。
谢谢帮助。

2
一个只带有静态成员函数的类和一个命名空间没有什么区别,除非你要确保这个类不能被实例化。建议使用命名空间。另一方面,如果一些函数之间需要共享某些状态,将它们转换为一个普通的可以实例化的类会更加合适。 - Some programmer dude
如果您没有实例化该类,则不会有任何性能差异。唯一的区别是您无法使用 using class utils; - gan_
命名空间的另一个优点是,您可以编写 using namespace 并在不每次编写命名空间名称的情况下引用函数。此外,使用函数可以清楚地表明它们是无状态的(这不是保证,但默认情况下是这样)。相反,使用静态类函数是有理由相信该类中存在某些存储状态的原因。 - Pavel Strakhov
我通常会写下命名空间的名称,因为我们使用了很多SDK,如果没有命名空间的名称就会产生冲突。 - p.i.g.
1个回答

2
我相信在你的情况下,使用命名空间是更好的选择,原因有很多。
例如:
  1. 看起来你的函数不共享数据。
  2. 命名空间使ADL(参数依赖名称查找)成为可能。
可以参考几个样式指南。这是 Google的一段摘录: *非成员、静态成员和全局函数 建议将非成员函数放在命名空间中; 而不是仅为了分组不共享静态数据的静态成员函数而创建类,应该使用命名空间。 *

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接