@kotlin_lang

Страница 675 из 982
Костя
17.05.2018
15:40:04
хотел сделать красиво, создание через один метод завернуть (

придется везде дергать newInstance() у каждого отдельно, ну или конструктор

обидно (

dimiii
17.05.2018
15:40:42
inline fun <reified T: Top> createT(): T = Bottom() as T - если ты хочешь продолжать эту содомию

Google
dimiii
17.05.2018
15:41:04
но лучше нинада

Boris
17.05.2018
15:42:04
Ммммм... Это не сработает.
Ещё как сработает, просто не во всех случаях ?

dimiii
17.05.2018
15:42:23
Ещё как сработает, просто не во всех случаях ?
А в каких не сработает? Я что-то не вижу

Костя
17.05.2018
15:42:35
лучше уж буду создавать объекты отдельно

Boris
17.05.2018
15:43:10
Ну как, если Т будет не боттом ?

Andrew
17.05.2018
15:43:12
тогда как лучше вынести такой create или сделать, чтобы он был как фабричный метод
Я без малейшего понятия, что вы деаете, но самый общий пример выглядит как-то так: class ViewModelProvider { private val factories = mutableMapOf<KClass<BaseViewModel>, () -> BaseViewModel>() fun register(clazz: KClass<BaseViewModel>, factory () -> BaseViewModel) { factories[clazz] = factory } fun <inline T: BaseViewModel> create() = factiories[T::class]() as T } Далее где-то, где вы собираете граф при запуске приложения, дёргаете provider.register(CustomersViewModel::class, { CustomersViewModel() }), а по месту у вас будет работать val cVM = provider.create(). Но это я от балды всё пишу и может не работать.

dimiii
17.05.2018
15:43:18
Костя
17.05.2018
15:43:29
А dagger и прочее?
ну даггер поюзал, кинул

можно и его впилить, разобрался с ним в принципе

но я хотел именно фабрики понять объектов

Google
Костя
17.05.2018
15:44:03
типо через общий метод создавать

Boris
17.05.2018
15:44:18
А зачем?

Костя
17.05.2018
15:44:33
ну не везде ж даггер пихать ?

хз

Andrew
17.05.2018
15:44:37
Вообще нормальные люди инжектят зависимости через конструкторы, а не через контейнеры, которые хранят всё, что только могут хранить.

Костя
17.05.2018
15:44:43
можно, но если не пихать

Жабра
17.05.2018
15:45:05
А в каких не сработает? Я что-то не вижу
sealed class Base class A : Base() class B : Base() inline fun <reified T : Base> createT(): T = A() as T Поставлю B - развалится.

Boris
17.05.2018
15:45:12
ну не везде ж даггер пихать ?
Даггер и фабрика это разные вещи

dimiii
17.05.2018
15:45:13
Andrew
17.05.2018
15:45:18
То есть ваш CustomerPresenter (или что вы там делаете) должен принимать CustomerViewModel как параметр конструктора, а не самостоятельно его откуда-то доставать.

dimiii
17.05.2018
15:45:27
test.kt:10:16: error: type parameter bound for T in inline fun <reified T : Top> createT(): T is not satisfied: inferred type Int is not a subtype of Top val wtf: Int = createT()

Костя
17.05.2018
15:45:56
Даггер и фабрика это разные вещи
согласен, хотя и тот , и тот в простом понимании создают объекты )

Boris
17.05.2018
15:46:02
kotlinc умный `
Умный, пока ему не скажут быть глупым

Костя
17.05.2018
15:46:35
Нет
ну скажем так даггер нечто большое, но создавать объекты тоже умеет

Костя
17.05.2018
15:47:08
Нет ?
да )

а вообще я его поюзал, захотел снова запить от аннотаций этих

ну их блин

Google
Костя
17.05.2018
15:47:22
)

Andrew
17.05.2018
15:47:31
Почему нет? Даггер вполне себе создаёт объекты, используя @Inject constructor(...).

Костя
17.05.2018
15:47:41
использовать и разобраться, разобрался, чтобы прямо стало хорошо, так не стало совсем (

Boris
17.05.2018
15:48:00
Как раз объекты ты в нем сам создашь, даггер инжекшн их провайдит

Костя
17.05.2018
15:48:01
ну да

но создашь же

Andrew
17.05.2018
15:48:33
Ну окей, если совсем строго писать, то даггер 2 генерирует код, который создаёт объекты, но суть от этого не меняется.

Костя
17.05.2018
15:49:03
сильно че-то не вызвало желания юзать даггер, выглядит он довольно неприятно как по мне ))

куча аннотаций не доставляет удовольствия

может только мне так, я хз

Жабра
17.05.2018
15:49:47
Так, а скажите мне пожалуйста - какой профит от фабрик в котлине?

Andrew
17.05.2018
15:50:01
Он и не нужен там, где девелопер сам управляет временем жизни компонентов. То есть почти везде, где нет андроида ?

Andrew
17.05.2018
15:50:32
Так, а скажите мне пожалуйста - какой профит от фабрик в котлине?
Такой же, как и профит от применения фабрик в любом другом языке. Чем котлин особенный?

Andrew
17.05.2018
15:51:44
Ок, какой профит от фабрик вообще?
Эмм, отделение логики создания объекта от места его использования?

Жабра
17.05.2018
15:52:49
Эмм, отделение логики создания объекта от места его использования?
Ну я пока что ни разу не встречал нормального использования фабрики в реальном коде, где это было бы целесообразно.

Andrew
17.05.2018
15:53:08
Фабрика обещает вам T и сама под капотом решает, как это T создавать, откуда брать то, что нужно для этого, и отдавать вам вообще T или его наследника.

Я просто слегка в смятении от этого вопроса — когда она нужна, она нужна и вы это понимаете.

Google
Andrew
17.05.2018
15:55:31
Это почти любой хорошо сделанный большой проект
Щас придут функциональщики и настучат за такие слова ?

Kirill
17.05.2018
15:56:10
Кейс когда есть различные регистрационные действия, которые надо выполнить при создании объекта.

Например.

Boris
17.05.2018
15:57:00
Если ты не можешь принять в конструктор инстанс, а должен его инстанцировать, то самый логичный способ отвязаться от конкретного типа это передавать в конструктор фабрику

В котлине это может быть просто функция

Но суть от этого не меняется

Костя
17.05.2018
15:57:42
неплохо я тут расшевелил )) вопросы )

Andrew
17.05.2018
16:02:37
В котлине это может быть просто функция
А, если речь о фабрика-класс и фабричная функция -- то да, я за собой заметил, что в котлине фабричные функции пишу чаще.

Boris
17.05.2018
16:22:15
У нас фабрика кэшировала объекты
По сути что там делает фабрика её пользователя волновать не должно

В идеальном мире ?

Igor
17.05.2018
16:27:16
куча аннотаций не доставляет удовольствия
Ага, это абсолют-дисгастинг. Лучше взять Koin - это почти, как руками фабрики писать, только на лямбдах и с удобным синтаксисом.

Жабра
17.05.2018
17:29:13
Подскажите, решил попытаться написать функцию, которая композирует две другие функции. fun main(args: Array<String>) { val first: (Int) -> String = Int::toString val second: (String) -> Char = { s: String -> s.first() } val result: (Int) -> Char = first plus second } inline infix fun <A, B, C> ((A) -> B).plus(block: (B) -> C) : ((A) -> C) = Не знаю что дальше написать. Это вообще возможно?

Жабра
17.05.2018
17:35:34
Материал по документациям, если не понятны использованные конструкции языка: https://kotlinlang.org/docs/reference/extensions.html https://kotlinlang.org/docs/reference/lambdas.html Формальная вещь, которая была выражена этим 'c': https://en.wikipedia.org/wiki/Function_composition (смотреть раздел примеров, остальное наверное просто так читать не стоит) Если своими словами. У нас есть данные. И мы их хотим как-то менять. Умножать, предвращать в другие типы данных и тд. Такое изменение может быть выражено функцией. Ну например: val multiplyByTwo = { x: Int -> 2 * x } Так мы получили функцию, которая берёт число и возвращает число, умноженное на два. val reverseAsString = { x: Int -> x.toString().reversed() } Так мы развернули цифры числа и вернули строку. Если мы хотим применить их, то мы просто пишем multiplyByTwo(5) или reverseAsString(123) Если хотим применить их вместе, то мы можем написать reverseAsString(multiplyByTwo(432)) Если же мы хотим получить такую функцию, которая будет делать тоже самое, но не прямо сейчас, то можно написать примерно то же самое: multiplyByTwoThenReverseAsString = { x: Int -> reverseAsString(multiplyByTwo(x)) } Однако хочется писать проще, чем каждый раз воротить такие конструкции. Особенно если функций будет не две, а больше. И выше написанная функция в какой-то мере помогает, т.к. можно написать: multiplyByTwoThenReverseAsString = multiplyByTwo.c(reverseAsString) Кода стало меньше (Прошу прощения за большие названия, мне лень придумывать лучше) Как упомянул Михаил, можно ещё лучше, т.к. просто функция в одну букву читается не очень хорошо. Да и скобочки не помогают. Хотелось бы что-то вроде: multiplyByTwoThenReverseAsString = multiplyByTwo andThen reverseAsString И в целом, так тоже можно: infix fun <A, B, C> ((A) -> B).andThen(f: (B) -> C): (A) -> C = { f(this(it)) } Дока: https://kotlinlang.org/docs/reference/functions.html#infix-notation Наверное всё. Код может не работать, т.к. писался сразу сюда.
Я бы только andThen немного переделал inline infix fun <A, B, C> ((A) -> B).andThen(crossinline block: (B) -> C) : (A) -> C = { a: A -> block(this(a)) }

OlegKrikun
17.05.2018
17:44:04
Промахнулся

Александр
17.05.2018
18:25:08
Всем привет. Искал ответ, но не нашел… Кто подскажет, почему val items: ArrayList<out String> = ArrayList() val items2 = ArrayList<out String>() В первом случае все верно, во втором ошибку подсвечивает?

Vladimir
17.05.2018
19:06:46
И у меня будет вопрос по этому примеру - какой смысл так писать?

Google
Kirill
17.05.2018
19:20:33
Потому что out и in пишутся при указании типа.
ровно это написано в сообщении об ошибке :)

Vladimir
17.05.2018
19:36:28
Это синтетический пример
Я просто такое вообще впервые увидел, думал может хитрость какая )

dimiii
17.05.2018
19:46:26
Забавно, я тут поинтересовался полным списком всех модификаторов - оказалось в Kotlin до кучи ключевых слов. https://kotlinlang.org/docs/reference/keyword-reference.html

Жабра
17.05.2018
19:54:55
Вот кстати, хочу задать вопрос - н***я так много кейвордов в языке??? Потоп какой-то. Ужас.

Igor
17.05.2018
20:14:01
Жабра
17.05.2018
20:15:33
Не сильно

Но поменьше

А тут, кажется, на все найдётся кейворд

Даже tailrec, блин, придумали.

OlegKrikun
17.05.2018
20:23:29
Даже tailrec, блин, придумали.
а чем они тебе мешают? =)

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