问题标签 [command-query-separation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
127 浏览

.net - 将并发冲突传达给应用层

在将并发冲突传达给您的应用程序层时,是否有替代使用也尊重命令查询分离原则的异常,或者异常是我们拥有的最佳机制(在支持异常的语言中)?

在我的应用程序的内部,我有乐观的锁定逻辑,当我调用某些高级方法时,它会向下执行几层,例如(在我的情况下,我使用的是自定义数据访问层,尽管我当然愿意听听 ORM 实现是如何做到这一点的)。应用程序与之交互的高级方法调用如下所示:

当其他人更新了他们正在处理的数据时,我需要能够告诉 Web 应用程序的用户。

我宁愿不从更改数据的方法中返回值。所以在过去,我抛出了异常(类似于 .NET 数据适配器 API,它在检测到冲突时会抛出DBConcurrencyException),但在某些常识上,并发冲突并不是异常的。它们是生活中的事实:应用程序工作流程中可预测的、预期的部分。在 Eric Lippert 的分类法中,它们是否有资格作为外生例外?

0 投票
2 回答
236 浏览

database - 良好的数据层开发和设计:数据层开发中常见的不良做法是什么?

我目前正在研究用于高度可维护系统的应用程序设计的最佳实践(在相当高的水平上),从而将更改的摩擦降至最低。“数据层”是指数据库设计、对象关系映射器 (ORM) 和通用数据访问技术。

根据您的经验,在数据层开发方面,您发现了哪些常见错误和不良做法,以及您采取/实施了哪些措施/或可以建议使数据层成为开发人员更好的地方看法?

一个示例答案可能包括:导致数据层缓慢、可扩展性和可扩展性差的最常见原因是什么?+ 可以采取哪些措施(无论是设计还是重构)来解决这个问题?

我在这里寻找战争故事和一些现实世界的建议,我可以将它们构建到公开可用的指导文件和样本中。

0 投票
4 回答
1246 浏览

asp.net-mvc - CQS 和 ASP.NET MVC 操作

读过CQS原理的人都知道:

CQS 声明每个方法都应该是执行操作的命令,或者是向调用者返回数据的查询,但不能同时是两者。

说到 ASP.NET MVC Actions,CQS 是否表明我们不应该有这样的 Action?

这个方法是改变系统的状态并返回当前状态。如果在这里应用 CQS,我们应该有 2 个单独的 Action:一个用于插入新订单,一个用于获取系统的系统(如果第一个 Action 成功完成,则应从客户端调用)。然而,这使编程变得复杂。

我想知道你对此的看法。

莫什

0 投票
9 回答
19824 浏览

c# - 当需要来自命令的结果数据时,如何应用命令查询分离 (CQS)?

在维基百科对命令查询分离的定义中,指出

更正式地说,方法只有在引用透明并且没有副作用时才应该返回一个值。

如果我发出命令,我应该如何确定或报告该命令是否成功,因为根据这个定义,函数不能返回数据?

例如:

此调用中既有命令也有查询,但查询部分是命令的结果。我想我可以使用命令模式重构它,如下所示:

但这似乎增加了代码的大小和复杂性,这不是一个非常积极的重构方向。

当您需要操作结果时,有人可以给我一个更好的方法来实现命令查询分离吗?

我在这里错过了什么吗?

谢谢!

注意:Martin Fowler 对 cqs CommandQuerySeparation的限制有这样的说法:

Meyer 绝对喜欢使用命令-查询分离,但也有例外。弹出堆栈是修改状态的修饰符的一个很好的例子。Meyer 正确地说您可以避免使用这种方法,但它是一个有用的成语。所以我更愿意尽可能地遵循这个原则,但我准备打破它以获得我的流行。

在他看来,几乎总是值得重构命令/查询分离,除了一些小的简单例外。

0 投票
3 回答
405 浏览

c# - 滥用闭包?违反各种原则?或者好吗?

编辑:修复了几个语法和一致性问题,使代码更明显,更接近我实际在做的事情。

我有一些看起来像这样的代码:

其中该DoSomething方法是一个扩展方法,并且它需要一个 Func 传递给它。因此,每个 DoSomething => lambda 中的每个方法调用都返回一个 Result 类型。

这类似于Maybe monad。除了检查空值之外,我正在检查 Result 类的状态,并且要么调用传递给 DoSomething 的 Func,要么在不调用 Func 的情况下返回先前的 Result

我面临的问题是希望在我的代码中具有这种组合,但我还需要能够将数据从组合调用结果之一传递到另一个调用结果中,正如您在someClass变量中看到的那样。

我的问题不在于这在技术上是否正确……我知道这是可行的,因为我目前正在这样做。我的问题是这是否是对闭包的滥用,或命令-查询分离,或任何其他原则......然后问有什么更好的模式来处理这种情况,因为我很确定我是现在,这种类型的代码陷入了“闪亮的新锤子”模式。

0 投票
4 回答
571 浏览

c# - 命令查询分离违规

你有什么想法

在 Clean Code 中,这被视为违反命令查询分离。但是我们如何理解命令 DoSomething() 中的某些内容是否出错?sql 命令(例如:void Delete(Table))呢?我们如何知道该表是否存在?

谢谢。

0 投票
4 回答
1583 浏览

python - 修改对象或返回修改后副本的函数的 Python 命名约定

对于可以返回已修改对象或仅修改实例的函数,Python 中的命名约定是什么。

假设你想同时实现这两个,你应该如何命名函数?

示例:假设您想要一个crop()Image 对象的函数。我 Ruby 它很简单,因为crop()如果您返回副本并crop!()修改原始实例,您应该使用它。

0 投票
1 回答
221 浏览

.net - 我可以打破 CQS 以确保不那么繁琐的 Web 服务接口吗?

我有一个调用 .NET WCF Web 服务的 .NET WPF 智能客户端。Web 服务完成大部分工作并将少量信息返回给客户端。因此,它与浏览器并不完全不同。

客户端调用 Web 服务,此时 Web 服务会做一些工作并返回一个“结果”对象。事情变得越来越复杂,我认为这是因为我没有应用 CQS(注意我现在说的是 CQS 而不是 CQRS)。我想重构一些东西以简化并引入 CQS。我仍然可以很高兴地更改 WCF 合同,以便这样做。

但是,这表明客户端应用程序将“发送命令消息”(即在 Web 服务上调用命令方法),然后“查询”(在同一 Web 服务上调用不同的方法)下一步该做什么. 我觉得这是不必要的;请求/响应样式是一种非常常见的样式(想想浏览器),如果您考虑一下,它在技术上会破坏 CQS。我在想,在我的情况下,在 Web 服务中提供操作并遵循 CQS,可以为两者之间的实际 Web 服务调用稍微欺骗系统。

这可以接受吗?

0 投票
4 回答
844 浏览

c# - 流畅的接口是否违反命令查询分离原则?

我开始编写流畅的界面,并查看了 Martin Fowler 写的关于流畅界面的旧文章(我没有意识到他和 Eric Evans 创造了这个术语)。在这篇文章中,Martin 提到 setter 通常会返回正在配置或处理的对象的实例,他说这违反了 CQS。

花括号世界中的常见约定是修饰符方法是无效的,我喜欢它,因为它遵循 CommandQuerySeparation 的原则。这个约定确实妨碍了流畅的界面,所以我倾向于暂停这种情况下的约定。

因此,如果我的流利界面执行以下操作:

这真的违反了CQS吗?

更新我打破了我的示例,将日志记录警告和错误显示为单独的行为。

0 投票
3 回答
2253 浏览

c# - 在 MVC 控制器中使用命令-查询分离原则

我喜欢命令查询分离的想法,但看不到如何在添加实体的 MVC 控制器操作中使用它,并且在添加后需要新实体的 ID。

例如,在下面的简化示例中,服务用于创建新项目:

但是当我重定向到要显示新项目的操作时,我需要知道新创建的项目的 ID,以便可以从数据库中检索它。所以我必须要求服务返回新创建的项目(或至少,它的 ID)。

在纯 CQS 中,命令没有返回值,所以上面的模式是无效的。

感激地收到任何建议。