💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 5 из 25
Как укрепить «Replay горячего потока», не переписывая соседние модули?
Kotlin Общий поток SharedFlow · Replay горячего потока Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val events = MutableSharedFlow<Int>(replay = 1)
events.emit(7)
println(events.replayCache)
}
Перенести проверку в вызывающий код, исходя из того, что будет выведено `[1]`, то есть размер replay вместо значения.
Добавить защитную проверку перед фрагментом, поскольку будет выведено `[]`, потому что без подписчика emit в показанном сценарии отбрасывается.
Вынести участок в отдельный метод, считая верным следующее: Код зависнет: SharedFlow требует активного collector для любого emit.
Выбирать replay по семантике: 0 для неповторяемых сигналов, 1+ для значений, которые действительно можно повторить новому потребителю.
Оставить структуру прежней, документировав утверждение: Будет выведено `[7, 7]`, потому что значение записывается и в буфер, и в cache.
Вопрос 11 из 25
Какое изменение лучше всего защищает границу «Порядок операторов Flow»?
Kotlin Операторы · Порядок операторов Flow Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
(1..5).asFlow().map { it * 2 }.filter { it > 5 }.take(2)
.collect { print("$it ") }
}
Добавить локальную обработку результата, потому что будут напечатаны `2 4`, поскольку take выполняется первым.
Зафиксировать текущее поведение регрессионным тестом: Будут напечатаны `6 8 10`, так как take не влияет на upstream.
Ограничиться поясняющим комментарием о том, что код не компилируется: take доступен только коллекциям.
Располагать дешёвую фильтрацию до тяжёлого преобразования, если это не меняет смысл, и измерять буферизацию отдельно.
Передать ответственность владельцу вызова, предполагая, что будут напечатаны `3 4`, потому что filter применяется до map.
Вопрос 13 из 25
Предложенная правка для «Replay горячего потока» звучит так: Выбирать replay по семантике: 0 для неповторяемых сигналов, 1+ для значений, которые действительно можно повторить новому потребителю. Какой недостаток важнее обсудить?
Один источник эффективно обслуживает многих подписчиков, но потеря и повтор событий зависят от тонкой настройки буфера.
Сопровождение усложнится, если окажется, что будет выведено `[]`, потому что без подписчика emit в показанном сценарии отбрасывается.
Граница полезности решения описывается условием: Будет выведено `[7, 7]`, потому что значение записывается и в буфер, и в cache.
Главная цена решения — необходимость учитывать, что код зависнет: SharedFlow требует активного collector для любого emit.
После правки останется ограничение: Будет выведено `[1]`, то есть размер replay вместо значения.
Вопрос 20 из 25
Какой редкий случай способен сломать наивную трактовку «Порядок операторов Flow»?
`catch` перехватывает ошибки upstream, но не исключение, брошенное ниже него в collector или последующем операторе.
Проверить, сохраняется ли контракт, когда будут напечатаны `6 8 10`, так как take не влияет на upstream.
Отдельно воспроизвести случай, в котором будут напечатаны `2 4`, поскольку take выполняется первым.
Воспроизвести редкий сценарий, где код не компилируется: take доступен только коллекциям.
Зафиксировать сценарий, где ожидается: Будут напечатаны `3 4`, потому что filter применяется до map.