我们应该把我们的枚举放在哪里?

时间:2012-07-19 18:26:24

标签: c# java c++ coding-style enums

一个简短的问题,当我用Java开发时总是困扰我。我实际上使用了很多不同的枚举,我不知道应该把它们放在哪里。通常,我创建一个名为 enumeration 的特殊包,我确信这不是最佳实践。我应该将我的枚举直接放在同一个包中,而不是它最属于哪个类吗?

另外,对于另一种语言(C#或C ++)是否相同?

5 个答案:

答案 0 :(得分:5)

最佳决策取决于枚举的使用方式。

E.g。

  • 如果枚举仅用于一个类,则可以使其成为该类的内部类
  • 如果一个类(例如A)使用枚举比其他类更多(例如,其他类调用A上具有枚举类型参数的方法;您可能希望将其放入与A相同的包/名称空间位于。

通常,根据最常用的位置找到最佳的包/命名空间

答案 1 :(得分:1)

当我的应用程序变得足够大时,我们实际上将所有枚举迁移到单个C#csproj / DLL文件中。该文件非常小,但由于它与所有应用程序完全分离,因此意味着:

  • 人们总是知道在哪里寻找一个枚举
  • 两次“重新创建”相同枚举的可能性降低
  • 它可以直接在服务器应用程序和客户端应用程序中使用,以确保两者都使用相同的定义

我并不认为这是每个人的最佳解决方案,但它确实减少了我们的麻烦程度。

答案 2 :(得分:1)

枚举的声明和放置遵循与关于可见性和块层次结构的其他变量的声明和放置相同的规则。这意味着如果你将枚举的代码放在A类中,那么该枚举将属于A类。

我也广泛使用枚举,为了创建一个干净正确的模型,我尝试做的是将枚举放在它所属的地方,因为大多数时候我会在这个地方使用它 - 不管它是不是命名空间,clas或嵌套类。当我从其他任何地方使用枚举时,我将不得不明确地需要使用枚举的父作用域,它再次模拟语义 - 如果编码正确 - 最好。

所以这主要是我想说的与对象相关的真实世界映射,语义一致性和代码可重用性的问题。

答案 3 :(得分:1)

我不了解Java或C#,但在C ++中,如果它与类强烈相关,我总是放入C ++类规范。如果它用于不同的类,我将它保存在一个单独的头文件中(在一个单独的命名空间中,系统特定的枚举和常量保存在其中)。

答案 4 :(得分:0)

使用嵌套命名空间(请参阅此处的其他主题:Fuller information on this)。主要的是它减少了相关子系统之外的依赖关系。

所以在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;
  };
};

然后在客户端代码中使用“using”语法:

using namespace MyApp::MyEnums;