2009-08-05 8 views
2

J'ai défini une énumération en tant qu'élément des objets de modèle pour une application ASP.NET MVC.Y a-t-il un point où un Enum peut devenir trop gonflé?

Le Enum est appelé « ContentTypes » et ressemble à quelque chose comme ceci:

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

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

Maintenant, je prévois d'ajouter un autre ensemble d'attributs aux éléments de ENUM appelés « Route ». Cet attribut me permettra de mapper chaque ContentType à une URL qui peut le gérer.

Donc, après cela, je vais devoir:

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

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

Pensez-vous que le ENUM devient trop lourd poids à ce stade? Serait-il préférable de diviser les éléments d'énumération en classes, par exemple, puis de donner à chaque classe un attribut 'Description' et 'Route'?

Répondre

8

Vous tentez vraiment d'utiliser Enum pour différencier plusieurs variantes de l'objet Content, sans avoir à créer réellement plusieurs versions de l'objet Content.

Il est fort à parier que le comportement de votre application dépendra de la configuration de Enum. Par exemple vous pourriez avoir quelque chose comme:

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

Cela vous rendra fou du point de vue de la maintenabilité. Pensez à au lieu d'utiliser l'héritage pour obtenir le comportement que vous êtes après:

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

Maintenant pour vraiment de fantaisie (et utiliser l'approche de conception par contrat), pensez à toutes les choses que tout contenu aurait en commun et définir une interface, par exemple IContent. Si vous faites cela, vous pouvez faire des choses comme:

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

Personnellement, je pense que les Enums devraient rester simples. Au point où il y a plus qu'un simple moyen mnémotechnique, je considérerais le "Remplacer le code de type avec le modèle d'état/stratégie" de Fowler.

Donc, oui, je voudrais convertir en classe.

1

Vous pouvez combiner vos attributs il ressemblerait plus à ceci:

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

si vous pensez que la syntaxe semble mieux. Mais je suis d'accord avec Mitch, ceux-ci pourraient faire mieux en tant que classes, particulièrement s'il y a une chance que vous deviez ajouter un autre attribut dans le futur.

Questions connexes