返回任务是否违反了 CQS 原则?
Is returning a Task violating the CQS-principle?
- CQS 原则 (https://en.wikipedia.org/wiki/Command%E2%80%93query_separation) 指出命令应该 return 无效。
- 对于异步方法的建议是永远不要 return void (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx),而是 return 执行任务。
那么,如果我写一个异步命令,是否会不可避免地破坏 CQS 原则?
处理async时Task
表示void,Task<T>
表示"a result"。所以不,它不违反 CQS 你只需要将 Task
视为 void
.
来自您链接的文章:
When converting from synchronous to asynchronous code, any method
returning a type T becomes an async method returning Task<T>
, and any
method returning void becomes an async method returning Task.
因此返回 Task
(不是 Task<T>
)转换为具有返回 void
的方法。
在考虑你想知道什么(查询)或做什么(命令)的层面上,Task<T>
为你提供数据,因此对于查询是正确的,而 Task
不是,并且因此对于命令是正确的。 ("return void" 是某些语言表达 "do not return data" 的特定语言方式)。
在此级别下,您正在考虑管理异步操作的机制,然后您总是希望获得有关异步操作状态的信息,因此总是需要某种任务对象。那不是考虑命令查询分离的级别。
相比之下,如果一个 .NET 方法调用一个 COM 方法,它将调用一个始终返回指示成功或失败的值的代码。这只是异常处理如何在该特定技术中发生的实现细节。根据您的工作水平来考虑这个问题是重要的还是无关紧要的。 Task
是基于任务的异步编程如何工作的实现细节。根据你的工作水平来考虑这个问题是重要的还是无关紧要的。
您需要考虑 "is this a command or a query" 的级别,Task
是关于如何获得 void
的实现细节。
- CQS 原则 (https://en.wikipedia.org/wiki/Command%E2%80%93query_separation) 指出命令应该 return 无效。
- 对于异步方法的建议是永远不要 return void (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx),而是 return 执行任务。
那么,如果我写一个异步命令,是否会不可避免地破坏 CQS 原则?
处理async时Task
表示void,Task<T>
表示"a result"。所以不,它不违反 CQS 你只需要将 Task
视为 void
.
来自您链接的文章:
When converting from synchronous to asynchronous code, any method returning a type T becomes an async method returning
Task<T>
, and any method returning void becomes an async method returning Task.
因此返回 Task
(不是 Task<T>
)转换为具有返回 void
的方法。
在考虑你想知道什么(查询)或做什么(命令)的层面上,Task<T>
为你提供数据,因此对于查询是正确的,而 Task
不是,并且因此对于命令是正确的。 ("return void" 是某些语言表达 "do not return data" 的特定语言方式)。
在此级别下,您正在考虑管理异步操作的机制,然后您总是希望获得有关异步操作状态的信息,因此总是需要某种任务对象。那不是考虑命令查询分离的级别。
相比之下,如果一个 .NET 方法调用一个 COM 方法,它将调用一个始终返回指示成功或失败的值的代码。这只是异常处理如何在该特定技术中发生的实现细节。根据您的工作水平来考虑这个问题是重要的还是无关紧要的。 Task
是基于任务的异步编程如何工作的实现细节。根据你的工作水平来考虑这个问题是重要的还是无关紧要的。
您需要考虑 "is this a command or a query" 的级别,Task
是关于如何获得 void
的实现细节。