В определении разделения запросов команд в Википедии говорится, что
Более формально методы должны возвращать только значение если они ссылочно прозрачны и, следовательно, не обладают побочными эффектами.
Если я запускаю команду, как мне определить или сообщить, была ли эта команда успешной, поскольку по этому определению функция не может возвращать данные?
Например:
string result = _storeService.PurchaseItem(buyer, item);
Этот вызов содержит и команду, и запрос, но часть запроса является результатом команды. Думаю, я мог бы реорганизовать это, используя шаблон команды, например:
PurchaseOrder order = CreateNewOrder(buyer, item);
_storeService.PerformPurchase(order);
string result = order.Result;
Но похоже, что это увеличивает размер и сложность кода, что не является очень позитивным направлением для рефакторинга.
Может кто-нибудь дать мне лучший способ добиться разделения команд и запросов, когда вам нужен результат операции?
Я что-то упустил?
Спасибо!
Примечания: Мартин Фаулер говорит об ограничениях cqs CommandQuerySeparation :
Мейер любит использовать команду-запрос разделение абсолютно, но есть исключения. Стопка - это хорошо пример модификатора, который изменяет штат. Мейер правильно говорит, что вы можно избежать использования этого метода, но он это полезная идиома. Так что я предпочитаю следую этому принципу, когда могу, но Я готов сломать его, чтобы получить pop.
По его мнению, почти всегда стоит рефакторинг в сторону разделения команд и запросов, за исключением нескольких незначительных простых исключений.