2009-08-05 24 views
2

私は、ASP.NET MVCアプリケーションのモデルオブジェクトの一部としてEnumを定義しました。Enumが肥大化する可能性がありますか?

は、列挙型を「contenttypesの」と呼ばれると、このようになりますされています

public enum ContentTypes 
{ 
    [Description("News story")] 
    NewsStory = 1, 

    [Description("Article")] 
    Article = 2 
} 

は今、私は「ルート」と呼ばれる列挙型の項目に属性の別のセットを追加する予定です。この属性を使用すると、各ContentTypeを処理できるURLにマップできます。

だから、この後、私はあるでしょう:あなたが列挙型は、この時点では重すぎる重量を取得している

public enum ContentTypes 
{ 
    [Description("News story")] 
    [Route("news/item/{URLName}")] 
    NewsStory = 1, 

    [Description("Article")] 
    [Route("article/item/{URLName}")] 
    Article = 2 
} 

と思いますか?

列挙型アイテムを、例えばクラスに分割し、各クラスに 'Description'と 'Route'属性を与える方がよいでしょうか?

答えて

8

Contentオブジェクトの複数のバリエーションを区別するために、実際に複数のバージョンのContentオブジェクトを作成することなく、Enumを実際に使用しようとしています。

アプリケーションの動作は、Enumが設定されているものによって異なることがあります。これは、保守性の観点から狂気あなたを駆動する

public Content 
{ 
    private ContentTypes contentType; 
    public string ToString() 
    { 
     switch (contentType) 
     ... 
    } 
} 

:たとえば次のようなものを持っているかもしれません。任意のコンテンツに共通していると定義し、本当に空想を取得し(デザイン・バイ・契約アプローチを使用する)ために今

public Content 
{ 
    public abstract string ToString(); 
} 

public NewsStory : Content 
{ 
    public override string ToString() { /* Appropriate formatting of output */ } 
} 

public Article : Content 
{ 
    public override string ToString() { /* Appropriate formatting of output */ } 
} 

、物事のすべてを考慮してください。あなたが後にしている動作を取得するために、継承を使用して代わりに考えてみましょうインタフェース、例えばIContent。そうした場合、次のようなことができます:

List<IContent> myContent; 
foreach (IContent ic in myContent) ic.ToString(); 
2

個人的には、列挙型は単純に保たれるべきだと私は考えます。ちょうどニーモニック以上になる時点で、私はFowlerの "State/Strategy Patternとタイプコードの入れ替え"を考えます。

はい、私はクラスに変換します。

1

それがより次のようになりますので、あなたの属性を組み合わせることができます:あなたは構文が良く見えると思えば

[Description("x"), Route("y")] 

。しかし、私はMitchに同意します。クラスとしてもっとうまくいくかもしれません。特に、今後別の属性を追加する必要がある場合は特にそうです。

関連する問題