І switch
твердження, і поліморфізм мають своє вживання. Зауважте, що існує й третя опція (мовами, які підтримують функції покажчиків / лямбдатів та функцій вищого порядку): відображення відповідних ідентифікаторів до функцій обробника. Це доступно, наприклад, на C, що не є мовою ОО, і C #, що є *, але немає (поки що) в Java, що є і OO *.
У деяких процедурних мовах (не маючи поліморфізму та функцій вищого порядку) switch
/ if-else
заяви були єдиним способом вирішення класу проблем. Тому багато розробників, звикши до такого способу мислення, продовжували використовувати switch
навіть мови OO, де поліморфізм часто є кращим рішенням. Ось чому часто рекомендується уникати / рефакторних switch
тверджень на користь поліморфізму.
У будь-якому випадку, найкраще рішення завжди залежить від конкретних випадків. Питання полягає в тому, який варіант дає вам більш чистий, більш стислий, більш досяжний код у довгостроковій перспективі?
Висловлювання комутаторів часто можуть стати непростими, тому що вони мають десятки випадків, що ускладнює їх обслуговування. Оскільки ви повинні утримувати їх в одній функції, ця функція може зрости величезною. Якщо це так, вам слід розглянути можливість рефакторингу на карту та / або поліморфний розчин.
Якщо те саме switch
починає з'являтися в декількох місцях, поліморфізм, мабуть, є найкращим варіантом для уніфікації всіх цих випадків та спрощення коду. Особливо, якщо очікується, що в майбутньому буде додано більше справ; чим більше місць потрібно оновлювати щоразу, тим більше можливостей для помилок. Однак часто обробники окремих випадків настільки прості, або їх так багато, або вони настільки взаємопов'язані, що переробляння їх на повну ієрархію поліморфних класів є надмірною, або призводить до багато дублюється коду та / або заплутується, важко підтримувати ієрархію класів. У цьому випадку може бути простіше використовувати замість них функції / лямбда (якщо ваша мова дозволяє).
Однак якщо у вас є місце switch
в одному місці, і лише кілька випадків роблять щось просте, це може бути найкращим рішенням залишити його таким, яким він є.
* Я тут дуже вільно використовую термін "ОО"; Мене не цікавлять концептуальні дебати щодо того, що є "реальним" чи "чистим" ОО.