返回的任务违反了CQS原则

本文关键字:CQS 原则 任务 返回 | 更新日期: 2023-09-27 18:24:07

  • CQS原理(https://en.wikipedia.org/wiki/Command%E2%80%93query_separation)声明命令应返回void
  • 异步方法的建议是永远不要返回void(https://msdn.microsoft.com/en-us/magazine/jj991977.aspx),但返回一个Task

那么,如果我编写一个异步命令,这会不可避免地打破CQS原则吗?

返回的任务违反了CQS原则

处理异步时,Task表示无效,Task<T>表示"结果"。所以,不,它并不违反CQS——你只需要把Task看作void

在考虑你想知道什么(查询)或做什么(命令)的层面上,Task<T>会给你数据,因此对于查询是正确的,而Task不会,因此对于命令是正确的。("return void"是某些语言表示"不返回数据"的特定语言方式)。

在下面的级别上,您正在考虑管理异步操作的机制,那么您总是希望获得有关异步操作状态的信息,因此总是想要某种任务对象。这不是考虑命令-查询分离的级别。

类似地,如果.NET方法调用COM方法,它将调用总是返回指示成功或失败的值的代码。这只是该特定技术中异常处理的实现细节。根据您的工作级别来考虑这一点要么至关重要,要么无关紧要。Task是基于任务的异步编程如何工作的实现细节。根据你的工作水平,考虑这个问题要么至关重要,要么无关紧要

您需要考虑"这是一个命令还是一个查询"的级别,Task是关于如何获得void的实现细节。

从您链接的文章来看:

从同步代码转换为异步代码时,任何方法返回类型T变为返回Task<T>的异步方法,并且返回void的方法变成了返回Task的异步方法。

因此,返回Task(而不是Task<T>)转化为具有返回void的方法。