Следует ли заменить статические переменные на перечисления? - PullRequest
13 голосов
/ 29 января 2009

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

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

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

private static int CANCELLATION_LIMIT = 2;

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

У меня вопрос, какую наилучшую практику следует использовать для любого из них?

Ответы [ 7 ]

12 голосов
/ 29 января 2009

return "Это логически набор значений"? «Enum подходит»: «Статическое const в порядке»

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

8 голосов
/ 29 января 2009

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

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

enum OrderState 
{
  pending = 1,
  shipped = 2
}

public IList<Order> GetOrdersInState( OrderState )
{
}

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

Тем не менее, случай, который вы обсуждаете, я думаю, использование enums не является правильным решением. Неправильное использование int, и следует использовать const int.

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

2 голосов
/ 29 января 2009

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

1 голос
/ 29 января 2009

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

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

1 голос
/ 29 января 2009

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

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

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

0 голосов
/ 29 января 2009

Я не знаю, что это анти-паттерн иметь статические переменные в классе (?). Например, класс Color в .Net Framework имеет много статических открытых переменных, таких как Color.Red. Так что с этой точки зрения я бы с тобой согласился.

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

0 голосов
/ 29 января 2009

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

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

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

...