Как избежать использования Enums? - PullRequest
11 голосов
/ 15 февраля 2010

До тех пор, пока не задали вопрос здесь, я никогда не считал (перечисления) "плохой вещью". Для тех, кто считает, что они не являются лучшей практикой, каковы некоторые подходы / шаблоны, позволяющие избежать их использования в коде?

Edit:

public Enum SomeStatus
 Approved = 1
 Denied = 2
 Pending =3
end Enum

Ответы [ 5 ]

26 голосов
/ 15 февраля 2010

Проблема с перечислениями описана в Рефакторинге Фаулера , где он считается запахом кода . Это не имеет ничего общего с безопасностью типов, а скорее заставляет вас разбрасывать switch операторов по всему коду, нарушая, таким образом, DRY Принцип .

Шаблон State - лучшая модель с той же структурой, поскольку она позволяет реализовывать и изменять логику, связанную с одним и тем же состоянием в одном и том же классе. Это также увеличивает сцепление и уменьшает сцепление классов.

9 голосов
/ 15 февраля 2010

Я думаю, использование enum - это хорошо. Обеспечивает надежную безопасность типов.

Иногда они имеют некоторые недостатки, но обычно это связано с ситуациями, когда каждый возможный вариант заранее не известен. Если у вас есть фиксированный набор опций, таких как ваш пример, тогда сильные типизированные перечисления - это хорошо, и их не следует избегать.

6 голосов
/ 15 февраля 2010

Мне нравятся черепахи класса enums .

2 голосов
/ 15 февраля 2010

Основной смысл перечисления заключается в том, что оно определено только в одном месте (нормализация в терминах базы данных). Если это перечисление является законной частью класса, который вы пишете, продолжайте.

В противном случае, особенно если вы обнаружите, что объявляете это более одного раза, переосмыслите, для чего ваше перечисление. Это на самом деле несет данные? Будет ли достаточно значений, чтобы рассмотреть возможность хранения возможностей в базе данных?

1 голос
/ 15 февраля 2010

Мне нравятся перечисления для размещения простых в использовании и понятных имен в связанных наборах значений. Мне просто не нравится реализация c #. Используя ваш пример enum:

SomeStatus status = 17;

Это компилируется и запускается без жалоб, хотя 17 выходит за пределы.

Delphi имеет лучшие перечисления (или, по крайней мере, раньше - прошло много лет с тех пор, как я его использовал)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...