假设我有,或者将要写,一组相关的函数。假设它们与数学有关。在组织方面,我应该:
编写这些函数,并将它们放在我的MyMath命名空间中,并通过MyMath::XYZ()引用它们 创建一个名为MyMath的类,并使这些方法是静态的,并引用类似的MyMath::XYZ()
为什么我要选择其中一种来组织我的软件呢?
假设我有,或者将要写,一组相关的函数。假设它们与数学有关。在组织方面,我应该:
编写这些函数,并将它们放在我的MyMath命名空间中,并通过MyMath::XYZ()引用它们 创建一个名为MyMath的类,并使这些方法是静态的,并引用类似的MyMath::XYZ()
为什么我要选择其中一种来组织我的软件呢?
当前回答
命名空间和类方法都有各自的用途。命名空间有能力分布在文件中,但如果你需要强制所有相关的代码进入一个文件,这是一个弱点。如上所述,类还允许您在类中创建私有静态成员。你可以把它放在实现文件的匿名命名空间中,但是它的作用域仍然比在类中更大。
其他回答
如果需要静态数据,请使用静态方法。 如果它们是模板函数,并且您希望能够为所有函数一起指定一组模板形参,那么可以在模板类中使用静态方法。
否则,请使用命名空间函数。
对于这些评论:是的,静态方法和静态数据往往被过度使用。这就是为什么我只提供了两个相关的场景,我认为它们会有所帮助。在OP的特定示例(一组数学例程)中,如果他想要指定参数的能力——例如,核心数据类型和输出精度——将应用于所有例程,他可能会这样做:
template<typename T, int decimalPlaces>
class MyMath
{
// routines operate on datatype T, preserving at least decimalPlaces precision
};
// math routines for manufacturing calculations
typedef MyMath<double, 4> CAMMath;
// math routines for on-screen displays
typedef MyMath<float, 2> PreviewMath;
如果您不需要这样做,那么无论如何都要使用名称空间。
有很多人不同意我的观点,但我是这样看的:
类本质上是某种对象的定义。静态方法应该定义与该对象定义密切相关的操作。
如果你只是要有一组相关的函数,而不与底层对象或一种对象的定义相关联,那么我会说只使用名称空间。对我来说,从概念上讲,这更合理。
例如,在你的情况下,问自己,“MyMath是什么?”如果MyMath没有定义一种对象,那么我会说:不要让它成为类。
但就像我说的,我知道有很多人(甚至激烈地)不同意我的观点(特别是Java和c#开发人员)。
使用类-选项的另一个原因是使用访问说明符。然后,您可以将公共静态方法分解为更小的私有方法。公共方法可以调用多个私有方法。
为什么我要选择其中一种来组织我的软件呢?
如果您使用名称空间,您将经常遇到一个语言缺陷,即相互调用的函数必须以特定的顺序列出,因为c++无法在文件中看到进一步的定义。
如果使用类,则不会出现此缺陷。
在类中包装实现函数比维护所有实现函数的声明或以非自然的顺序放置实现函数以使其易于编译更简单。
命名空间和类方法都有各自的用途。命名空间有能力分布在文件中,但如果你需要强制所有相关的代码进入一个文件,这是一个弱点。如上所述,类还允许您在类中创建私有静态成员。你可以把它放在实现文件的匿名命名空间中,但是它的作用域仍然比在类中更大。