Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们应该把枚举放在哪里?_C#_Java_C++_Coding Style_Enums - Fatal编程技术网

C# 我们应该把枚举放在哪里?

C# 我们应该把枚举放在哪里?,c#,java,c++,coding-style,enums,C#,Java,C++,Coding Style,Enums,当我用Java开发时,一个总是困扰我的小问题。实际上,我使用了很多不同的枚举,我从来都不知道应该把它们放在哪里。通常,我会创建一个名为enumeration的特殊包,我很确定这不是最佳实践。我是否应该将枚举直接放在与其最属于的类组不同的包中 另外,另一种语言(C#或C++)是否也一样?当我的应用程序变得足够大时,我们实际上将所有枚举迁移到一个C#csproj/DLL文件中。该文件非常小,但由于它与所有应用程序完全分离,这意味着: 人们总是知道在哪里可以找到枚举 减少了两次“重新创建”相同枚举的

当我用Java开发时,一个总是困扰我的小问题。实际上,我使用了很多不同的枚举,我从来都不知道应该把它们放在哪里。通常,我会创建一个名为enumeration的特殊包,我很确定这不是最佳实践。我是否应该将枚举直接放在与其最属于的类组不同的包中


另外,另一种语言(C#或C++)是否也一样?

当我的应用程序变得足够大时,我们实际上将所有枚举迁移到一个C#csproj/DLL文件中。该文件非常小,但由于它与所有应用程序完全分离,这意味着:

  • 人们总是知道在哪里可以找到枚举
  • 减少了两次“重新创建”相同枚举的可能性
  • 它可以直接在服务器应用程序和客户端应用程序中使用,以确保两者使用相同的定义

我并不是说这对每个人来说都是最好的解决方案,但它确实降低了我们的麻烦程度。

最好的描述取决于枚举的使用方式

例如

  • 如果枚举仅在一个类中使用,则可以使其成为该类的内部类
  • 如果一个类(例如
    A
    )比其他类(例如,其他类调用
    A
    上具有枚举类型参数的方法)更多地使用枚举,则可能需要将其放在
    A
    所在的包/命名空间中

一般来说,根据最常用的位置找到最佳的包/命名空间。枚举的声明和放置遵循与可见性和块层次结构相关的其他变量的声明和放置相同的规则。这意味着如果将枚举的代码放在类a中,则该枚举将属于类a

我还广泛使用枚举,为了创建一个干净、正确的模型,我尝试将枚举放在它所属的位置,因为大多数时候我都会在这个位置使用它——不管它是命名空间、clas还是嵌套类。当我从其他任何地方使用枚举时,我都必须显式地使用pare枚举的nt范围,它再次对语义建模-如果编码正确-最好


<> P>这主要是一个对象相关的真实世界映射、语义一致性和代码重用性的问题。我想知道,虽然我不知道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;
  };
};
然后在类头文件中,您会得到:

// 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;
  };
};
然后在客户端代码中使用“使用”语法:


.NET和C++没有包,所以这不是完全与它们相关的。“ODD”等价于NAMESPACESSIN .NET,你把它放在它使用的命名空间中。你必须决定语言。答案是完全不同的。重复。我同意答案。本质上是相同的,对于C或java,只是名称空间。与包装。