Почему CoroutineScope.launch и Coroutine.async являются функциями расширения вместо функции-члена CoroutineScope? - PullRequest
1 голос
/ 07 марта 2019

В заголовке изложен мой вопрос.

В чем причина CoroutineScope.launch и Coroutine.async - просто функции расширения CoroutineScope вместо функции-члена?

Какие преимущества это дает?предоставить?

Я спрашиваю, потому что, возможно, причина этого дизайна может быть полезна и в будущем.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 07 марта 2019

launch и async являются компиляторами сопрограмм, но они не единственные: ищите в интеграционных модулях future еще один future), publish, RxJava 2 строители и т. Д. Очевидно, что они не могут быть членами CoroutineScope, так почему же launch и async должны быть?

Кроме того, будучи функциями расширения, вы знаете, что они не зависят от каких-либо CoroutineScope рядовых (ну, они могут полагаться на internal с, поскольку они находятся в одном модуле).

2 голосов
/ 07 марта 2019

В основном потому, что с помощью функций расширения проще структурировать код в несколько модулей, даже если он представлен в виде одного класса.

CoroutineScope на самом деле действительно хороший пример этого шаблона проектирования. Посмотрите на CoroutineScope.kt, где интерфейс объявлен. Там есть только базовая функциональность (plus оператор и cancel())

Две упомянутые вами функции определены в Builders.common.kt. Если вы посмотрите на содержимое этого файла, вы увидите, что есть несколько классов, которые являются частными, это означает, что они могут использоваться только в этом файле. Это сразу говорит вам, что вам не нужны эти классы для базовой функциональности, которая разработана в CoroutineScope.kt, они существуют только для launch {...} и async {...}

Так что, если у вас большой класс с несколькими функциями, имеет смысл разбить его на несколько файлов (= модулей).

1 голос
/ 07 марта 2019

kotlinx.coroutines использует подход структурного параллелизма, чтобы обеспечить передачу всех ошибок в родительскую сопрограмму. Аналогично, родительская сопрограмма по умолчанию будет ожидать завершения всех своих дочерних сопрограмм.

Существует объект Job, связанный с каждой сопрограммой, когда вы делаете launch или async. Просто проще использовать функции расширения для этого проекта, чтобы заставить его работать неявно, без явного внимания автора кода

Вы можете взглянуть на более подробное объяснение:

https://kotlinlang.org/docs/reference/coroutines/basics.html#structured-concurrency

https://medium.com/@elizarov/structured-concurrency-722d765aa952

...