Как применить разделение командных запросов (CQS), когда от команды требуются данные результата?

В определении разделения запросов команд в Википедии говорится, что

Более формально методы должны возвращать только значение если они ссылочно прозрачны и, следовательно, не обладают побочными эффектами.

Если я запускаю команду, как мне определить или сообщить, была ли эта команда успешной, поскольку по этому определению функция не может возвращать данные?

Например:

string result = _storeService.PurchaseItem(buyer, item);

Этот вызов содержит и команду, и запрос, но часть запроса является результатом команды. Думаю, я мог бы реорганизовать это, используя шаблон команды, например:

PurchaseOrder order = CreateNewOrder(buyer, item);
_storeService.PerformPurchase(order);
string result = order.Result;

Но похоже, что это увеличивает размер и сложность кода, что не является очень позитивным направлением для рефакторинга.

Может кто-нибудь дать мне лучший способ добиться разделения команд и запросов, когда вам нужен результат операции?

Я что-то упустил?

Спасибо!

Примечания: Мартин Фаулер говорит об ограничениях cqs CommandQuerySeparation :

Мейер любит использовать команду-запрос разделение абсолютно, но есть исключения. Стопка - это хорошо пример модификатора, который изменяет штат. Мейер правильно говорит, что вы можно избежать использования этого метода, но он это полезная идиома. Так что я предпочитаю следую этому принципу, когда могу, но Я готов сломать его, чтобы получить pop.

По его мнению, почти всегда стоит рефакторинг в сторону разделения команд и запросов, за исключением нескольких незначительных простых исключений.

62
задан Dave Schweisguth 14 February 2016 в 05:33
поделиться