C#枚举 vs 数据驱动列表

4

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

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

如果我在以后的某一天想添加另一种类型的操作,我必须更新枚举并重新部署组件。但我喜欢枚举减少错误、使代码更易读和保证向前兼容的方式。有什么有效的方法来处理新的操作类型吗?
谢谢!
4个回答

6
如果该值表示程序流程的变化,您需要将其保留为枚举类型。只需将数值存储在表字段中即可。
如果该值不会改变程序流程,则最好从数据库中提取潜在值并创建查找表。
听起来你的情况属于第一类。这时,您必须在添加选项时部署代码,以便应用程序知道如何处理新选项。

谢谢!这很有道理,是的,我的值将会并且可能改变逻辑的流程。 - adminJaxon

2

有一个折中方案。看一下log4net.Core.Level(自然来自log4net)的例子,它允许您创建类似枚举但不是枚举的东西。

在这里查看这里


2
我也曾经遇到过和你一样的问题,尽可能地使用枚举类型可以使代码更易读。我采用的方法有点冗余,但是我创建了一个查找表,并在代码中使用了镜像枚举。仅仅使用枚举的问题在于,数据库中保存的状态会变得混乱,需要从文档中区分。仅仅使用数据库的方法会严重影响代码的可读性,例如 if (status == 2) ... 就很难读懂。
此外,如果添加了一个枚举项,程序流程将会改变,代码必须进行更新。这使得它几乎无关紧要。部署策略如 ClickOnce 可以使部署变得非常简单。

非常实用的观点,我的朋友!感谢你的洞察力! - adminJaxon

1

我們正在進行的項目中確實存在這個挑戰。對我們來說,使用枚舉型別在可讀性方面的好處超過了維護方面的好處,因此我們只是試圖找到一種方法,在某些沒有被正確更新的情況下檢查自己並引發警報。

我們使用的解決方案是,我們有單元測試在每次編譯後運行,驗證枚舉成員及其背景值與與該枚舉相關聯的數據庫表的一致性。

其中一個單元測試可能如下所示:

[TestMethod]
public void SomeLookupTest()
{
    LookupGetter getter = new LookupGetter();

    LookupTester.CompareEnumWithDatabase(
        getter.GetItems(LookupName.Schema__SomeLookup),
        typeof(SomeLookupEnumType)
    );
}

我喜欢这个!非常好的工作,谢谢你的建议。 - adminJaxon
不客气。这是我见过的解决这种问题的更好方案之一——在可用性与可维护性之间做出了很好的妥协。 - Shibumi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接