@kotlin_lang

Страница 878 из 982
Andrey
18.09.2018
16:35:03
и в этом тоже спасибо )
Ну вообще я бы не советовал делать подобные циклы по ссылкам. Это может привести к внезапной бесконечной рекурсии. Например: class A(bRef: () -> B) { val b: B by lazy(bRef) override fun toString(): String = "A(b=$b)" } class B(val a: A) { override fun toString(): String = "B(a=$a)" } Теперь попытка вызвать toString у любого из объектов типа A или B приведёт к StackOverflowError, так как A.toString содержит шаблон, в котором неявно вызывается B.toString, который содержит шаблон, в котором неявно вызывается A.toString ...

При этом IDE вам не подскажет, что у вас тут рекурсия, так как IDE не умеют находить взаимную неявную рекурсию. И если код будет сильно больше, мест где такое может произойти тоже увеличится, а находить их станет сложнее.

Alexander
18.09.2018
16:43:14
Это только у меня, или serialization плагин стабильно ломает идею?

Google
Alexander
18.09.2018
16:49:11
Что-то невнятное. Сейчас включу его обратно и посмотртю

java.lang.AbstractMethodError

at org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension$Companion$getInstance$1.generateSyntheticMethods(SyntheticResolveExtension.kt:70)

Рушится на реализации сериализатора

Oleg
18.09.2018
16:52:48
либо ему не нравится, что версия котлина твоя, и версия котлина в либе не совпадает либо попробуй, чтобы идея через градл собирала проект (там в настройках есть такая галочка), очень много ошибок убирает

Konstantin
18.09.2018
16:52:55
есть некоторый data class FormState состоящий из компонентов вида data class SelectState, data class TextState. есть обсервабл излучающий этот FormState, однако если юзать оператор distinctUntilChanged то консюмер не получает новый стейт если внутри какого либо SelectState/TextState что то поменялось, т.е. я так понял equals не отрабатывает

это самому надо писать что ли? т.е. типа equals работает только для простых типов но не для сложных конструкций?

Alexander
18.09.2018
16:54:48
либо ему не нравится, что версия котлина твоя, и версия котлина в либе не совпадает либо попробуй, чтобы идея через градл собирала проект (там в настройках есть такая галочка), очень много ошибок убирает
Это я все знаю. Мне тогда проще плагин отключить. Я так понял, что он позволяет линтеру не ругаться на методы, которые генерятся плагином.

Alexander
18.09.2018
16:56:04
это самому надо писать что ли? т.е. типа equals работает только для простых типов но не для сложных конструкций?
equals работает для всего, для чего он прописан. Но есть сравнение по ссылке, надо проверить, что не оно используется

Konstantin
18.09.2018
17:04:22
а, добавил явный компаратор и стало работать как задумано .distinctUntilChanged { t1: FormState, t2: FormState -> t1 != t2 }

Mikhail
18.09.2018
17:09:42
Google
Mikhail
18.09.2018
17:10:06
вообще очень странное поведение, можно взглянуть на код?

Roman
18.09.2018
17:17:27
ребят, какие сейчас фреймворки для тестирования на котлине в почете? Spek, Mokk, KotlinTest? Есть ли что-то еще интересное для тестов, особенно в контексте андроида?

Roman
18.09.2018
17:24:52
Junit4
+Mockito-Kotlin?

Badya
18.09.2018
17:25:10
+ kotlin-test-junit4

+Mockito-Kotlin?
Не пользуюсь моками

Если у вас Даггер нормально заведён по гайдам - моки не нужны

Roman
18.09.2018
17:28:12
Если у вас Даггер нормально заведён по гайдам - моки не нужны
тестовые инмплементации через него подсовывать?

вроде как сам гугл рекомендует так не делать

Badya
18.09.2018
17:29:50
На моей памяти там был хороший рабочий пример в доках, сейчас не вспомню - полгода андройд в глаза не видел уже

Roman
18.09.2018
17:35:27
а что-то более kotlin way чем AssertJ сущетсвует в природе?

Igor
18.09.2018
17:45:02
kotlin-test
А что там есть? На вид, тот же Spek

Alexander
18.09.2018
17:45:30
Это просто обертка над Junit

кросс-платформенная

Igor
18.09.2018
17:48:01
Прикол, там даже есть property-based тесты https://github.com/kotlintest/kotlintest/blob/master/doc/reference.md#property-based-testing-

Badya
18.09.2018
17:49:25
я имел ввиду https://kotlinlang.org/api/latest/kotlin.test/index.html

Igor
18.09.2018
18:13:03
Допустим, я хочу объявить общие для всех под-проектов зависимости. Если с репозиториями все просто, то с зависимостями что-то не могу найти вменяемой доки, может кто-то навести на путь истинный? allprojects { def repositories = project.getRepositories() def dependencies = project.getDependencies() repositories.add(repositories.mavenCentral()) repositories.add(repositories.jcenter()) dependencies.??? }

Roman
18.09.2018
18:17:38
я имел ввиду https://kotlinlang.org/api/latest/kotlin.test/index.html
хочется еще услышать какие-то более "хипстерские" мнения =))

Google
Badya
18.09.2018
18:32:37
Хотя они все мало полезные какие-то

Для красивого диффа больших объектов можно взять javers

Badya
18.09.2018
18:41:39
Иииии нет, не работает. Гист: https://gist.github.com/komigor/4a6176bcd69c03991c7e13740da13142
Мне понравилось как решена проблема тут https://github.com/k0shk0sh/FastHub/tree/fasthub/fasthub-v5

OlegKrikun
18.09.2018
18:42:41
Иииии нет, не работает. Гист: https://gist.github.com/komigor/4a6176bcd69c03991c7e13740da13142
яб попробывал таки указание репозитория вынести в allprojects и версии компилятора котлина поместил под иф с проверкой что есть плуг котлина так как то логичнее. Ну и без ошибки не понятно чо не так )

У меня то что я запостил работает =)

Igor
18.09.2018
18:43:47
Мне понравилось как решена проблема тут https://github.com/k0shk0sh/FastHub/tree/fasthub/fasthub-v5
И все-таки это не совсем то, чего мне хотелось бы :)

OlegKrikun
18.09.2018
18:48:21
Иииии нет, не работает. Гист: https://gist.github.com/komigor/4a6176bcd69c03991c7e13740da13142
и вынь блок сабпрожект из билдскрипта, его в корень

так оно точно работать не будет =)

Igor
18.09.2018
18:48:40
и вынь блок сабпрожект из билдскрипта, его в корень
вынес в allprojects то, что было в subprojects, все заработало

OlegKrikun
18.09.2018
18:49:19
ну и ладно =)

Alexander
18.09.2018
19:09:25
Кто-нибудь с kotlinx.serialization всерьез работал? Я не могу понять, как сделать кастомный сериализатор, чтобы он работал для JSON и прочего CBOR. Как делать бинарный сериализатор - понятно, KInput и KOutput. Но каким образом эта штука узнает, что писать в json?

Igor
18.09.2018
19:24:42
Может кто-нибудь посоветовать хороший фреймворк для краулинга в идеале написанный на kotlin?

Никита?❄️
18.09.2018
19:37:32
Igor
18.09.2018
19:38:59
что есть краулинг? собирать данные с сайтецов?
Да. Скорее всего свой в итоге напишу, так как хотелось бы на пуле проксей работать с определенной логикой выбора, а такое наврядли где-то предусмотрено.

Google
Тимур
18.09.2018
20:10:47
Alexander
18.09.2018
20:13:19
а почему вы думаете что KOutput не может писать в json ?
Судя по коду, может, но я не понимаю, как. Имен полей он не знает

Leonid
18.09.2018
20:18:50
они берутся из KSerialClassDesc по переданному индексу

Andrey
18.09.2018
20:18:51
циклы в объектах могут быть просто в силу природы этих объектов это обычное дело если бы от них было всегда легко избавиться, то не надо было бы изобретать всякие сложные gc, простой подсчет ссылок решал бы все вопросы а так сплошь и рядом циклы и gc в каждом втором языке
Могут. Я просто написал, что это как раз такой случай, так как вы изначально говорили о дата классах, а для них естественным образом определяется структурная эквивалентность и toString, которые, при наивной имплементации, дадут бесконечную рекурсию.

Alexander
18.09.2018
20:20:32
они берутся из KSerialClassDesc по переданному индексу
Спасибо. Об этом не подумал. Буду завтра шерстить код на эту тему

Leonid
18.09.2018
20:21:09
можно сгенерированный код посмотреть через show kotlin bytecode - decompile to java, ну или саму реализацию json’a

Alexander
18.09.2018
20:22:07
Я посмотрел. Там все довольно запутанно и без документации. Сразу не разобрался.

Про дескриптор вообще не сообразил, думал, что там все как в яве

Admin
ERROR: S client not available

Leonid
18.09.2018
20:29:22
Без документации – это да ? Можно почитать KEEP, который разъясняет, для чего нужны пачки методов. Но там имена интерфейсов новые

Alexandr
19.09.2018
04:20:56
что то кроме срача про DI полезное было?

это по классике, везде так решается

кстати, что котлин предоставляет в качестве object proxy engine? только jvm proxy?

Alexey
19.09.2018
04:53:14
прокси объекты спасут отца цикличных ссылок
А вы знаете толк в костыльных решениях

Alexandr
19.09.2018
05:02:59
А вы знаете толк в костыльных решениях
это не костыли, а элегантное решение в реальном мире

не все и не везде just simple

мне кажется все(ну по крайней мере большинство) из тех кто топит за ручную сборку и прочие kiss не заглядывали даже в gof

Alexey
19.09.2018
05:39:54
мне кажется все(ну по крайней мере большинство) из тех кто топит за ручную сборку и прочие kiss не заглядывали даже в gof
Для того чтобы понимать шаблоны проектирование не обязательно читать gof, да и большенство этих патернов очевидны и люди ими пользуются не зная, что это какие то там паттерны

не все и не везде just simple
Если это не так, то возможно что то пишете не так ¯\_(ツ)_/¯

Google
Alexey
19.09.2018
05:41:47
Если сможете привести пример где без таких костылей вроде dynamic proxy не обойтись, я признаю свою неправоту

Alexandr
19.09.2018
05:42:54
если обещаете не скатываться в срач, то приведу :)

Alexandr
19.09.2018
05:47:09
Клянусь на библии
ок, поставил на заметку, вернусь через пару часов и отпишу, пока работа кипит

Mikhail
19.09.2018
07:01:50
циклы в объектах могут быть просто в силу природы этих объектов это обычное дело если бы от них было всегда легко избавиться, то не надо было бы изобретать всякие сложные gc, простой подсчет ссылок решал бы все вопросы а так сплошь и рядом циклы и gc в каждом втором языке
Циклы в объектах - да, обычное дело. Но натягивать циклы на иммутабельные дата классы лучше не надо. Они не для этого. Да и практически всегда циклические зависимости можно разрулить, введя посредника

Quantum Harmonizer
19.09.2018
07:23:58
мне кажется все(ну по крайней мере большинство) из тех кто топит за ручную сборку и прочие kiss не заглядывали даже в gof
А зачем? Описания этих (и некоторых других) антипаттернов давно есть в Википедии.

Mikhail
19.09.2018
07:33:27
Alexey
19.09.2018
07:33:51
Quantum Harmonizer
19.09.2018
08:15:29
Если сможете привести пример где без таких костылей вроде dynamic proxy не обойтись, я признаю свою неправоту
Я делал такие костыли, когда нужно было изменить урл, на который ходит всё приложение. Лечится полной пересборкой графа объектов, усугубляется состоянием в них.

Тимур
19.09.2018
09:42:02
Циклы в объектах - да, обычное дело. Но натягивать циклы на иммутабельные дата классы лучше не надо. Они не для этого. Да и практически всегда циклические зависимости можно разрулить, введя посредника
Бывает всякое. Жизнь богаче представлений программиста об идеальной архитектуре. Простой пример: есть две карты в игре. На каждой стоит телепорт, который ведет на другую карту. Карта хранит ссылки на все объекты, которые на ней стоят, в том числе телепорты. Телепорты хранят ссылки на соседнюю карту. Цикл: карта A => телепорт A => карта B => телепорт B => карта A

Mikhail
19.09.2018
09:43:52
Бывает всякое. Жизнь богаче представлений программиста об идеальной архитектуре. Простой пример: есть две карты в игре. На каждой стоит телепорт, который ведет на другую карту. Карта хранит ссылки на все объекты, которые на ней стоят, в том числе телепорты. Телепорты хранят ссылки на соседнюю карту. Цикл: карта A => телепорт A => карта B => телепорт B => карта A
и телепорты умеют прям инстанциировать карту со всеми обьектами в игре? Или они обращаются к менеджеру сцен с просьбой "Заргрузи мне эту карту"? По крайней мере, в Unity 3D телепорты должны хранить только id карты которую они должны загрузить и ссылку на менеджер сцен, который выступает медиатором между сценами

Mikhail
19.09.2018
09:49:01
это описатели статические данных, ресурсы, не динамика и это не Unity
ок, если это описано в ресурсах, то ты не вставляешь в объект телепорт целиком карту

ты оставляешь ссылку на нее

например, id

Тимур
19.09.2018
10:06:55
ок, если это описано в ресурсах, то ты не вставляешь в объект телепорт целиком карту
не вставляю, просто есть runtime телепорты и карты и их статические ресурсные описания просто надо рассказывать подробности, без них может быть непонятно но еще раз повторюсь, есть религиозные представления программиста об идеальной архитектуре а есть практика, которая иногда в эти представления не вписывается

Страница 878 из 982