Должны ли статические переменные заменяться перечислениями?

Итак, я искал какой-то код, который был проверен, и я все озадачился:

// Amount of days before cancellation can't be done
enum Cancellation { Limit = 2 };

Спросив парня, который его проверил, он утверждал, что гораздо лучше использовать перечисления вместо статических переменных, вместо этого:

private static int CANCELLATION_LIMIT = 2;

Итак, мы начали спорить. Мой аргумент заключался в том, что он использовал перечисление как способ хранения значений (он будет разбит, если будет два символа перечисления с одинаковым значением). Он утверждал, что антипаттерн имеет статические переменные в классе.

Мой вопрос в том, что наилучшая практика должна быть использована для:?

Ответ 1

Набираются перечисления.

То есть, если у вас есть метод, в котором вы должны передать определенное "состояние" методу, например, вы можете передавать только "действительные" аргументы. Например:

enum OrderState 
{
  pending = 1,
  shipped = 2
}

public IList<Order> GetOrdersInState( OrderState )
{
}

Это хороший пример - использование перечислений. Когда OrderState является int, для которого вы создаете 2 const int, вы не имеете никаких ограничений и можете передавать недопустимые значения. Компилятор не будет жаловаться.

Однако, случай, который вы поднимаете, я думаю, что использование перечислений не является допустимым решением. Это неправильное использование использования int, и следует использовать константу int.

Перечисления хороши, но их следует использовать там, где они должны использоваться. Они не являются предпочтительным инструментом в любой ситуации. Наличие const или static var в этом случае не является антипаттерном.

Ответ 2

return "Является ли он логически набором значений"? "Enum подходит": "Static const is fine"

(Я большой поклонник логически последовательного)

Ответ 3

Нет, как вы определяете статические строковые переменные или десятичные значения в перечислении?

Ответ 4

Я не думаю, что CANELLATION_LIMIT звучит как перечисление, которое обычно представляет собой набор вариантов.

Для чего-то другого, если это был const, то возможно... но в настоящее время это изменчивое поле?

Обратите внимание, что перечисления ограничены целыми типами, поэтому его нельзя использовать для float, string и т.д.

Ответ 5

Для неизменяемых значений, которые должны быть уникальными, перечисления - это путь. Вопрос просить прост: должен ли объект хранить само значение, даже статически? Во многих случаях, например, при описании ошибок или действий, ответ отрицательный. Помните, что перечисления родились как замена #define: он связывает типичные значения с идентификаторами и предоставляет тип, он фактически не говорит "хранить эту константу здесь".

Я предполагаю, что вы на самом деле ничего не хотите хранить, но предоставляете такие типичные значения. static const members полезны только тогда, когда вы собираетесь использовать их как таковые, например, если вам нужно передать их по ссылке на метод.

Ответ 6

Я думаю, что вы должны использовать перечисления, если у вас есть набор значений, напрямую связанных.

Что-то вроде: enum Status {Open = 1, Closed = 2, Waiting = 3};

Для всего остального я бы сказал, что статические переменные - это путь.

Ответ 7

Я не знаю, что анти-шаблон имеет статические переменные в классе (?). Например, класс Color в структуре .Net имеет множество статических общедоступных переменных, таких как Color.Red. Итак, с этой точки зрения, я согласен с вами.

Однако может быть компромисс: используйте private const CANCELLATION_LIMIT = 2; и оба из вас должны быть счастливы. Для него не будет глобальной переменной для класса (?), Поскольку константы будут заменены компилятором, и вы получите одну точку смены с ясным именем.