我们应该把遗珠放在哪里
Where should we put our enums?
当我用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;
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- C++泛型类错误,问题出在哪里?
- 当我们在C++中创建类的对象时,为成员函数分配的内存在哪里?
- 我们在哪里可以使用std::barrier over std::latch
- 我们可以在哪里使用列表初始化?
- 因此,我们有int32_t、int16_t、uint64_t等.但是atoi32、atoi16、atoui64等在哪里.
- 我们有一个国际标准:C++0x是一致通过的.我在哪里可以找到最新的草稿/副本
- 内存运行时错误:我们在哪里删除这个指针