gpt4 book ai didi

command-query-separation - 命令查询分离 : commands must return void?

转载 作者:行者123 更新时间:2023-12-04 08:51:14 25 4
gpt4 key购买 nike

如果 CQS 阻止命令返回状态变量,那么如何为可能不成功的命令编码?假设您不能依赖异常。

似乎任何请求/响应都违反了 CQS。

所以看起来你会有一组“妈妈可以我”方法给出命令返回的状态。在多线程/多计算机应用程序中会发生什么?

如果我有三个客户端希望请求服务器的对象增加一个(并且对象的限制为 0-100)。所有人都检查他们是否可以,但一个人得到它 - 而另外两个则不能,因为它只是达到了限制。似乎返回状态可以解决这里的问题。

最佳答案

It seems like anything that is request/response is a violation of CQS.


几乎是的,因此命令查询- 分离 .作为马丁福勒 nicely puts it :

The fundamental idea is that we should divide an object's methods into two sharply separated categories:

Queries: Return a result and do not change the observable state of the system (are free of side effects).

Commands: Change the state of a system but do not return a value [my emphasis].


请求服务器的对象增加 1 是一个命令,因此它不应返回值 - 处理对该请求的响应意味着您正在同时执行命令和查询操作,这违反了 CQS 的基本原则。
所以如果你想知道服务器的值是什么,你可以发出一个单独的查询。
如果你真的需要一个请求-响应模式,你要么需要一个复杂的回调事件过程来发出特定请求状态的查询,要么纯 CQS 不适合你系统的这部分——注意这个词纯的。

多线程是 CQS 的一个主要缺点,并且可能使其难以实现。 Wikipedia有一个基本的例子和对此的讨论,还链接到同一篇 Martin Fowler 的文章,他建议打破模式来完成一些事情而不会让自己发疯:

[Bertrand] Meyer [the inventor of CQS] likes to use command-query separation absolutely, but there areexceptions. Popping a stack is a good example of a query that modifiesstate. Meyer correctly says that you can avoid having this method, butit 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.



TL;博士 - 我可能只是看看返回一个响应,即使它不是正确的 CQS。

关于command-query-separation - 命令查询分离 : commands must return void?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28382151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com