CQS 原则说,每个方法都应该是执行操作的命令,或者是向调用者返回数据的查询,但不能同时是两者。查询不做任何其他事情是有意义的,因为您不希望查询更改状态。但是,如果命令返回一些额外的信息,它看起来是无害的。您可以使用返回的值,也可以忽略它。为什么 CQS 原则要求 Command 不返回任何值?
2 回答
但是,如果命令返回一些额外的信息,它看起来是无害的吗?
它经常是。有时不是。
人们可能会开始混淆对命令的查询,或者调用命令更多是因为它返回的信息而不是其效果(以及防止该效果成为真实效果的“聪明”方法,这可能很脆弱)。
它可能导致界面中的间隙。如果人们可以为特定查询设想的唯一用例是与特定命令携手并进,那么添加Pop()
可以Peek()
限制面对未来变化时组件的灵活性。
在某种程度上,“看起来无害”正是 CQS 在禁止此类构造时警告您的内容。
现在,这并不是说您可能仍然不会认为特定的命令-查询组合没有那么有用而不值得,但是在权衡这种决定的利弊时,CQS 始终是一个争论的声音反对。
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.