Всегда ли Switch (Case) неправильно?

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

Ответ 1

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

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

Примеры: Тестирование того, является ли символ, который пользователь ввел, является одним из "a", "b" или "c", является заданием для коммутатора.

Тестирование того, является ли объект, с которым вы имеете дело, является Dog или Cat - это задание для полиморфной отправки.

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

Ответ 2

Прежде всего, Simplicity часто является хорошим выбором дизайна.

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

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

Ответ 3

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

Ответ 4

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

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


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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

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

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