На практике use cases удобно делить на команды (изменяют состояние системы) и запросы (читают данные, не изменяя состояние системы). Такое разделение делает код более понятным и предсказуемым, а также упрощает развитие архитектуры. Например, запросы можно безопасно кешировать, а команды — при необходимости выполнять асинхронно.

Обычно рекомендуется, чтобы команда не возвращала состояние системы. Если после выполнения команды требуется актуальное состояние, его лучше получить отдельным запросом. Исключением часто является идентификатор созданной сущности.

Для диспетчеризации команд и запросов удобно использовать Command Bus и Query Bus. Они позволяют отделить вызывающий код от обработчика, добавить сквозную функциональность (логирование, валидацию, транзакции, авторизацию и т.д.).

Пример кода: https://pastebin.com/WkUDeen2

На практике use cases удобно делить на команды (изменяют состояние системы) и запросы (читают данные, не изменяя состояние системы) | Сетка — социальная сеть от hh.ru