2010-08-05 90 views
1

可能重複:
How to use Enum with aditional options (All, None)特殊成員枚舉:全部和無

有些主觀。

我有一個枚舉

public enum Faction { 
    Aliance, 
    Horde 
} 

,因爲我們都知道代碼密切建模它應用於商業領域是「總是更好」。 在一個給定的領域有兩個派別,這兩個派別在上面的集合中列舉。

問:什麼是支持和反對,包括特殊的成員,如參數:無,所有在上面的enum

就我個人而言,我認爲這兩個人不屬於那裏,因爲沒有像All和None這樣的派系。同樣使用flags-enum是不合適的。

的解決方法是讓另一枚舉,將與一個派系,隸屬關係模型在這種情況下,它相應地有了如所有元素,並在那裏無。

問題2:爲了模型的正義,我應該創建FactionAffiliation枚舉嗎?還是應該讓我自己額外打字並查看派系enum,好像它 FactionAffiliation?

編輯:複製的How to use Enum with additional options (All, None)

+0

http://stackoverflow.com/questions/2228634/how-to-use-enum-with-aditional-options-all-none的可能的複製。 – Trillian 2010-08-05 14:17:36

回答

1

我看使用從更實際的看法,而不是從純面向對象的設計。

是否有地方可以使用Faction/FactionAffliance,其中All or None將不被允許;你絕對必須正式宣佈一個陣營?

如果是這樣,那麼你應該使用兩個單獨的枚舉。

如果不是 - 如果在任何地方使用派系,「全部」和「無」是可行的選項,那麼只用一個,然後隨心所欲地調用它。

+0

很好的答案,+1。幾個現實的例子: model.CharacterFaction =(Faction [])Enum.GetValues(typeof(Faction)); character.Faction = DB.GetCharFaction(character => character.Id == cId); – 2010-08-05 14:11:14

2

我會避免所有和無。給定一個人,說:這個人可能屬於一個派系。所以要回答這個問題:「這個人在哪個派系?」我們可以簡單地說(比如說)閱讀Person的派系字段。但是對於All的特例,屬於(比如說)部落的人也屬於All - 儘管那個人的派系領域!= ALL。這改變了IN的含義,導致了複雜的代碼和微妙的錯誤風險。

+0

很好的答案。你將如何重寫'FindByFaction(Faction.Any)'? – 2010-08-05 14:18:20

+0

@ user93422:那不就是一個'FindAll()'嗎? – Svish 2010-08-05 14:36:32

+0

@ user93422:'的foreach(人員P:人),如果(p.faction!= NULL)set.add(P);'或'的foreach(派F:派系)set.addAll(FindByFaction(F));' – 2010-08-05 15:01:19

4

AllNone在處理打算用作位域的枚舉時(應該標記爲[Flags])通常很有意義。在這種情況下,你應該給你的第一個標誌值爲1,你的第二個值爲2.然後,None可以採用默認值0並且表示沒有派系從屬關係。 All成員是可選的,因爲它可以通過按位或在其他兩個標誌上形成。標誌枚舉通常具有複數名稱,如FactionAffiliations

如果你不處理的標誌,它通常最好不要包括None值。你的大部分程序不需要這個,所以這是一個特殊的情況,你不需要測試。如果您需要此值None,請考慮使用您的枚舉的空值版本:Faction?。一個可爲空的枚舉更好地表示沒有一個值比一個None枚舉。

我假設你的代碼是C#,但大多數建議應該在其他語言中舉行。

0

我要說的是,你的實現應該改進。
您正在使用枚舉來建模一個簡單的布爾狀態。
獲得完全擺脫枚舉,並用布爾屬性替換它:「IsAlliance」或「IsHorde」爲準。 枚舉是多種可能性的模型,並且您沒有多種可能性。

+0

枚舉大大提高了使用布爾值的代碼可讀性。 'Faction.Horde'比'false'提供更多的語義信息,特別是當它是方法的第三個參數時。 – Trillian 2010-08-05 15:19:19

+0

是的,但我們不是在討論一些鬆散的信息;我們正在談論有關其他對象的狀態信息。某些特定的事物具有以下兩種狀態值之一:「IsHorde」或「IsAlliance」,當與事物脫離時,狀態值是毫無意義的。因此,一個屬性。對象屬性'this.IsHorde = true'比'this.Faction == Faction.Horde'更簡單,因爲它的字符,操作和概念更少。額外的複雜性是什麼都不買。無論如何,IMO。 8) – Task 2010-08-05 15:30:43