Size: a a a

Kotlin Community

2020 April 08

BV

Boris Vanin in Kotlin Community
Причём, некоторые места можно тестами не покрывать, а некоторые без тестов на ревью стыдно отправить
источник

A

AlexJok in Kotlin Community
Boris Vanin
Покрытие тестами это необходимость, я говорю про рассчет процента покрытия типа джакоко
Ну так он нормально считает. Конечно, если человек пишет на отвали, лишь бы гейты прошли, то тут и говорить не о чем.
источник

BV

Boris Vanin in Kotlin Community
AlexJok
Ну так он нормально считает. Конечно, если человек пишет на отвали, лишь бы гейты прошли, то тут и говорить не о чем.
Так джакоко не отличает как написано, а проблем может создать множество
источник

BV

Boris Vanin in Kotlin Community
Т.е. в общем случае ничего не показывает
источник

A

AlexJok in Kotlin Community
Он не должен за это отвечать, за все отвечают люди. Jacoco помогает, это инструмент.
источник

BV

Boris Vanin in Kotlin Community
AlexJok
Он не должен за это отвечать, за все отвечают люди. Jacoco помогает, это инструмент.
Я это понимаю, просто не понимаю с чем он помогает
источник

NY

Nikita Yatskivskiy in Kotlin Community
Ребят - https://stackoverflow.com/a/43889107/6793622
Ответ старый, вдруг чего с этого времени поменялось…
Каналы действительно необходимо закрывать через cancel()? Или достаточно закрыть скоуп, в рамках которого мы подписались на канал, и занулить ссылки на него, чтобы GC его собрал?
источник

AN

Alexander Nozik in Kotlin Community
Nikita Yatskivskiy
Ребят - https://stackoverflow.com/a/43889107/6793622
Ответ старый, вдруг чего с этого времени поменялось…
Каналы действительно необходимо закрывать через cancel()? Или достаточно закрыть скоуп, в рамках которого мы подписались на канал, и занулить ссылки на него, чтобы GC его собрал?
Если канал в скоупе, он закывается автоматом при отмене скоупа. Никакие ссылки занулять не надо
источник

NY

Nikita Yatskivskiy in Kotlin Community
> Если канал в скоупе

Имеет виду, если я consumeEach или onReceive у канала вызвал в каком-то скоупе?

private val someChannel = BroadcastChannel<String>(1)

someScope.launch {
  someChannel.openSubscription().consumeEach { print(it) }
}

someScope.cancel()
источник

NY

Nikita Yatskivskiy in Kotlin Community
И на этом можно спать спокойно. Всё так?)
источник

AN

Alexander Nozik in Kotlin Community
Nikita Yatskivskiy
> Если канал в скоупе

Имеет виду, если я consumeEach или onReceive у канала вызвал в каком-то скоупе?

private val someChannel = BroadcastChannel<String>(1)

someScope.launch {
  someChannel.openSubscription().consumeEach { print(it) }
}

someScope.cancel()
Надо посмотреть доку по openSubscription, чей скоуп он тащит
источник

NY

Nikita Yatskivskiy in Kotlin Community
А разве для всех каналов это не одинаково должно работать? Какой-нибудь наш класс в любой момент  может подменить канал на простой Channel
источник

AN

Alexander Nozik in Kotlin Community
Судя по всем, канал тащит скоуп из родителя, так что надо смотреть, в каком скоупе родитель открывался
источник

AN

Alexander Nozik in Kotlin Community
Nikita Yatskivskiy
А разве для всех каналов это не одинаково должно работать? Какой-нибудь наш класс в любой момент  может подменить канал на простой Channel
у простого нет подписок
источник

AN

Alexander Nozik in Kotlin Community
Подписки надо явно закрывать. Или закрывать родительский канал, тогда они закроются сами
источник

NY

Nikita Yatskivskiy in Kotlin Community
private val someChannel: ReceiveChannel = BroadcastChannel<String>(1).openSubscription()
или
private val someChannel: ReceiveChannel = Channel<String>(1)

someScope.launch {
  someChannel.consumeEach { print(it) }
}

someScope.cancel()
источник

AN

Alexander Nozik in Kotlin Community
> Subscribes to this BroadcastChannel and returns a channel to receive elements from it. The resulting channel shall be cancelled to unsubscribe from this broadcast channel.
источник

AN

Alexander Nozik in Kotlin Community
если закрывается родительский канал, закрывается и подписка. Обратно не работает
источник

AN

Alexander Nozik in Kotlin Community
И для канала скоуп определяется в месте создания, а не в месте потребления, в этом отличие от Flow
источник

NY

Nikita Yatskivskiy in Kotlin Community
То есть, надо всегда закрывать канал, если мы его создали через openSubscription()? Чтобы утечек не было. Недостаточно закрыть скоуп.
Что-то не до конца понимаю ((
источник