В основном потому, что с помощью функций расширения проще структурировать код в несколько модулей, даже если он представлен в виде одного класса.
CoroutineScope
на самом деле действительно хороший пример этого шаблона проектирования. Посмотрите на CoroutineScope.kt
, где интерфейс объявлен. Там есть только базовая функциональность (plus
оператор и cancel()
)
Две упомянутые вами функции определены в Builders.common.kt
. Если вы посмотрите на содержимое этого файла, вы увидите, что есть несколько классов, которые являются частными, это означает, что они могут использоваться только в этом файле. Это сразу говорит вам, что вам не нужны эти классы для базовой функциональности, которая разработана в CoroutineScope.kt
, они существуют только для launch {...}
и async {...}
Так что, если у вас большой класс с несколькими функциями, имеет смысл разбить его на несколько файлов (= модулей).