Есть ли момент, когда Enum может стать слишком раздутым? - PullRequest
2 голосов
/ 05 августа 2009

Я определил Enum как часть объектов модели для приложения ASP.NET MVC.

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
}

Как вы думаете, перечисление становится слишком тяжелым в этот момент?

Было бы лучше разбить элементы enum на, скажем, классы, а затем дать каждому классу атрибуты «Описание» и «Маршрут»?

Ответы [ 3 ]

8 голосов
/ 05 августа 2009

Вы действительно пытаетесь использовать Enum для различения нескольких вариантов объекта Content, не пытаясь создать несколько версий объекта Content.

Хорошая ставка, что поведение вашего приложения будет зависеть от того, какой 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 голосов
/ 05 августа 2009

Лично я считаю, что перечисления должны быть простыми. В тот момент, когда стало больше, чем просто мнемоника, я бы рассмотрел «Замена кода типа Фаулером на шаблон состояния / стратегии».

Итак, да, я бы перешел в класс.

1 голос
/ 05 августа 2009

Вы можете комбинировать свои атрибуты, чтобы они выглядели так:

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

если вы думаете, что синтаксис выглядит лучше. Но я согласен с Митчем, они могут быть лучше, чем классы, особенно если есть шанс, что вам может понадобиться добавить еще один атрибут в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...