C # Enums vs Списки, управляемые данными - PullRequest
3 голосов
/ 15 ноября 2010

Я пытаюсь найти лучший способ сделать мой дизайн для enum.Допустим, у меня есть класс и enum:

public enum ActionType
{
    Acceptable = 1,
    Unacceptable = 2,
    PendingReview = 3        
}
public class Report
{
    public ActionType Action { get; set; }
}

Допустим, у меня также есть таблица базы данных, в которой хранятся различные типы действий:

Id     Action
1      Acceptable
2      Unacceptable
3      PendingReview

, если я хочу добавить другой типдействие в более поздний день, я должен был бы обновить enum и повторно развернуть сборки.Но мне нравится, как перечисления уменьшают количество ошибок, облегчают чтение кода и гарантируют прямую совместимость.Что такое эффективный способ создания новых типов действий?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 15 ноября 2010

Если значение указывает на изменение в потоке программы, вы хотите, чтобы оно оставалось как перечисление.Просто сохраните числовое значение в поле таблицы.

Если значение не изменяет поток программы, то лучше использовать таблицу поиска, в которой потенциальные значения извлекаются из базы данных.

Звучит так, как будто вы попали в первую категорию.В этот момент вам все равно придется развернуть код при добавлении параметров, чтобы приложение знало, что делать с новыми параметрами.

2 голосов
/ 15 ноября 2010

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

Подход, который я использовал, несколько избыточен, однако я создал таблицу поиска и использовал зеркальное перечисление в коде.Проблема с использованием только перечислений заключается в том, что в БД сохраняются статусы, которые вводят в заблуждение и должны быть обнаружены в документации.Проблема с подходом только к БД состоит в том, что читаемость кода серьезно затруднена, и у вас будут совершенно нечитаемые операторы, такие как if (status == 2) ...

Кроме того, если добавлен элемент enum, то выполнение программыизменить и код должен быть обновлен в любом случае.Это делает его довольно неактуальным.Стратегии развертывания, такие как ClickOnce, делают развертывание почти тривиальным.

2 голосов
/ 15 ноября 2010

Есть золотая середина.Взгляните на log4net.Core.Level (из log4net, естественно), чтобы найти пример класса, который позволяет вам создавать что-то похожее на enum, но не.

Смотрите здесь .

1 голос
/ 16 ноября 2010

У нас определенно есть эта проблема в проекте, над которым я работаю.Для нас преимущество использования перечислений с точки зрения читабельности перевешивало обслуживание, и поэтому мы просто попытались найти способ проверить себя и поднять флаг, когда что-то не обновлялось должным образом.в том, что у нас есть модульные тесты, которые запускаются после каждой компиляции для проверки членов перечисления и их значений поддержки в таблице базы данных, связанной с этим перечислением.1005 *

[TestMethod]
public void SomeLookupTest()
{
    LookupGetter getter = new LookupGetter();

    LookupTester.CompareEnumWithDatabase(
        getter.GetItems(LookupName.Schema__SomeLookup),
        typeof(SomeLookupEnumType)
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...