当我用 Java 开发时,一个简短的问题总是困扰着我。我实际上使用了很多不同的枚举,但我从来不知道应该把它们放在哪里。通常,我创建一个名为enumeration的特殊包,我很确定这不是最佳实践。我应该将我的枚举直接放在与其最所属的类组相同的包中吗?
另外,对于另一种语言(C# 或 C++)是否也一样?
当我用 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 namespace MyApp::MyEnums;