我们应该把枚举放在哪里?(问题标题)

4

当我使用Java开发时,总有一个让我困扰的问题。我实际上使用了很多不同的枚举类型,但我从来不确定应该把它们放在哪里。通常,我会创建一个名为enumeration的特殊包,我相信这并不是最佳实践。我应该直接将我的枚举类型放在与其最相关的类组所在的同一包中吗?

另外,对于其他语言(如C#或C++),是否也适用相同的规则呢?


1
.NET和C++没有包(package),所以这对它们来说并不完全相关。 - Oded
2
@Oded,相应的术语应该是命名空间。 - Daniel DiPaolo
1
你必须决定使用哪种编程语言,答案会有很大不同。 - Bo Persson
2
复制自https://dev59.com/zXVC5IYBdhLWcg3wsTRi,我赞同那里的答案。无论是C#还是Java,本质都相同,只有命名空间和包的区别。 - kakridge
@DanielDiPaolo - 这里有微妙的差别。包既是逻辑单元,也是物理单元。命名空间是逻辑单元(程序集是物理单元)。 - Oded
显示剩余2条评论
5个回答

7
最佳决策取决于枚举类型的使用方式。
例如:
- 如果枚举类型只在一个类中使用,则可以将其作为该类的内部类。 - 如果某个类(如A)比其他类更频繁地使用该枚举类型(例如其他类调用A的参数类型为该枚举类型的方法),则您可能想要将其放在与A相同的包/命名空间中。 - 一般来说,根据最常使用的地方找到最佳的包/命名空间。

1
当我的应用程序变得足够大时,我们实际上将所有的枚举迁移到了一个单独的C# csproj/DLL文件中。这个文件非常小,但因为它完全与所有应用程序分离,这意味着:
  • 人们总是知道在哪里查找枚举
  • 减少了“重新创建”相同枚举的可能性
  • 它可以直接用于服务器应用程序和客户端应用程序,以确保两者使用相同的定义

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


1

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

我还广泛使用枚举类型,并尝试根据其最密切的归属位置放置枚举类型,因为大多数情况下我会在此处使用它 - 无论是命名空间、类还是嵌套类。当我从其他地方使用枚举类型时,我将必须显式地使用枚举类型的父范围,这再次最好地模拟了语义(如果编码正确)。

所以我认为这主要是涉及对象相关的现实世界映射、语义一致性和代码可重用性的问题。


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

0

使用嵌套命名空间(请参见此处的其他线程:有关此问题的更多信息)。主要的事情是它减少了与所讨论子系统之外的依赖。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接