2009-08-05 2 views
2

Ich habe ein Enum als Teil der Modellobjekte für eine ASP.NET MVC-Anwendung definiert.Gibt es einen Punkt, an dem ein Enum zu aufgebläht werden kann?

ENUM ist ‚Content‘ und sieht in etwa so genannt:

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

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

Jetzt genannt ‚Route‘ Ich plane, einen anderen Satz von Attributen zu den Enum-Elemente hinzuzufügen. Dieses Attribut ermöglicht es mir, jeden ContentType einer URL zuzuordnen, die damit umgehen kann.

danach Also werde ich habe:

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

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

Glauben Sie, die Enum an dieser Stelle zu schwer Gewicht bekommt?

Wäre es besser, die Enum-Elemente in Klassen zu zerlegen und dann jeder Klasse ein Attribut 'Description' und 'Route' zu geben?

Antwort

8

Sie versuchen wirklich, die Enumeration zu verwenden, um mehrere Variationen des Inhaltsobjekts zu unterscheiden, ohne sich die Mühe zu machen, mehrere Versionen des Inhaltsobjekts zu erstellen.

Es ist eine gute Wette, dass das Verhalten Ihrer Anwendung davon abhängt, auf was die Enum eingestellt ist. Zum Beispiel könnten Sie etwas wie haben:

Dies wird Sie verrückt aus einer Wartbarkeit Perspektive. Betrachten wir stattdessen Vererbung mit dem Verhalten, das Sie zu erhalten, sind nach:

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 */ } 
} 

nun wirklich Lust zu bekommen (und die Design-by-Contract-Ansatz), sollten alle die Dinge, die jeder Inhalt gemeinsam haben würde und definieren eine Schnittstelle, z IContent. Wenn Sie das tun, können Sie Folgendes tun:

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

Ich persönlich denke, Enums sollte einfach gehalten werden. An dem Punkt, an dem es mehr als nur eine Gedächtnisstütze wird, würde ich Fowlers "Replace Type Code mit State/Strategy Pattern" berücksichtigen.

Also, ja, ich würde in eine Klasse konvertieren.

1

Sie können Ihre Attribute kombinieren, so dass es eher wie dieses aussehen:

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

wenn Sie denken, die Syntax besser aussieht. Aber ich stimme mit Mitch überein, diese könnten besser als Klassen funktionieren, besonders wenn es eine Chance gibt, dass Sie in Zukunft ein weiteres Attribut hinzufügen müssen.

Verwandte Themen