定位枚举类型的最佳位置在哪里?

时间:2008-10-17 20:00:27

标签: enums

我发现通常有一个单一的类型或命名空间,它接受任何特定的枚举作为参数,因此我总是在那里定义那些枚举。最近,我有一个同事大肆宣传这是一个愚蠢的事情,你应该总是在项目的根目录中有一个枚举命名空间,你可以在其中定义每个枚举类型。

找到枚举类型的最佳位置在哪里?

10 个答案:

答案 0 :(得分:43)

为什么将枚举与其他类型区别对待?将它们保存在可能被使用的相同名称空间中 - 假设它们将被其他类使用,请将它们作为顶级类型放在自己的文件中。

通常聚集在一起的唯一类型是委托 - 我有时会有一个带有一堆委托的Delegates.cs文件。对于.NET 3.5和Func / Action来说,情况不是很少,请注意。

答案 1 :(得分:8)

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

答案 2 :(得分:4)

我通常会尝试将所有不同类型(类,接口和枚举)放在自己的文件中,无论它们有多小。它只是使查找和管理它们所在的文件变得更加容易,特别是如果您不是在Visual Studio中并且具有“转到定义”功能。我发现几乎每次我在另一个类中放置一个“简单”类型的东西时,我最后要么添加它,要么重新使用它以使它不再有意义有自己的文件。

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

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:4)

我认为你将Enums和Constants放在使用它们的类中,或者使用它们来控制代码决策,并使用代码完成来查找它们。这样你就不必记住它们的位置,它们与课程相关联。因此,例如,如果我有一个ColoredBox类,那么我不必考虑它们的位置。他们将成为ColoredBox的一部分。 ColoredBox.Colors.Red,ColoredBox.Colors.Blue等我 我认为枚举和常量是该类的属性或描述。 如果它被多个类使用并且没有一个类占主导地位,那么拥有枚举类或常量类是合适的。 这遵循封装规则。隔离不同类的属性。如果您决定更改Cirle对象中的红色RGB,该怎么办? 你不想改变ColoredBox对象的红色?封装它们的属性可以实现这一点。

答案 5 :(得分:2)

什么环境?

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

答案 6 :(得分:2)

如果我的枚举有可能在课外使用我打算使用它,我会为枚举创建一个单独的源文件。否则我会将它放在我打算使用它的类中。

答案 7 :(得分:2)

通常我发现枚举以单个类为中心 - 作为MyClassOptions类型的东西。

在这种情况下,我将枚举放在与MyClass相同的文件中,但是在命名空间内但在类之外。

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

答案 8 :(得分:2)

我为此使用嵌套命名空间。我更喜欢它们而不是将枚举放在一个类中,因为在类之外你必须使用完整的MyClass :: MyEnum用法,即使MyEnum不会与范围内的任何其他东西冲突。

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

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

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

或者使用尽可能多的枚举头文件。我喜欢将它们与类标题分开,因此枚举可以是系统中其他地方的参数,而不需要类标题。然后,如果你想在别处使用它们,你就不必像在类中声明枚举那样使用封装类defs。

如前所述,在外部代码中,您可以使用以下内容:

using namespace MyApp::MyEnums;

答案 9 :(得分:1)

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

typedef enum {
  HI,
  GOODBYE
} msg_type;

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