Почему маркеры позиции, как первый или последний, в Перечислении считаются плохой практикой?

Согласно разделу Best Practices документации MSDN для класса System.Enum:

Не определяйте значение перечисления исключительно для отражения состояния самого перечисления. Например, не определяйте перечисляемую константу, которая просто отмечает конец перечисления. Если вам нужно определить последнее значение перечисления, проверьте это значение явно. Кроме того, вы можете выполнить проверку диапазона для первой и последней перечисляемой константы, если все значения в диапазоне допустимы.

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

public enum DrawOrder
{
    VeryBottom = 0,
    Bottom = 1,
    Middle = 2,
    Top = 3,
    Lowest = VeryBottom, //marks a position in the enum
    Highest = Top, //marks a position in the enum
}

Почему это считается плохой практикой?

4 ответа

Решение

Потому что эти значения могут меняться со временем. Предположим, вы установили свойство (используя ваш пример) DrawOrder.Highest и сохраните его в своей базе данных / документе / другом-приемнике данных.

Время проходит.

Изменения кода.

Ваш DrawOrder enum получил еще несколько значений, и значение в ваших постоянных данных больше не равно DrawOrder.Highest, Это равно только тому, что когда-либо DrawOrder.Highest сопоставлены в то время, когда данные были сохранены.

Считаете ли вы, что эта ситуация может вызвать проблемы?

Потому что, если вы добавите VeryTop = 4 к перечислению, вы должны помнить, чтобы обновить Highest,

Если вам не удастся сделать это, весь ад вырвется на свободу. Удивительно легко забыть об этом через некоторое время (несколько месяцев).

Я не уверен, что согласен, что это плохая практика; это зависит.

Code Complete Стив Макконнелл использует эту конструкцию. (Эта книга начинает показывать свой возраст на языках, которые она использует, поэтому эта техника могла быть хорошей практикой.)

Недостатком является то, что при обновлении списка перечисления нужно помнить следующее: обновите значение Highest и / или Lowest, если нужно. Если вы забудете, вы внесете ошибки.

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

Я бы сказал, что это плохая идея, если вы сохраняете Enum и есть вероятность, что enum может измениться. Если вы не сохраняете это, или нет никаких шансов на изменение enum, то это, вероятно, хорошо в большинстве случаев. Но тогда весь смысл маркера в том, что значение может измениться... так что это не имеет никакого смысла.

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

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

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

Другие вопросы по тегам