我发现通常有一个单一类型或命名空间可以将任何特定的枚举作为参数传入,因此我总是在那里定义这些枚举。然而,最近我的一位同事对此提出了很大的质疑,认为这样做是愚蠢的,应该始终在项目根目录下定义枚举类型的枚举命名空间。
最佳的枚举类型存放位置是什么?
我发现通常有一个单一类型或命名空间可以将任何特定的枚举作为参数传入,因此我总是在那里定义这些枚举。然而,最近我的一位同事对此提出了很大的质疑,认为这样做是愚蠢的,应该始终在项目根目录下定义枚举类型的枚举命名空间。
最佳的枚举类型存放位置是什么?
为什么要将枚举类型与其他类型区分开来?将它们保留在相同的命名空间中,因为它们很可能被其他类使用 - 并且假设它们将被其他类使用,则将它们作为自己文件中的顶级类型。
我唯一经常将类型“clump”在一起的类型是委托 - 有时我会在Delegates.cs文件中放置一堆委托。 不过,随着 .NET 3.5 和 Func / Action 的出现,情况变得不那么常见了。
一般来说,我会将所有不同类型(类、接口和枚举)放在它们自己的文件中,无论它们有多小。这样做可以更容易地找到和管理它们所在的文件,尤其是当您不在Visual Studio中并且没有“转到定义”功能时。我发现几乎每次我将一个像那样“简单”的类型放在另一个类中时,我最终要么在以后添加内容,要么以一种不再合理的方式重用它,这时它就需要拥有自己的文件。
至于使用哪个命名空间,这取决于您正在开发的任何内容的设计。通常,我尝试模仿.NET框架的约定。
我尝试将与类相关的所有内容都放在类中,这不仅包括枚举,还包括常量。我不想去其他地方搜索包含枚举的文件或类。在一个有很多类和文件夹的大型应用程序中,很难确定在哪里放置枚举文件以便于查找。
如果枚举在几个紧密相关的类中使用,您可以创建一个基类,以便共享诸如枚举之类的常见类型。
当然,如果枚举真的很通用并且被广泛使用,您可能需要为它们创建一个单独的类,以及其他通用实用程序。
// MyEnumHeader.h
// Consolidated enum header file for this dll,lib,subsystem whatever.
namespace MyApp
{
namespace MyEnums
{
enum SomeEnum { EnumVal0, EnumVal1, EnumVal2 };
};
};
然后在类头文件中,您会得到:
// MyInterfaceHeader.h
// Class interfaces for the subsystem with all the expected dependencies.
#include "MyEnumHeader.h"
namespace MyApp
{
class MyInterface
{
public:
virtual void DoSomethingWithEnumParam (MyEnums::SomeEnum enumParam) = 0;
};
};
可以根据实际情况使用多个枚举头文件。我喜欢将它们与类头文件分开,这样在系统其他地方使用枚举变量时就不需要类头文件。如果枚举在类内部声明,那么在其他地方使用时就必须要有封装类定义。
并且如前所述,在外部代码中您可以使用以下内容:
using namespace MyApp::MyEnums;
什么环境?
在.NET中,我通常创建一个空的类文件,将其重命名为MyEnum或其他名称以表示它保存了我的枚举,并在其中声明它。
namespace mynamespace
{
public partial class MyClass
{
}
enum MyClassOptions
{
}
}
我倾向于在使用明显的情况下定义它们。如果我有一个typedef用于某种原因的结构体...
typedef enum {
HI,
GOODBYE
} msg_type;
typdef struct {
msg_type type;
union {
int hivar;
float goodbyevar;
}
} msg;