Command — инкапсуляция операции как отдельного объекта
Command превращает вызов операции в самостоятельный объект, содержащий все данные для ее выполнения. Это позволяет передавать команды между компонентами, ставить их в очередь, логировать, отменять, повторять и выполнять асинхронно.
Паттерн широко применяется в CQRS, микросервисах, обработчиках событий, брокерах сообщений, workflow, UI-командах, транзакциях и системах аудита.
Command делает действия независимыми, управляемыми и формализованными, что является критически важным для масштабируемых и распределенных систем.
Паттерн Command играет огромную роль в проектировании современных информационных систем, особенно в системах, где операции должны быть:
-
передаваемыми,
-
логируемыми,
-
повторяемыми,
-
поставляемыми в очередь,
-
асинхронными,
-
воспроизводимыми,
-
откатываемыми.
Command позволяет представить действие в виде универсального и полностью описанного объекта.
Главная идея Command
Command превращает вызов функции в объект:
Команда включает:
-
какой метод нужно выполнить;
-
над какими данными;
-
с какими аргументами;
-
кто инициатор;
-
когда создана;
-
какие параметры нужны для восстановления/повтора.
Клиент не вызывает метод напрямую — он создаёт Command.
Command отправляется исполнителю (Command Handler), который знает, как ее обработать.
Архитектурные элементы Command
-
Command — объект действия
-
Handler — обработчик, выполняющий команду
-
Invoker — компонент, инициирующий выполнение
-
Receiver — объект, который реально выполняет действие
-
Queue (optional) — очередь команд
-
Log (optional) — журнал команд
-
Undo Stack (optional) — история команд
Эти элементы можно комбинировать для построения больших систем.
Где используется Command
Command встречается почти в каждом современном архитектурном стиле.
1. CQRS (Command Query Responsibility Segregation)
Command — это половина CQRS:
-
Commands — изменяют состояние системы
-
Queries — только читают
Каждая команда — это отдельный объект, проходящий через Handler.
Архитектор обязан понимать Command, чтобы проектировать CQRS-системы.
2. Микросервисы
Command — основа межсервисного взаимодействия:
-
PlaceOrderCommand
-
CancelPaymentCommand
-
TriggerInvoiceCommand
-
ApproveDocumentCommand
Команды:
-
валидируются,
-
сериализуются,
-
передаются в очередь,
-
обрабатываются обработчиками.
3. Message broker логика
В Kafka/RabbitMQ/NATS команды превращаются в сообщения.
luaOrderCreatedCommand -> orders.create.topic
Команда становится единицей коммуникации.
4. Workflow и BPM
Команда = шаг процесса.
Workflow-движки хранят:
-
команды,
-
состояния команд,
-
историю выполнения.
5. UI команды
Пользовательские действия часто оформляются как команды:
-
«отменить»,
-
«повторить»,
-
«удалить»,
-
«скопировать»,
-
«переименовать».
Command позволяет реализовывать undo/redo.
6. Транзакции
Command может быть частью транзакционной последовательности:
-
несколько команд объединяются в batch
-
или выполняются через Saga (Saga — последовательность команд)
7. Интеграция с legacy
Legacy-системы легко адаптировать через командный интерфейс:
-
Внешняя система вызывает команду,
-
а Command Handler транслирует её в legacy-протокол.
Преимущества Command
-
независимость поведения от клиента;
-
возможность отката и повтора;
-
логирование и аудит действий;
-
асинхронность;
-
очереди и ретраи;
-
интеграция с брокерами сообщений;
-
идеальная согласованность с DDD;
-
ясная структура бизнес-операций.
Недостатки
-
увеличение количества классов;
-
необходимость проектировать обработчики;
-
усложнение архитектуры при огромном количестве команд;
-
нужна дисциплина в проектировании командной модели.
Но во всех сложных системах Command — must-have.
Command в российских учебниках
Command рассматривается:
-
как основа транзакционных архитектур;
-
как способ формализации бизнес-операций;
-
как механизм структурного проектирования поведения;
-
как инструмент для очередей и распределенных систем.
В разделе «Проектирование архитектуры ИС» Command относится к фундаментальным концепциям.
Почему архитектор обязан знать Command
Потому что Command — это:
-
единица бизнес-операции;
-
единица интеграции;
-
единица транзакции;
-
единица аудита;
-
единица workflow;
-
единица CQRS;
-
единица взаимодействия микросервисов.
Command — один из самых фундаментальных паттернов, без которого невозможно построить современную архитектуру корпоративных систем.