2008-10-17 38 views
39

我发现通常有一个单一类型或命名空间将任何特定的枚举作为参数,因此我总是在那里定义那些枚举。不过最近我有一位同事做了一件关于这是多么愚蠢的事情的大事,而且您应该始终在项目的根目录中有一个枚举命名空间,您可以在其中定义每个枚举类型的所有人。哪里是查找枚举类型的最佳位置?

哪里是查找枚举类型的最佳位置?

+2

任何“最佳实践”相关的永远是主观的,但我觉得你的同事是错误的。 .NET框架不包括枚举名称空间,并且有很好的理由。将枚举放置在它们逻辑上属于的最大名称空间中。 (如果是合适的话,是的,将他们安排在班上。) – 2008-10-17 20:28:24

+7

直到你的同事解释她/他的问题,“愚蠢”并不是一个你可以采取行动的指标。 – 2008-10-17 21:34:15

回答

43

为什么要将枚举对待其他类型?使它们保持在相同的命名空间中,因为它们很可能会被使用 - 并假设它们将被其他类使用,并将它们置于其自己文件中的顶级类型。

我只有做的类型通常会聚集在一起的代表 - 我有时候会有一个委托的Delegates.cs文件。与.NET 3.5和Func/Action一样,请注意。

2

什么环境?

在.NET中,我通常创建一个空的类文件,将其重命名为MyEnum或任何表示它持有我的枚举,并在那里声明它。

2

如果我的枚举有任何机会在类的外部使用,我打算使用它,我为这个枚举创建一个单独的源文件。否则,我会把它放在我打算使用它的课程中。

8

此外,名称空间用于逻辑上分离属于一个对象的事物。并不是所有的类都属于同一个名称空间,只是因为它们是类。同样,并不是所有的枚举都属于同一个命名空间,只是因为它们是枚举。把它们与它们逻辑上属于的代码放在一起。

1

我倾向于定义它们,它们的使用在明显的地方是明显的。如果我有一个结构,使得使用它由于某种原因,一个typedef ...

typedef enum { 
    HI, 
    GOODBYE 
} msg_type; 

typdef struct { 
msg_type type; 
union { 
    int hivar; 
    float goodbyevar; 
    } 
} msg; 
2

通常我发现,枚举围绕着一个单独的类 - 作为一个MyClassOptions类型的东西。

在这种情况下,我将枚举放置在与MyClass相同的文件中,但位于名称空间内但位于类外部。

namespace mynamespace 
{ 
    public partial class MyClass 
    { 
    } 
    enum MyClassOptions 
    { 
    } 
} 
4

我通常会尝试将所有不同的类型(类,接口和枚举)放在它们自己的文件中,而不管它们多小。它使得查找和管理他们所在的文件变得更加容易,尤其是如果您不在Visual Studio中并且具有“定义”功能的话。我发现,几乎每次我在另一个类中放入一个“简单”类型的类型时,我最终都会在后面添加它,或者以不再有意义的方式重用它有它自己的文件。

至于哪个命名空间,它真的取决于你正在开发的任何设计。一般来说,我试图模仿.NET框架的约定。

4

我尝试将类中的所有内容都放在类中。这不仅包括枚举,还包括常量。我不想在别处搜索包含枚举的文件或类。在一个有很多类和文件夹的大型应用程序中,放置enum文件的位置并不总是很明显,因此很容易找到。

如果在几个紧密相关的类中使用了枚举,则可以创建一个基类,以便在那里共享像枚举这样的常见类型。

当然,如果一个枚举实际上是通用的并且被广泛使用,那么您可能希望为它们创建一个单独的类以及其他通用实用程序。

4

我想你把Enums和Constants放在类中消耗它们,或者使用它们来控制代码决策最多,并使用代码完成来找到它们。这样,你不必记得他们在哪里,他们与班级相关联。例如,如果我有一个ColoredBox类,那么我不必考虑他们在哪里。他们将成为ColoredBox的一部分。 ColoredBox.Colors.Red,ColoredBox.Colors.Blue等。我认为枚举和常量是该类的属性或描述。 如果它被多个类使用,并且没有一个类占上风,那么使用enum类或常量类是合适的。 这遵循封装规则。从不同类中分离属性。如果您决定更改Cirle对象中的红色RGB,但如果您不想更改ColoredBox对象的红色,则会发生什么情况? 封装它们的属性可以实现这一点。

2

我为此使用嵌套命名空间。我比他们更喜欢他们,因为在课堂之外,你必须使用完整的MyClass :: MyEnum用法,即使MyEnum不会与范围内的其他任何东西发生冲突,也需要使用完整的MyClass :: MyEnum用法。

通过使用嵌套命名空间,您可以使用“using”语法。此外,我会将与给定子系统相关的枚举放在他们自己的文件中,这样就不会因为必须包含世界来使用它们而产生依赖关系问题。

所以在枚举头文件中你会得到:

// 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;