我们应该把遗珠放在哪里

Where should we put our enums?

本文关键字:在哪里 我们      更新时间:2023-10-16

当我用Java开发时,这个简短的问题总是困扰着我。事实上,我使用了很多不同的枚举,我从来都不确定应该把它们放在哪里。通常,我会创建一个名为enumeration的特殊包,我确信这不是最佳做法。我应该将枚举直接放在与它最属于的类组相同的包中吗?

另外,对于另一种语言(C#或C++),它会是一样的吗?

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

例如

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

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

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

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

我并不是说这对每个人来说都是最好的解决方案,但它确实降低了我们的麻烦程度。

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

我也在广泛使用枚举,为了创建一个干净、正确的模型,我试图将枚举放在它所属的位置,因为大多数时候我都会在这个位置使用它——无论它是名称空间、类还是嵌套类。当我从其他任何地方使用枚举时,我必须明确需要使用枚举的父作用域,如果编码正确,它将再次对语义进行建模。

因此,我认为这主要是一个与对象相关的真实世界映射、语义一致性和代码可重用性的问题。

我不知道Java或C#,但在C++中,如果C++类规范与类强相关,我总是使用它。如果它在不同的类中使用,我会将它保存在一个单独的头文件中(保存系统细节枚举和常量的单独命名空间中)。

使用嵌套的名称空间(请参阅此处的其他线程:有关此方面的详细信息)。主要是它减少了所讨论的子系统之外的依赖关系。

因此,在枚举头文件中,您可以得到:

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