@kotlin_lang

Страница 695 из 982
Aleksandr
04.06.2018
13:36:01
тут можно вопрос по котлину + dagger?

OlegKrikun
04.06.2018
13:37:18
Вроде да =) по теме =)

Petr
04.06.2018
13:37:44
Aleksandr
04.06.2018
13:37:56
Google
Petr
04.06.2018
13:38:00
просто это самый частый вопрос)

Aleksandr
04.06.2018
13:38:12
есть у меня котлин класс например Helper.kt

в нем прям в корне (т.е. без слова class)

есть функция например updateToken

как мне сделать сюда инжект правильно?

просто это самый частый вопрос)
он гугглится на рза два

а вот свое я не могу понять

я так подозреваю что неправильный вообще подход к архитектуре?

OlegKrikun
04.06.2018
13:40:45
эээ... я как человек сильно далёкий от DI вообще и дагера в частности, хочу тебя спросить: ты уверен что это вообще нормально что то инжектить в метод???

Aleksandr
04.06.2018
13:41:07
нет конечно

не уверен

OlegKrikun
04.06.2018
13:41:38
яб на твоём месте инжектил в сущьности что использую хелпер и передавал зависимость в метод обычным путём

Google
dimiii
04.06.2018
13:42:02
есть у меня котлин класс например Helper.kt
Я сейчас посмотрел на вывод javap fun wtf() {} пошла в MainKt класс, если это полезно

Aleksandr
04.06.2018
13:42:15
т.е. если мне нужна зависимость которую я хочу инжектить, мне в лубом случае нужен класс, где будет жить эта перменная как глобальная?

OlegKrikun
04.06.2018
13:42:25
Что такое "инжектить в метод"?
»Aleksandr Osipov, [04.06.18 16:38] есть функция например updateToken »Aleksandr Osipov, [04.06.18 16:39] как мне сделать сюда инжект правильно?

Aleksandr
04.06.2018
13:43:32
я могу и неправильно написать

Quantum Harmonizer
04.06.2018
13:43:37
вообще, есть понятие setter injection, и это о другом

Aleksandr
04.06.2018
13:44:09
раньше у меня было такое DataManager.getInstance().apiManager который мне возвращал мой ретрофит

теперь я его переписал как @Provides для даггера и везде делаю примерно так @Inject lateinit var networkApi: NetworkApi

но это в классах, и это идет как переменная

Quantum Harmonizer
04.06.2018
13:46:03
Petr
04.06.2018
13:46:03
можно за пределами класса объявлять не только методы, но и поля может, их можно также инжектить?

всё равно сгенерится класс в итоге

Aleksandr
04.06.2018
13:47:25
хм

Andrew
04.06.2018
13:47:29
В Kotlin/JVM fun myFun(), определённая в myfile.kt с package org.mypackage, будет для джавки представлена как метод org.mypackage.MyfileKt.myFun(). Можно рядом с ней объявить обычную проперти и использовать вышеупомянутый setter injection.

Aleksandr
04.06.2018
13:47:31
я не знал что там можно проперти

Andrew
04.06.2018
13:47:38
Но это, ИМО, извращение.

Aleksandr
04.06.2018
13:47:44
вот

а как правильно сделать?

Google
Andrew
04.06.2018
13:48:14
Добавить ещё один параметр функции и передавать туда значение явно?

Aleksandr
04.06.2018
13:48:59
ладно updateToken такое, например еще есть функция logOut, лона может быть вызвана из 3 разных мест

Andrew
04.06.2018
13:49:16
Функции, которые объявлены вне классов, по-хорошему должн бть свободными от сайд-эффектов и не зависеть от чего-то внешнего, по крайней мере насколько это возможно. (Эту мысль можно развивать и на методы классов, но то уже другая тема).

Aleksandr
04.06.2018
13:49:44
везде инжектить этот network и просто переадть как параметр?

Andrew
04.06.2018
13:50:19
logOut — это уже метод штуки, которая отвечает за текущего пользователя. Самый простой вариант — положить её и соседей по смыслу в object SessionManager. Если он глобально зависит от этого network, то это уже не object, а класс с параметром network, да.

Petr
04.06.2018
13:50:30
везде инжектить этот network и просто переадть как параметр?
сделать отдельный класс для запросов, с которым будут работать остальные классы которым не очень надо знать про нетворк

если я правильно понял

Aleksandr
04.06.2018
13:50:48
я понял

спасибо всем

Andrew
04.06.2018
13:50:53
И инжектить SessionManager там, где он нужен, и network в SessionManager через конструктор.

Andrew
04.06.2018
13:51:38
глобальные функции === функции синглтонов, тоже должны быть без состояния и сайд-эффектов
Потому я и отметил, что как только появляется зависимость, синглтон должен сразу пропасть.

Но это всё о правилах хорошего тона при проектировании. Котлин их не навязывает, если кому-то хочется костылей — котлин любезно позволит их вставить :) Так что ответ выше о маппинге глобальных функций в методы классов *Kt актуален, само собой.

OlegKrikun
04.06.2018
14:48:51
яж правильно понимаю что пакадж локал не замутить нормально? =)

dimiii
04.06.2018
14:52:22
В идее можно настроить авто-форматирование так, чтобы импорт методов отделялся отдельным блоком от импорта классов?

Alexander
04.06.2018
14:57:53
В идее можно настроить авто-форматирование так, чтобы импорт методов отделялся отдельным блоком от импорта классов?
Предположу, что для Котлина таких вещей не подвезли. Обычно подобные настройки в settings -> editor -> code style -> kotlin -> imports

OlegKrikun
04.06.2018
14:58:22
яж правильно понимаю что пакадж локал не замутить нормально? =)
и ваще чот мне кажется что я не доконца вкуриваю internal кинте в меня чем то более расширеным чем https://kotlinlang.org/docs/reference/visibility-modifiers.html

=))

Google
Bogdan
04.06.2018
14:59:18
но в жабе это все равно будет паблик

OlegKrikun
04.06.2018
14:59:52
Мдя, т.е. пакедж локал никак? тока пихать всё в один файл и делать приват?

Anton
04.06.2018
15:01:24
ну сделай протектед и не открывай

OlegKrikun
04.06.2018
15:01:24


Andrew
04.06.2018
15:01:44
и ваще чот мне кажется что я не доконца вкуриваю internal кинте в меня чем то более расширеным чем https://kotlinlang.org/docs/reference/visibility-modifiers.html
internal — открыто модулю, закрыто наружу. Если дробить проект на модули, к примеру, гредловые — намного более удобная штука в сравнении с искуственными ограничениями package private.

OlegKrikun
04.06.2018
15:02:24
dimiii
04.06.2018
15:03:52
Предположу, что для Котлина таких вещей не подвезли. Обычно подобные настройки в settings -> editor -> code style -> kotlin -> imports
Спасибо. Действительно настроек для Java побольше будет, в том числе есть layout static imports separately

Alexander
04.06.2018
15:06:53
Спасибо. Действительно настроек для Java побольше будет, в том числе есть layout static imports separately
Можешь попробовать зареквестить настройку. Поскольку такое разделение не противоречит code convention, то почему бы и нет :)

OlegKrikun
04.06.2018
15:10:36
вроде в кодестайлах написано что импорты должны быть единым блоком (возможно в гугл-андроед стайлах)

Dumitru
04.06.2018
18:52:11
всем привет, тут такой вопрос есть extension function fun<T> ArrayList<T>.map(f : (value : Any) -> Unit ) { f(this) } я его трогать не могу и есть такой код val list = arrayListOf(1,2,3).map { it } println(list) выводит kotlin.Unit (ожидаемо) как я могу явно сказать какой map() использовать?

OlegKrikun
04.06.2018
19:00:08
Если проблема в том что у тебя не та екстеншен функция вызывается, то посмотри в импорты

Dumitru
04.06.2018
19:00:39
Надо явно сказать какую функцию вызывать

OlegKrikun
04.06.2018
19:01:45
Я хз, беги от туда, с такими то условиями ?

А если после точки до map вставить нужный пакет (аля джава) не воркает?

Dumitru
04.06.2018
19:03:05
Не, пробовал

Dumitru
04.06.2018
19:04:02
Основная фишка в том что у нас есть свой мап, мы его юзали И в одном тесте мне нужен был родной мап, а Котлин брал наш

Google
OlegKrikun
04.06.2018
19:04:28
Сделай экстеншен фукнцию kotlinMap

OlegKrikun
04.06.2018
19:04:44
И вызывай в ней котлиновский мап

Dumitru
04.06.2018
19:04:50
Ну пока это лучшее решение

Dmitry
04.06.2018
19:04:54
import not.so.good.code.map as evilMap скроет твой map в скоупе текущего файла

Artiom
04.06.2018
19:06:29
Лол

Bogdan
05.06.2018
04:03:24
Ужас, имхо

Андрей
05.06.2018
04:11:39
Сам-то как думаешь?

Mikhail
05.06.2018
04:14:03
Сам-то как думаешь?
Как-то не очень смотрится

Андрей
05.06.2018
04:15:13
=)

Bogdan
05.06.2018
04:25:36
Как-то не очень смотрится
Много времени нужно что бы понять

Eugene
05.06.2018
05:59:09
val newData = data.toList() newData[0].isPlaying = !data[0].isPlaying

Bogdan
05.06.2018
06:00:44
val newData = data.toList() newData[0].isPlaying = !data[0].isPlaying
Почему они не равны ? В этом вопрос

Eugene
05.06.2018
06:00:53
Как сделать копию data, чтобы при изменении поля в одном из элементов newData, в data оставались старые значения

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