2010-11-15 56 views
3

我想弄清楚關於我的枚舉設計的最佳方法。比方說,我有一個類和枚舉:C#枚舉與數據驅動列表

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 

,如果我想在以後添加其他類型的動作那麼我將不得不更新枚舉並重新部署程序集。但我喜歡枚舉減少錯誤的方式,使代碼更易於閱讀並保證向前兼容性。什麼是適應新的動作類型的有效方式?

謝謝!

回答

2

我也遇到過和你一樣的問題,並試圖儘可能多地使用枚舉,因爲它使得可讀性更容易一些。

我使用的方法有點多餘,但是我創建了一個查找表並在代碼中使用了鏡像枚舉。僅使用枚舉的問題是,您將在DB中保存狀態,這些狀態令人困惑,必須從文檔中辨別出來。只有數據庫的方法的問題是代碼的可讀性受到嚴重阻礙,並且你將會有像if(status == 2)這樣的完全不可讀的語句...

另外,如果添加了枚舉項,那麼程序流將改變,代碼將不得不被更新。這使得它非常無關緊要。像ClickOnce這樣的部署策略使得部署幾乎是微不足道的。

+0

非常實用點我的朋友!感謝您的洞察! – adminJaxon 2010-11-15 19:45:14

5

如果該值指示程序流的變化,您將希望它保持爲枚舉。只需將數值存儲在表格字段中即可。

如果該值不會改變程序流,那麼有一個查找表,其中可能的值從數據庫中提取出來是一種更好的方式。

聽起來像你的屬於第一類。無論如何,在添加選項時,您必須部署代碼才能讓應用知道如何處理新選項。

+0

謝謝!這非常有道理,是的,我的價值觀會改變邏輯流程。 – adminJaxon 2010-11-15 19:46:18

2

有一箇中間地帶。看一看log4net.Core.Level(自然是log4net)的一個例子,它允許你創建類似於枚舉的東西,但不是。

查看here

1

在我正在進行的項目中,我們絕對有這個挑戰。對於我們來說,在可讀性方面使用枚舉的好處超過了維護,所以我們試圖找到一種方法來檢查自己,並在沒有正確更新的時候舉起一面旗幟。

我們使用的解決方案是,我們在每次編譯後都運行單元測試,以驗證枚舉的成員及其與該枚舉關聯的數據庫表的支持值。

其中一個單元測試的可能是這樣的:

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

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

我喜歡這個!非常好的工作,並感謝你的建議。 – adminJaxon 2010-11-16 21:42:16

+0

不客氣。對於我所見過的這類問題來說,這是更好的解決方案之一 - 可用性與可維護性之間的妥協。 – Shibumi 2010-11-22 23:10:46