@kotlin_lang

Страница 899 из 982
Quantum Harmonizer
29.09.2018
11:32:08
Например: userName.map(isEmpty())

Mikhail
29.09.2018
11:32:14
а есть kotlin repl чтобы был standalone?

Quantum Harmonizer
29.09.2018
11:32:39
а есть kotlin repl чтобы был standalone?
Посмотри исходники репл-бота

Konstantine
29.09.2018
11:33:02
Google
Vladimir
29.09.2018
11:33:24
Например: userName.map(isEmpty())
Тогда userName.map(::isEmpty)

Quantum Harmonizer
29.09.2018
11:33:50
Тогда userName.map(::isEmpty)
Это прекрасно, но генерирует немаленький класс. Да ещё и новый для каждого места вызова.

Konstantine
29.09.2018
11:34:23
Тогда наращиваются алиасы listIsEmpty и stringIsEmpty...
Иначе наращивается дублирование isEmpty.

Quantum Harmonizer
29.09.2018
11:35:05
Konstantine
29.09.2018
11:35:17
По мне явное лучше неявного. :) А то какие-то там isEmpty.

Mikhail
29.09.2018
11:36:05
Например: userName.map(isEmpty())
у тебя не получится сделать полиморфную map(isEmpty) без тайпклассов или придется руками оборачивать

Quantum Harmonizer
29.09.2018
11:36:48
Проблема в том, что клиент библиотеки будет ожидать ровно такого названия

Konstantine
29.09.2018
11:37:46
звучит как программирование на го
На python. По мне идея таких функций вообще такое себе.

Quantum Harmonizer
29.09.2018
11:38:21
Google
Mikhail
29.09.2018
11:38:33
А как можно обернуть?
ну типа интерфейс Emptyable<T>, у него fun isEmpty() и много-много factory method-ов (которые можно оформить как operator fun <T> Emptyable.Companion.invoke(T): Emptyable<T>)

Vladimir
29.09.2018
11:38:36
Это прекрасно, но генерирует немаленький класс. Да ещё и новый для каждого места вызова.
С чего бы? Конкретно при таком использовании точно не сгенерит. А так заморачиваться и уродовать API ради сомнительных оптимизаций я бы не стал.

Konstantine
29.09.2018
11:38:55
Рассмотрю альтернативы.
Уже предложили экстеншены.

Mikhail
29.09.2018
11:38:57
выведи имя класса в repl

Vladimir
29.09.2018
11:39:25
сгенерит
Пример кода, пожалуйста

Quantum Harmonizer
29.09.2018
11:39:33
Уже предложили экстеншены.
Вообще мимо кассы.

Konstantine
29.09.2018
11:40:13
Вообще мимо кассы.
Все лучше чем конфликтующие глобальные функции)

Vladimir
29.09.2018
11:40:25
val a = ::method
Я про ситуацию с вызовом map/filter/etc Если нужна ссылка на метод, то конечно нужно будет во что-то обернуть

Vladimir
29.09.2018
11:44:06
Я выше написал, что имел в виду использование в inline-фукнциях вместо лямбды. Если в таком виде использовать ссылку на функцию, компилятору конечно придётся её обернуть в класс.

Mikhail
29.09.2018
11:44:18
а нет

для iterable inline

для sequence - нет

В любом случае если @Harmonizr собирается ее куда-либо отдавать, то она не будет inline 100%

Google
Konstantine
29.09.2018
12:12:13
Нет, потому что предложенный вариант не работает вообще
На сколько я понял твой вариант тоже - ибо функции конфликтуют:)

Quantum Harmonizer
29.09.2018
12:12:50
На сколько я понял твой вариант тоже - ибо функции конфликтуют:)
Ну тогда и вариант идти копать картошку годный

Konstantine
29.09.2018
12:13:07
Ну тогда и вариант идти копать картошку годный
По мне годно переименновать всё. А там уже твое дело)

Igor
29.09.2018
13:34:02
Как лучше поступить, если мне нужны две конфликтующих функции — fun isEmpty(): (Collection<*>) -> Boolean и fun isEmpty(): (CharSequence) -> Boolean?
Я в таких случаях обычно делаю isEmpty1 isEmpty2 isEmpty3 и так далее, и пишу доки на функции. В целом, пользоваться таким подходом вполне себе возможно. Альтернативно, можно создать union-тип на sealed классах, и определить функцию уже на нем. Если не принципиальны затраты на создание объекта класса, то жить можно. Ну и третий вариант: fun isEmpty(): (Any) -> Boolean = { o -> when (o) is Collection<*> -> o.isEmpty() is CharSequence -> o.isEmpty() else -> false } в целом тоже вполне жизнеспособный вариант.

Quantum Harmonizer
29.09.2018
13:40:44
Я тут подумал... isEmpty... — а дальше автодополнение поможет. Всем спасибо.

Igor
29.09.2018
13:43:33
А есть тут кто-нибудь, кто пишет полностью на чистых функциях domain/data слои?)

Igor
29.09.2018
13:57:04
Что в вашем понимании domain/data слои?
бизнес-правила и работа с источниками данных.

Без pojo?
с dto/dbo/entity иммутабельными

Quantum Harmonizer
29.09.2018
13:57:30
с dto/dbo/entity иммутабельными
Ну это я только так обычно и делал, а сейчас иду к обзёрвабельным

Igor
29.09.2018
13:58:06
Quantum Harmonizer
29.09.2018
13:58:55
То есть все остальное – stateless objectы?
Всё, что не связано с фреймворком, чтоб его, — да

Igor
29.09.2018
14:00:51
Всё, что не связано с фреймворком, чтоб его, — да
Ага. Понял. То есть в целом у вас любая функция выглядит как f: (Params) -> ReaderT<ForObservableK, Dependencies, Either<Throwable, Result>> или каким-то другим путем пошли?

Мне просто интересно общее впечатление, и насколько от этого стало проще жить.

Igor
29.09.2018
14:04:13
Даже депенденси в функцию передавать?
А как иначе-то?) Иначе не stateless. Грубо говоря, мне хотелось бы в итоге прийти к следующему виду проектов: 1) AppStore со стейтом 2) Graph со стейтом 3) Views со стейтом 4) Все остальное – полностью stateless, все зависимости только через функции.

Quantum Harmonizer
29.09.2018
14:05:02
Konstantin
29.09.2018
14:42:00
А есть тут кто-нибудь, кто пишет полностью на чистых функциях domain/data слои?)
Я не уверен, что data возможен на чистых функциях. Всякие операции с "внешним" миром по определению грязные же.

Google
Konstantin
29.09.2018
14:43:57
Ну то есть если они будут продюсить изменения где-то еще, то это уже не чистые функции

Igor
29.09.2018
14:44:13
Я не уверен, что data возможен на чистых функциях. Всякие операции с "внешним" миром по определению грязные же.
Ну, для этого то есть IO монада. И грязь таки-вся будет только в месте, где мы непосредственно все это выполняем. То есть, почти всегда это будет в Presentation.

Ну то есть если они будут продюсить изменения где-то еще, то это уже не чистые функции
А вот это уже ближе к реальной сути проблемы. Но все еще решается правильным выстраиванием data flow в приложении.

Ну то есть если они будут продюсить изменения где-то еще, то это уже не чистые функции
Что вы подразумеваете под "где-то" еще, кстати? В стейте в рамках приложения, или во внешнем стейте?

Konstantin
29.09.2018
14:50:21
Что вы подразумеваете под "где-то" еще, кстати? В стейте в рамках приложения, или во внешнем стейте?
Да где угодно, любой сайд-эффект или чтение. Ну, собсно, да, io монада и вот это все.

Igor
29.09.2018
14:51:22
Да где угодно, любой сайд-эффект или чтение. Ну, собсно, да, io монада и вот это все.
Ну, от этого-то не деться никуда, вопрос в том, насколько явно оно будет проявляться. Сделать обработку сайд-эффектов в одном месте в приложении (ну или в одном месте в контексте экрана) вполне возможно, и весь остальной код будет выглядеть мило и опрятно.

Admin
ERROR: S client not available

Mikhail
29.09.2018
16:17:10
Igor
29.09.2018
16:20:26
вот интересно, получается data слой возвращает IO, мы маппим по ней domain и выполняем ее в презентере?
Типа того. У меня правда на текущий момент, так как с arrow только знакомился, IO местно используется в data, далее конвертируется в Observable, но в целом принцип один, да.

Quantum Harmonizer
29.09.2018
18:36:58
интересно, а есть способы автоматизации генерации @ReplaceWith при рефакторинге? @Deprecated("Was generalized.", ReplaceWith("map(isNonEmptyCollection())", "(...).map", "(...).isNonEmptyCollection"))

Igor
29.09.2018
19:14:45
Да, снова вопрос к контрактам, могут ли они контролировать сайд-эффекты. Вроде как нет.
Ну, в целом, контракты-то этим заниматься и не будут. На уровне presentation будут же ошибки разруливаться. Или я вас не совсем понял.

Quantum Harmonizer
29.09.2018
19:44:17


Andrey
29.09.2018
19:45:19
?

Artem
29.09.2018
21:11:58
Погоди, это где?

Жабра
29.09.2018
21:17:22
https://insert-koin.io/docs/1.0/documentation/koin-core/index.html#_using_scopes я правильно понимаю, что модуль со скоупом всё равно надо загрузить через loadKoinModules, просто ещё накладывается необходимость создавать и уничтожать их?

Quantum Harmonizer
29.09.2018
21:29:43
Что там внутри в isNonEmptyCollection?
Эквивалент return Collection<*>::isEmpty

Погоди, это где?
https://github.com/Miha-x64/reactive-properties/blob/master/properties/src/main/kotlin/net/aquadc/properties/extensionsInline.kt#L293

Artem
29.09.2018
21:30:36
Понял, спасибо

Google
picty
30.09.2018
09:45:59
Ребята, подскажите, заметил такой момент: enum class ExampleEnum { A, B } subscribeOnExample().subscribe{ when(it){ //it is ExampleEnum ExampleEnum.A -> ... ExampleEnum.B -> ... } Но вот на when(it) — предупреждение: Enum argument can be null in Java, but exhaustive when contains no null branch Что с этим делать? Писать else -> {} — предупреждение уходит, но смысл данного действа несовсем понятен в данном случае.

picty
30.09.2018
09:49:03
null -> {...}
ок, спасибо

Dmitry
30.09.2018
11:43:16
else лучше

Nikolay
30.09.2018
11:44:11
else лучше
Новые знания енума будут глотаться этим else молча, нехорошо так делать.

Dmitry
30.09.2018
11:44:42
их не глотать надо, а кидать что-то типа IllegalArgumentException

Quantum Harmonizer
30.09.2018
11:51:34
Dmitry
30.09.2018
11:54:21
не во всех случаях работает. например, если скомпилить код с одной версией enum-а, а в рантайме подкинуть другую

Nikolay
30.09.2018
11:57:02
Dmitry
30.09.2018
12:06:40
например, делаешь плагин, который использует апишку контейнера. затем версия контейнера обновилась

очень искусственный такой пример

Konstantine
30.09.2018
12:07:30
Есть тут кто-нибудь, кто использовал корутины с clean'ом? Как вы их вообще использовали? Какие функции у вас были suspend и где они вызывались? В идеале посмотреть код, может у кого пет-проджект завалялся.

Речь про андроид.

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