Я працюю над проектом, який обробляє запити, і до цього запиту є два компоненти: команда та параметри. Обробник для кожної команди дуже простий (<10 рядків, часто <5). Є щонайменше 20 команд, і, ймовірно, буде більше 50.
Я придумав пару рішень:
- один великий перемикач / інше на команди
- карта команд до функцій
- карта команд для статичних класів / синглтон
Кожна команда робить невелику перевірку помилок, і єдиний біт, який можна абстрагувати, - це перевірка кількості параметрів, яка визначена для кожної команди.
Що було б найкращим рішенням цієї проблеми і чому? Я також відкритий до будь-яких моделей дизайну, які я, можливо, не пропустив.
Я придумав наступний список про / кон для кожного:
перемикач
- плюси
- зберігає всі команди в одній функції; оскільки вони прості, це робить його візуальною таблицею пошуку
- не потрібно захаращувати джерело тоннами дрібних функцій / класів, які будуть звикати лише в одному місці
- мінуси
- дуже довго
- важко додавати команди програмно (потрібно ланцюжок, використовуючи типовий регістр)
команди map -> функція
- плюси
- невеликі шматочки з укусом
- може додавати / видаляти команди програмно
- мінуси
- якщо це робиться в черзі, так само візуально, як і комутатор
- якщо це не робиться в режимі рядка, багато функцій використовуються лише в одному місці
команди на карті -> статичний клас / синглтон
- плюси
- може використовувати поліморфізм для обробки простої перевірки помилок (лише як 3 рядки, але все ж)
- подібні переваги для рішення карти -> функцій
- мінуси
- багато дуже маленьких класів будуть захаращувати проект
- реалізація не все в одному місці, тому сканувати реалізацію не так просто
Додаткові примітки:
Я пишу це у Go, але не думаю, що рішення є специфічним для мови. Я шукаю більш загальне рішення, тому що мені може знадобитися зробити щось дуже схоже на інших мовах.
Команда - це рядок, але я можу легко зіставити це в число, якщо зручно. Підпис функції виглядає приблизно так:
Reply Command(List<String> params)
Go має функції вищого рівня, а інші платформи, які я розглядаю, також мають функції верхнього рівня, отже, різниця між другим та третім варіантами.