当我使用Java开发时,总有一个让我困扰的问题。我实际上使用了很多不同的枚举类型,但我从来不确定应该把它们放在哪里。通常,我会创建一个名为enumeration的特殊包,我相信这并不是最佳实践。我应该直接将我的枚举类型放在与其最相关的类组所在的同一包中吗?
另外,对于其他语言(如C#或C++),是否也适用相同的规则呢?
当我使用Java开发时,总有一个让我困扰的问题。我实际上使用了很多不同的枚举类型,但我从来不确定应该把它们放在哪里。通常,我会创建一个名为enumeration的特殊包,我相信这并不是最佳实践。我应该直接将我的枚举类型放在与其最相关的类组所在的同一包中吗?
另外,对于其他语言(如C#或C++),是否也适用相同的规则呢?
我不认为这是每个人的最佳解决方案,但它确实降低了我们的麻烦程度。
枚举的声明和放置遵循与其他变量相同的规则,涉及可见性和块层次结构的声明和放置。这意味着如果您将枚举的代码放在类A中,则该枚举将属于类A。
我还广泛使用枚举类型,并尝试根据其最密切的归属位置放置枚举类型,因为大多数情况下我会在此处使用它 - 无论是命名空间、类还是嵌套类。当我从其他地方使用枚举类型时,我将必须显式地使用枚举类型的父范围,这再次最好地模拟了语义(如果编码正确)。
所以我认为这主要是涉及对象相关的现实世界映射、语义一致性和代码可重用性的问题。
使用嵌套命名空间(请参见此处的其他线程:有关此问题的更多信息)。主要的事情是它减少了与所讨论子系统之外的依赖。
因此,在枚举头文件中,您会得到:
// 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;