【问题标题】:Where should we put our enums? [closed]我们应该把我们的枚举放在哪里? [关闭]
【发布时间】:2012-07-19 18:26:24
【问题描述】:

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

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

【问题讨论】:

  • .NET 和 C++ 没有包,所以这与它们并不完全相关。
  • @Oded 相当于命名空间
  • 在 .NET 中,您将它放在使用它的命名空间中。
  • 你必须决定语言。答案会完全不同。
  • stackoverflow.com/questions/213637/… 的副本。我同意那里的答案。 C# 或 Java 的本质是相同的,只是命名空间与包。

标签: c# java c++ coding-style enums


【解决方案1】:

最佳决定取决于枚举的使用方式。

例如

  • 如果枚举只在一个类中使用,您可以将其设为该类的内部类
  • 如果一个类(例如A)比其他类(例如,其他类调用A 上具有枚举类型参数的方法)更多地使用枚举;您可能希望将它放在同一个包中/ A 所在的命名空间。

一般来说,根据使用最多的位置找到最佳的包/命名空间

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      枚举的声明和放置遵循与其他变量关于可见性和块层次结构的声明和放置相同的规则。这意味着如果您将枚举的代码放在 A 类中,那么该枚举将属于 A 类。

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          使用嵌套命名空间(请参阅此处的其他线程: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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-10
            • 2012-11-27
            • 2020-09-30
            • 1970-01-01
            • 1970-01-01
            • 2011-03-02
            • 2019-07-11
            • 1970-01-01
            相关资源
            最近更新 更多