Подтвердить что ты не робот

Должны ли мы всегда поддерживать полиморфизм над перечислениями?

После просмотра: Чистые кодовые разговоры - наследование, полиморфизм и тестирование

Я проверил свой код и заметил, что несколько операторов switch могут быть реорганизованы в полиморфизм, но я также заметил, что я использовал только операторы switch с перечислениями. Означает ли это, что перечисления являются "злыми" в OO-дизайне и должны быть устранены с помощью полиморфизма?

4b9b3361

Ответ 1

Это не то, что перечисления являются злыми, он переключает утверждения. Там долго обсуждалось это в С++ FAQ Book, но суть такова: за исключением ограниченных областей - например, интерпретация данных поступающий из регистра на устройстве - большой раскладной гребень предполагает, что вы используете данные, чтобы различать подтипы. Вместо этого вам следует просто использовать подтипы, получить помощь компилятора, чтобы он был прав, а также означает, что компилятор автоматически добавит новые случаи, когда вы (неизбежно) меняете множество случаев.

Ответ 2

Прежде всего, у Java на самом деле есть большие перечисления, которые можно использовать полиморфно. Я не программист на Java, поэтому кто-то еще может дать хороший пример (я не могу). Кроме того, считайте, что полиморфизм часто просто избыточный. Я также только что видел разговор, и это здорово, но в нем содержатся только рекомендации, нет серебряной пули.

Это особенно не верно, что все операторы switch могут быть заменены. Государственные машины на самом деле являются одним из случаев, когда перечисления имеют большой смысл. Я много использую государственные машины в разборе. Конечно, это можно сделать с помощью шаблона проектирования и полиморфизма классов. Но он намного больше кода, он выполняет ту же работу, только медленнее, это не более читаемый, а это решение, которое требуется только в одном месте, без утилизации кода. Использование подкласса здесь просто не имеет преимуществ.

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

EDIT: Я замечаю, что это может вызвать полемику. Конечно, есть много хороших решений, которые инкапсулируют синтаксический анализ, от регулярных выражений до фреймов генераторов парсеров, таких как Antlr. Ничего плохого в них и во всех, кроме тривиальных случаях, это лучшее решение. Тем не менее, я много работаю с низкоуровневым кодом (не в Java, очевидно), где регулярные выражения не поддерживаются, а генераторы парсеров также несут накладные расходы.

Ответ 3

class Sunday extends DayOfWeek {}
class Monday extends DayOfWeek {}
class Tuesday extends DayOfWeek {}
class Wednesday extends DayOfWeek {}
class Thursday extends DayOfWeek {}
class Friday extends DayOfWeek {}
class Saturday extends DayOfWeek {}

Перечисления в порядке.

Ответ 4

Я стесняюсь называть зло. Это вопрос "Как тяжело вы хотите это сделать".

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

Мой классический опыт - это компилятор, который я написал для класса несколько лет назад. У моего соседа по комнате был один класс со мной, и мы подошли к нему двумя разными способами. Я принял подход с тяжелым ОО, полный полимофизма. Он взял подход с сильным С, используя перечисления и союзы. Его код был ~ 1/2 размером моего LOC-мудрый, его код был быстрее для компилятора, и его код работал. Его код был гибким, потому что он не был перенастроен. Это был ценный урок для меня в разработке программного обеспечения.

Ответ 5

"Означает ли это, что перечисления являются" злыми "в OO-дизайне и должны быть устранены с помощью полиморфизма?"

Обычно.

Конструкции switch/enum могут быть любыми из нескольких полиморфных структур: Состояние и Стратегия - это две распространенные проблемы, которые чаще всего возникают.

Ответ 6

Я думаю, что перечисления полезны, когда значения известны и несколько в числе.
Кроме того, Enums называются константами в некотором роде.

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