Как избегать использования Перечислений?

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

Править:

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

11
задан Community 23 May 2017 в 12:00
поделиться

5 ответов

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

6
ответ дан 3 December 2019 в 01:08
поделиться

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

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

27
ответ дан 3 December 2019 в 01:08
поделиться

Нет возможности «вводить» один exe в другой. Это действие даже не определено, так как у вас нет управления внутренними элементами выполнения, которые вы делаете при вставке объектов друг в друга.

Наиболее близким вариантом для exe-файлов является piping, где вы можете перенаправить вывод одного exe-файла на вход другого:

one.exe | two.exe
-121--2471826-

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

SomeStatus status = 17;

Это компилирует и работает без претензий, хотя 17 - это выход за границы.

Дельфы имеют лучшие перечисления (или, по крайней мере, раньше - это были годы с тех пор, как я его использовал)

-121--2880600-

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

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

2
ответ дан 3 December 2019 в 01:08
поделиться

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

SomeStatus status = 17;

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

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

1
ответ дан 3 December 2019 в 01:08
поделиться

Я считаю, что использование перечисления - это хорошо. Это обеспечивает строгую безопасность типов.

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

9
ответ дан 3 December 2019 в 01:08
поделиться