私はよく見て、このような表示名または説明を提供するなど、いくつかの基本的なことを行うに取り付けた属性を持つ列挙型を使用しました:"不変のリッチオブジェクトとしての列挙":これは反パターンですか?
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)することができます。
これは、私はこれがアンチパターンと見なされることを認識しています。同時に、私の一部は、があまりにも厳しくなる可能性があると考えています。
そうでなければ列挙型を使用しない場所でこのパターンを使用することは悪い考えですか?これは、メタデータを列挙型の値に関連付けるための素晴らしいパターンです。クラスの代わりにそれほど素晴らしいものではありません。 –
これは言語の「乱用」と見なすことができます。ほとんどの場合、例えば、保証されていないときは常に 'dynamic'を使用しています。 – Kit
正確に言えば(これはコメントですが)、しかし、私は属性に表示されるテキストをエンコードすることに不安を抱いています。一つ目は、「懸念の分離」に大いに違反していると思いますし、別の問題については、それをローカライズする明白な方法はありません。悲しいかな、MSはこのようなことを奨励しているようですので、昼食に出かけるかもしれません。 –