2012-01-11 3 views
7

Я заметил, что делал это непоследовательно в рамках одного проекта. В некоторых местах у меня будет перечисление с опцией ALL, а в других я буду перечислять как нулевой тип с нулевым значением, указывающим все (или без фильтра).ВСЕ или null с перечислениями?

Я заметил это, когда у меня было написать что-то вроде if (Region != null && Region != Regions.ALL).

Есть ли причина идти так или иначе?

+4

Имена перечислений должны быть UpperCamelCase – SLaks

+0

Я чувствую, что это проблема несоответствия объектно-реляционного импеданса. В стороне приложения имеет смысл иметь такие опции, как «Все», «Все регионы Западного побережья» и «Все регионы Восточного побережья». Тем не менее, я часто использую enum casted to int непосредственно как SqlParameter. В этих методах мне нужно будет проверить каждый из этих экземпляров и преобразовать их в правильный SQL. (Вместо «и region = 1» мне понадобится »и region in (2, 4, 5)»). К сожалению, SqlParameters также плохо работают со списками. – Serinus

ответ

2

Где Перечисление, что вам нужно указать или «Все» или «Null» типа, я обычно хожу с атрибутом Flag и использовать побитовый & и |. Это гораздо более гибкое решение.

Что касается создания типа NULL или наличия одного из вариантов «Все», я думаю, если это имеет смысл для вас, то я не вижу проблем с ним. Я просто предпочитаю использовать флаги.

+0

Член 'All' полезен для' [Flags] 'enums также ... нет правила, что все флаги должны быть взаимно исключающими. –

+0

@BenVoigt - полностью. Когда у меня есть такие частые комбинации, я сделаю «Все = 0x111» или что-то еще. Вы также можете сделать что-то вроде 'PizzaAndBreadsticks = 0x101', если это частая комбо, для которой требуется четкое определение. –

7

Использование Regions.All является более явным до тех пор, пока не передается значение. Вы можете «присвоить» это значение null, и с ним все будет в порядке. Однако, читатели вашей программы должны будут дешифровать это значение из-за того, как вы используете значение перечисления null или читаете свои комментарии. Regions.All, с другой стороны, самодокументируется и не требует пояснений.

2

Как правило, мы используем null для обозначения «неуказанного» или «несуществующего» или «неприменимого». Таким образом, в случае фильтра имеет смысл разрешить null, потому что это означает «отсутствие фильтрации».

Кроме того, перечисление называется Regions, вероятно, имеет такие значения, как Northeast, Southeast, Midwest, Southwest и West. Теперь, пожалуйста, поправьте меня, если я ошибаюсь, но я не думаю, что в США есть какой-то регион под названием «Все». Во время моего многолетнего пребывания там я услышал, как погодник на телевидении говорил о погоде на Западе, о погоде на юго-востоке и т. Д., Но никогда не о погоде в каком-то месте под названием «Все». Поэтому я склонен полагать, что такого региона нет. Поэтому, в том числе «Все» в перечислении регионов, это взломать. Внезапно перемычка Regions не касается регионов; вместо этого речь идет о регионах и/или их фильтрации. Сдвиги в значении такого рода - это то, о чем нужно знать в программировании и, как правило, избегать.

+0

Я не согласен с присвоением null переменной перечисления. Он не принимает ничего, чтобы создать значение 'None' или' All', которое прекрасно описывает, что означает «null» в этом контексте. –

+0

@ Hand-E-Food Да, конечно, ничего не требуется. И тогда у вас есть список объектов регионального менеджера, каждый из которых имеет поле «регион», и совершенно верно иметь регионального менеджера, который управляет регионом «Нет» или регионом «Любой».Поздравляем, вы только что изнасиловали фундаментальный принцип целостности данных. –

+0

Теперь я вижу вашу точку зрения, что добавление неотъемлемых членов к тому, что должно быть дискретным перечислением, непоследовательно. Что-то не подходит мне, используя «нуль», но это заставило меня задуматься. –

Смежные вопросы