Я работаю над проектом, который обрабатывает запросы, и в запросе есть два компонента: команда и параметры. Обработчик для каждой команды очень прост (<10 строк, часто <5). Существует не менее 20 команд, и, скорее всего, их будет более 50.
Я придумал пару решений:
- один большой переключатель / if-else в командах
- карта команд для функций
- отображение команд на статические классы / синглтоны
Каждая команда выполняет небольшую проверку ошибок, и единственный бит, который можно абстрагировать, - это проверка количества параметров, которое определяется для каждой команды.
Каково было бы лучшее решение этой проблемы и почему? Я также открыт для любых шаблонов дизайна, которые я мог пропустить.
Я придумал следующий список за / против для каждого:
переключатель
- профи
- сохраняет все команды в одной функции; так как они просты, это делает его визуальной таблицей поиска
- не нужно загромождать исходный код множеством мелких функций / классов, которые будут использоваться только в одном месте
- минусы
- очень долго
- трудно добавлять команды программно (нужно использовать цепочку, используя регистр по умолчанию)
команды карты -> функция
- профи
- маленькие кусочки размером с укус
- можно добавлять / удалять команды программно
- минусы
- если сделано в линии, то же самое визуально как переключатель
- если не сделано in-line, множество функций используется только в одном месте
команды карты -> статический класс / синглтон
- профи
- может использовать полиморфизм для простой проверки ошибок (только как 3 строки, но все же)
- аналогичные преимущества для карты -> функциональное решение
- минусы
- много очень маленьких классов будут загромождать проект
- реализация не все в одном месте, так что не так просто сканировать реализации
Дополнительные примечания:
Я пишу это на Go, но я не думаю, что решение зависит от языка. Я ищу более общее решение, потому что мне может понадобиться сделать что-то очень похожее на других языках.
Команда - это строка, но я могу легко сопоставить ее с числом, если это удобно. Сигнатура функции выглядит примерно так:
Reply Command(List<String> params)
В Go есть функции верхнего уровня, а на других платформах, которые я рассматриваю, также есть функции верхнего уровня, отсюда и разница между вторым и третьим вариантами.