我經常看到和使用枚舉附帶的屬性做一些基本的東西,如提供的顯示名稱或說明:「Enum as immutable rich-object」:這是一種反模式嗎?
public enum Movement {
[DisplayName("Turned Right")]
TurnedRight,
[DisplayName("Turned Left")]
[Description("Execute 90 degree turn to the left")]
TurnedLeft,
// ...
}
併產生了一套擴展的方法來支持的屬性:
public static string GetDisplayName(this Movement movement) { ... }
public static Movement GetNextTurn(this Movement movement, ...) { ... }
遵循此模式,可以將其他現有或自定義屬性應用於字段以執行其他操作。這幾乎是如果枚舉可以作爲簡單枚舉值類型它是,並且與許多領域的更豐富的不可變值對象的工作:
public class Movement
{
public int Value { get; set; } // i.e. the type backing the enum
public string DisplayName { get; set; }
public string Description { get; set; }
public Movement GetNextTurn(...) { ... }
// ...
}
通過這種方式,它可以「旅行」作爲一個簡單的在序列化期間,快速比較等,但行爲可以被「內化」(ala OOP)。
這就是說,我認識到這可能被認爲是反模式。同時我的一部分認爲這很有用,因爲和可能太嚴格了。
你問在你不會使用枚舉的地方使用這種模式是不是一個好主意?將元數據與枚舉值相關聯是一個很好的模式。這不像代替班級那麼棒。 –
它可以被認爲是「濫用」該語言;幾乎就像在不擔保的情況下一直使用「動態」一樣。 – Kit
不完全在點(因此評論),但我對編碼文本顯示在一個屬性 - 或實體類附近的任何地方,對於這個問題的疑慮。首先,我認爲這嚴重違反了「關注點分離」的問題,另一方面,沒有明確的方法將其本地化。唉,MS似乎鼓勵這樣的事情,所以也許我會出去吃午飯。 –