2012-07-19 94 views
2

在Java中开发时,总是困扰我的一个小问题。我实际上使用了很多不同的枚举,而且我不知道应该把它放在哪里。通常,我创建了一个名为的特殊程序包,列举了,我相当肯定这不是最佳实践。我应该直接将我的枚举放在与它最属于的类组相同的包中吗?我们应该在哪里放置枚举?

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

+1

.NET和C++没有包,所以这与它们并不完全相关。 – Oded 2012-07-19 18:30:49

+2

@Oded相当于命名空间 – 2012-07-19 18:31:27

+0

在.NET中,您将它放在使用它的命名空间中。 – 2012-07-19 18:31:31

回答

5

最好的决定因素取决于如何使用枚举。

E.g.

  • 如果枚举是一个类只使用,你可以把它的内部类的那类
  • 如果枚举由一个类(如A)比其他人更多(例如别人调用的方法在A具有类型枚举的参数,你可能想要把它在同一个包/名称空间A

在一般情况下,发现基于其中最

用过的最好的包/命名空间。
1

当我的应用程序变得足够大时,我们实际上已将所有枚举迁移到单个C#csproj/DLL文件。该文件是非常小的,但因为它是完全从所有应用程序分开,这意味着:

  • 人们总是能知道到哪里找一个枚举
  • 的“再造”同一枚举的可能性减小两次
  • 它可以直接在这两个服务器应用程序和客户端应用程序使用,以确保两个使用相同的定义

我不声称这是对每个人都是最好的解决方案,但它确实减少了麻烦水平。

1

枚举的声明和放置遵循与声明和放置有关可见性和块级别的其他变量相同的规则。这意味着如果你把一个枚举的代码放入一个类A中,那么这个枚举将属于类A.

我也广泛地使用枚举,我试图做的是创建一个干净和正确的模型是把枚举放在它紧密地属于的地方,因为大多数时候我会在这个地方使用它 - 不管它是一个命名空间,一个clas还是一个嵌套类。当我从其他地方使用枚举时,我将不得不明确地需要使用枚举的父范围,它再次对语义进行建模 - 如果编码正确 - 最好。

所以这主要是一个与对象相关的真实世界映射,语义一致性和代码重用性的问题。

1

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

0

使用嵌套命名空间(请参阅其他线程:Fuller information on this)。最主要的是它减少了子系统之外的依赖性。

所以在枚举头文件中你会得到:

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