MKa*_*ras 7 command-query-separation
如果CQS阻止命令返回状态变量,那么命令的一个代码怎么可能不成功?假设你不能依赖例外.
似乎任何请求/响应都违反了CQS.
所以看起来你会有一套"母亲可能我"的方法给出了命令返回的状态.多线程/多计算机应用程序中会发生什么?
如果我有三个客户端要求服务器的对象增加一个(并且对象的限制为0-100).所有人都检查它们是否可以但是一个人得到它 - 而另外两个不能,因为它只是达到了极限.这似乎是返回状态可以解决这里的问题.
似乎任何请求/响应都违反了CQS。
是的,因此是Command-Query- Separation。正如Martin Fowler 所说的那样:
基本思想是,我们应该将对象的方法分为两个明显分开的类别:
查询:返回结果,并且不更改系统的可观察状态(无副作用)。
命令:更改系统状态,但不返回值 [我的重点]。
请求服务器的对象增加一个是Command,因此它不应返回值-处理对该请求的响应意味着您正在同时执行Command和Query操作,这破坏了CQS的基本宗旨。
因此,如果您想知道服务器的价值是什么,可以发出一个单独的Query。
如果您确实需要请求-响应模式,则可能需要使用复杂的回调事件流程来发出针对特定请求状态的查询,或者纯 CQS不适合您系统的这一部分-请注意纯净的。
多线程是CQS的主要缺点,可能会使它难以执行。Wikipedia对此有一个基本的示例和讨论,并且还链接到同一篇Martin Fowler的文章,他在文章中建议可以打破模式来完成某些事情而又不致于发疯:
[Bertrand] Meyer [CQS的发明者]绝对喜欢使用命令查询分离,但是也有例外。弹出堆栈是修改状态的查询的一个很好的例子。迈耶正确地说,您可以避免使用此方法,但这是一个有用的习惯用法。因此,我更愿意在可能的情况下遵循这一原则,但我准备打破这一原则以赢得关注。
TL; DR-我可能只会看返回响应,即使它不是正确的CQS。
归档时间: |
|
查看次数: |
756 次 |
最近记录: |