Каков предпочтительный метод для обработки неожиданных значений перечисления? - PullRequest
16 голосов
/ 06 марта 2009

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

Например:

enum Mood { Happy, Sad }

public void PrintMood(Mood mood)
{
    if (!Enum.IsDefined(typeof(Mood), mood))
    {
        throw new ArgumentOutOfRangeException("mood");
    }

    switch (mood)
    {
        case Happy: Console.WriteLine("I am happy"); break;
        case Sad:   Console.WriteLine("I am sad"); break;
        default: // what should we do here?
    }

Какой метод обработки default является предпочтительным?

  • Оставить комментарий как // can never happen
  • Debug.Fail() (или Debug.Assert(false))
  • throw new NotImplementedException() (или любое другое исключение)
  • Каким-то другим способом, о котором я не думал

Ответы [ 12 ]

0 голосов
/ 06 марта 2009

Вызывающая функция несет ответственность за предоставление правильного ввода, и косвенно все, что не входит в enum, является недействительным (кажется, это подразумевает прагматический программист). Тем не менее, это означает, что каждый раз, когда вы меняете свое перечисление, вы должны изменить ВСЕ код, который принимает его как ввод (и НЕКОТОРЫЙ код, который выдает его как вывод). Но это, вероятно, так или иначе. Если у вас есть часто встречающееся перечисление, вам, вероятно, следует использовать что-то иное, чем перечисление, учитывая, что перечисления обычно являются сущностями времени компиляции.

0 голосов
/ 06 марта 2009

Назовите это мнением или предпочтением, но идея перечисления заключается в том, что он представляет полный список возможных значений. Если в коде передается «неожиданное значение», тогда перечисление (или цель за перечислением) не обновляется. Мое личное предпочтение заключается в том, что каждое перечисление содержит заданное по умолчанию значение Undefined. Учитывая, что перечисление является определенным списком, оно никогда не должно устаревать с вашим потребляющим кодом.

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

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