In wikipedia's definition of command query separation, it is stated that
More formally, methods should return a value only if they are referentially transparent and hence possess no side effects.
If I am issuing a command, how should I determine or report whether that command was successful, since by this definition the function cannot return data?
For example:
string result = _storeService.PurchaseItem(buyer, item);
This call has both a command and query in it, but the query portion is result of the command. I guess I could refactor this using the command pattern, like so:
PurchaseOrder order = CreateNewOrder(buyer, item);
_storeService.PerformPurchase(order);
string result = order.Result;
But this seems like it's increasing the size and complexity of the code, which is not a very positive direction to refactor towards.
Can someone give me a better way to achieve command-query separation when you need the result of an operation?
Am I missing something here?
Thanks!
Notes: Martin Fowler has this to say about the limits of cqs CommandQuerySeparation:
Meyer likes to use command-query separation absolutely, but there are exceptions. Popping a stack is a good example of a modifier that modifies state. Meyer correctly says that you can avoid having this method, but it is a useful idiom. So I prefer to follow this principle when I can, but I'm prepared to break it to get my pop.
From his view, it's almost always worth it to refactor towards command/query separation, except for a few minor simple exceptions.