3

CQS 原则说,每个方法都应该是执行操作的命令,或者是向调用者返回数据的查询,但不能同时是两者。查询不做任何其他事情是有意义的,因为您不希望查询更改状态。但是,如果命令返回一些额外的信息,它看起来是无害的。您可以使用返回的值,也可以忽略它。为什么 CQS 原则要求 Command 不返回任何值?

4

2 回答 2

2

但是,如果命令返回一些额外的信息,它看起来是无害的吗?

它经常是。有时不是。

人们可能会开始混淆对命令的查询,或者调用命令更多是因为它返回的信息而不是其效果(以及防止该效果成为真实效果的“聪明”方法,这可能很脆弱)。

它可能导致界面中的间隙。如果人们可以为特定查询设想的唯一用例是与特定命令携手并进,那么添加Pop()可以Peek()限制面对未来变化时组件的灵活性。

在某种程度上,“看起来无害”正是 CQS 在禁止此类构造时警告您的内容。

现在,这并不是说您可能仍然不会认为特定的命令-查询组合没有那么有用而不值得,但是在权衡这种决定的利弊时,CQS 始终是一个争论的声音反对。

于 2015-11-23T16:17:17.710 回答
0

From my understanding, one of the benefits of CQS is how well it works in distributed environments. Commands become their own isolated unit that could be immediately executed, placed in a queue to be executed at a later date, executed by a remote event handler etc.

If the commander interface were to specify a return type then you greatly affect the strength of the CQS pattern in its ability to fit well within a distributed model.

The common approach to solving this problem (see this article for instance by Mark Seemann) is to generate a unique ID such as a guid which is unique to the event executed by the command handler. This is then persisted to allow the data to be identified at a later date.

于 2015-01-23T22:58:06.850 回答