ALL или null с перечислениями? - PullRequest
7 голосов
/ 11 января 2012

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

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

Есть ли причина идти тем или иным путем?

Ответы [ 3 ]

7 голосов
/ 11 января 2012

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

2 голосов
/ 11 января 2012

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

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

2 голосов
/ 11 января 2012

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

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

...