Оба switch
утверждения и полиморфизм имеют свое применение. Обратите внимание, что существует и третий вариант (в языках, которые поддерживают указатели на функции / лямбды и функции более высокого порядка): сопоставление рассматриваемых идентификаторов с функциями-обработчиками. Это доступно, например, в C, который не является языком OO, и в C #, который *, но не (пока) в Java, который тоже является OO *.
В некоторых процедурных языках (не имеющих ни полиморфизма, ни функций более высокого порядка) switch
/ if-else
операторы были единственным способом решения класса проблем. Поэтому многие разработчики, привыкшие к такому мышлению, продолжали использовать switch
даже в ОО-языках, где полиморфизм часто является лучшим решением. Вот почему часто рекомендуется избегать / рефакторинга switch
высказываний в пользу полиморфизма.
В любом случае, лучшее решение всегда зависит от конкретного случая. Вопрос заключается в следующем: какой вариант дает вам более чистый, более лаконичный и более понятный код в долгосрочной перспективе?
Операторы переключения часто могут становиться громоздкими, имея десятки случаев, усложняя их обслуживание. Поскольку вы должны хранить их в одной функции, эта функция может стать огромной. Если это так, вам следует рассмотреть возможность рефакторинга в сторону решения на основе карты и / или полиморфного решения.
Если то же самое switch
начинает появляться в нескольких местах, полиморфизм, вероятно, является наилучшим вариантом для объединения всех этих случаев и упрощения кода. Особенно, если ожидается, что в будущем будет добавлено больше дел; чем больше мест вам нужно обновлять каждый раз, тем больше возможностей для ошибок. Однако часто отдельные обработчики дел настолько просты, или их так много, или они настолько взаимосвязаны, что рефакторинг их в полную полиморфную иерархию классов является излишним, или приводит к большому количеству дублированного кода и / или запутанности, трудно поддерживать иерархию классов. В этом случае может быть проще использовать функции / лямбды (если ваш язык позволяет вам).
Тем не менее, если у вас есть switch
в одном месте, и только в нескольких случаях делать что-то простое, это может быть лучшим решением оставить это как есть.
* Здесь я употребляю термин «ОО» свободно; Меня не интересуют концептуальные дебаты о том, что является «настоящим» или «чистым» ОО.