【问题标题】:C# Enums vs Data driven listsC# 枚举与数据驱动列表
【发布时间】:2010-11-15 19:22:36
【问题描述】:

我正在尝试找出设计枚举的最佳方法。假设我有一个类和枚举:

public enum ActionType
{
    Acceptable = 1,
    Unacceptable = 2,
    PendingReview = 3        
}
public class Report
{
    public ActionType Action { get; set; }
}

假设我还有一个存储不同动作类型的数据库表:

Id     Action
1      Acceptable
2      Unacceptable
3      PendingReview

如果我想在以后添加另一种类型的操作,我将不得不更新枚举并重新部署程序集。但我喜欢枚举减少错误、使代码更易于阅读以及确保前向兼容性的方式。什么是新动作类型的有效方法?

谢谢!

【问题讨论】:

    标签: c# oop design-patterns enums


    【解决方案1】:

    如果该值表明程序流程发生了变化,您会希望它保留为枚举。只需将数值存储在表格字段中即可。

    如果值不会改变程序流程,那么有一个从数据库中提取潜在值的查找表是一个更好的方法。

    听起来你的属于第一类。此时,您无论如何都必须在添加选项时部署代码,以便应用知道如何处理新选项。

    【讨论】:

    • 谢谢!这是完全有道理的,是的,我的价值观将会并且可能会改变逻辑流程。
    【解决方案2】:

    我也遇到了和你一样的问题,并尝试尽可能多地使用枚举,因为它使可读性更容易一些。

    我使用的方法有些多余,但是我创建了一个查找表并在代码中使用了镜像枚举。仅使用枚举的问题是您将在数据库中保存状态,这些状态令人困惑,必须从文档中辨别出来。仅 DB 方法的问题是代码可读性受到严重阻碍,并且您将拥有完全不可读的语句,例如 if (status == 2) ...

    另外,如果添加了一个枚举项,那么程序流程将会改变,并且无论如何都必须更新代码。这使它变得无关紧要。像 ClickOnce 这样的部署策略使部署几乎变得微不足道。

    【讨论】:

    • 很实用的点我的朋友!感谢您的洞察力!
    【解决方案3】:

    有一个中间立场。查看 log4net.Core.Level(自然是来自 log4net)的一个类示例,它可以让您创建看起来很像枚举但实际上不是的东西。

    here

    【讨论】:

      【解决方案4】:

      在我正在进行的项目中,我们肯定会遇到这个挑战。对我们来说,使用枚举在可读性方面的好处超过了维护,因此我们只是试图找到一种方法来检查自己并在某些内容没有得到正确更新时提出警告。

      我们使用的解决方案是在每次编译后运行单元测试,以根据与该枚举关联的数据库表验证枚举成员及其支持值。

      其中一个单元测试可能如下所示:

      [TestMethod]
      public void SomeLookupTest()
      {
          LookupGetter getter = new LookupGetter();
      
          LookupTester.CompareEnumWithDatabase(
              getter.GetItems(LookupName.Schema__SomeLookup),
              typeof(SomeLookupEnumType)
          );
      }
      

      【讨论】:

      • 我喜欢这个!非常好的工作,感谢您的建议。
      • 不客气。这是我见过的此类问题的更好解决方案之一——可用性与可维护性之间的良好折衷。
      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 2013-10-13
      • 2013-12-31
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      相关资源
      最近更新 更多