Является ли возврат Задачи нарушением принципа CQS?
- Принцип CQS ( https://en.wikipedia.org/wiki/Command%E2%80%93query_separation) гласит, что команда должна возвращать void.
- Для асинхронных методов рекомендуется никогда не возвращать void ( https://msdn.microsoft.com/en-us/magazine/jj991977.aspx), а вместо этого возвращать Task.
Итак, если я напишу асинхронную команду, это неизбежно нарушит принцип CQS?
3 ответа
На уровне рассмотрения того, что вы хотите знать (запрос) или сделать (команда), то Task<T>
дает вам данные и, следовательно, является правильным для запроса и Task
нет и, следовательно, является правильным для команды. ("return void" - это языковой способ для некоторых языков выразить "не возвращать данные").
На уровне ниже того, на котором вы рассматриваете механизм управления асинхронными операциями, вы всегда хотите иметь информацию о состоянии асинхронной операции и, следовательно, всегда хотите какой-то объект задачи. Это не тот уровень, на котором нужно рассматривать разделение команд и запросов.
Сравнимо, если бы метод.NET вызывался в метод COM, он вызывал бы код, который всегда возвращал значение, указывающее успех или неудачу. Это просто деталь реализации того, как обработка исключений происходит в этой конкретной технологии. Это важно или неуместно думать об этом в зависимости от уровня, на котором вы работаете. Task
подробное описание реализации асинхронного программирования на основе задач Это важно или неуместно думать об этом в зависимости от уровня, на котором вы работаете.
Уровень, на котором вам нужно подумать "это команда или запрос", Task
детали реализации о том, как вы получаете void
,
При работе с асинхронным Task
представляет собой пустоту и Task<T>
представляет "результат". Так что нет, это не нарушает CQS, вам просто нужно подумать Task
как void
,
Из статьи вы ссылаетесь:
При преобразовании из синхронного в асинхронный код любой метод, возвращающий тип T, становится асинхронным методом, возвращающим
Task<T>
и любой метод, возвращающий void, становится асинхронным методом, возвращающим Task.
Поэтому возвращаюсь Task
(не Task<T>
) означает, что метод, возвращающий void
,