Всегда ли Switch (Case) не так? - PullRequest
11 голосов
/ 03 декабря 2008

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

Ответы [ 8 ]

25 голосов
/ 03 декабря 2008

Используйте переключатели при тестировании на значениях примитивов. (т.е. целые числа или символы).

Используйте полиморфизм при выборе между типами .

Примеры: Проверка, является ли введенный пользователем символ одним из символов «a», «b» или «c», является заданием для переключения.

Проверка того, является ли объект, с которым вы имеете дело, собакой или кошкой, является задачей полиморфной отправки.

Во многих языках, если у вас более сложные значения, вы, возможно, не сможете использовать Switch в любом случае.

16 голосов
/ 03 декабря 2008

Прежде всего, простота - хороший выбор дизайна.

Я никогда не понимал этого смещения по отношению к переключателю / случаю. Да, этим можно злоупотреблять, но это так же, как и любой другой программной конструкцией.

Включение типа обычно неправильно и, вероятно, должно быть заменено полиморфизмом. Переключение на другие вещи обычно в порядке.

5 голосов
/ 03 декабря 2008

Да, определенно. Много раз ваш переключатель имеет отношение только к очень маленькой части вашей общей логики, и было бы ошибкой создавать совершенно новые классы только для этого незначительного эффекта.

Например, допустим, у вас есть база данных слов, пользователь вводит другое слово, и вы хотите найти это слово в базе данных, но включить возможные множественные числа. Вы можете написать что-то вроде (C ++)


vector<string> possible_forms;
possible_forms.push_back(word);
char last_letter = word[word.size() - 1];
switch (last_letter) {
  case 's':
  case 'i':
  case 'z':
    possible_forms.push_back(word + "es");
    break;
  case 'y':
    possible_forms.push_back(word.substr(0, word.size() - 1) + "ies");
    break;
  default:
    possible_forms.push_back(word + "s");
}

Делать это со стратегиями было бы излишним.

5 голосов
/ 03 декабря 2008

С одной стороны, удобочитаемость.

1 голос
/ 03 декабря 2008

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

0 голосов
/ 24 ноября 2009

Я считаю, что переключатель всегда неверен:

Тело дела - это код, а - это поведение , следовательно, вещь в этом случае («значение») имеет поведенческий тип, следовательно, полиморфизм был бы лучшим выбором.

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

Это проще сделать в некоторых языках, чем в других, к сожалению, большинство широко используемых языков довольно ужасны, поэтому путь наименьшего сопротивления неверен, и люди в конечном итоге пишут переключатели или операторы (то же самое) 1009 *

0 голосов
/ 03 декабря 2008

Нет , оператор switch, вероятно, является хорошим выбором для проектирования в простых ситуациях.

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

0 голосов
/ 03 декабря 2008

«Стратегии» могут быть созданы с помощью переключателя.

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

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

...