Является ли хорошей практикой использование enum как int? - PullRequest
7 голосов
/ 11 февраля 2011

Итак, у меня есть переменная "состояние" в классе. Я хочу объявить его как целое число, чтобы сохранить некоторые операторы if.

int state;

Один из способов сделать это - объявить состояние enum {One = 0, Two = 1, Three = 3}, а затем в операторе switch это будет:

switch (state)
{
case One:
    dosomething();
    break;
case Two:
    dosomething();
    break;
case Three:
    dosomething();
    break;
}

Итак, это хорошая практика - использовать enum как этот? Есть ли лучший способ сделать это?

Спасибо!

Ответы [ 3 ]

12 голосов
/ 11 февраля 2011

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

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

Хотя, как указал @James McNellis, называть ваши перечисления как "1,2,3,4" - плохая идея, поскольку она не отражает того, что на самом деле делает.

Но я подозреваю, что это был только пример с вашей стороны.

Рассмотрим это вместо:

switch (operationState)
{
    case Waiting:
        dosomething();
        break;
    case Running:
        dosomething();
        break;
    case Ended:
        dosomething();
        break;
}

В этом случае «операция»: «Ожидание», «Выполнение» или «Завершено», что делает ее читабельной и понятной. Теперь рассмотрим путь без перечислений:

switch (iState)
{
    case 997:
        dosomething();
        break;
    case 998:
        dosomething();
        break;
    case 999:
        dosomething();
        break;
}

Что 997 говорит вам? Абсолютно Ничего ! Используйте читаемый и понятный код, чтобы облегчить жизнь всем.

7 голосов
/ 11 февраля 2011

Весь код, который у вас есть, работает так же хорошо, если у вас state объявлено как State, а не int.Вы можете использовать его в операторе switch, назначить ему новые значения, сделать с ним сравнение и т. Д. Использование int здесь на самом деле не дает никаких преимуществ, поскольку по сути это «лежит в исходном коде».Ваша переменная не является целым числом.Не имеет смысла умножать или делить его на значение или сдвигать бит влево или вправо.Пометив переменную как State, вы поймете, что у вас действительно одно из нескольких значений, и не допустите некоторые из перечисленных выше ошибок.Кроме того, это дает компилятору больше шансов диагностировать такие вещи:

state = 137; // Error!  Can't do this assignment without a cast.

В общем, используйте систему типов в своих интересах.Если это int, сделайте это int.Если это перечислимый тип, сделайте его перечислимым типом.

0 голосов
/ 11 февраля 2011

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

Так что нет причин не использовать перечисления!

...