@kotlin_lang

Страница 962 из 982
Anna
19.10.2018
15:29:09
Так это же и на тайп классах делается
дак выше и пришли к тому, что по выразительности похоже

Andrey
19.10.2018
15:29:18
А, да

Всё, нафиг. Уже забывать стал, о чём говорили

Google
Egor
19.10.2018
15:29:39
Тайпклассы идеологически должны создавать контексты другого вида

Alexander
19.10.2018
15:29:46
хм, но ведь member declaration есть? что мешает s/this/parameter1
Я так понял, что сейчас мембер экстеншены просто объявляются методами класса со специальной пометкой, что первый параметр - ресивер. Для того, чтобы их было много, надо менять все метаданные.

Mikhail
19.10.2018
15:30:20
что мешает сделать статик метод с двумя параметрами-ресиверами?

Alexander
19.10.2018
15:30:37
Речь о мемберах.

Mikhail
19.10.2018
15:30:37
с термя

Alexander
19.10.2018
15:30:49
Не знаю. Думаю, что структура метаданных.

Mikhail
19.10.2018
15:30:55
погодь погодь

мы же вроде не о member говорили

а о вложенных экстеншнах

Alexander
19.10.2018
15:31:27
А это одно и тоже. Два ресивера == мембер экстеншен

метод виден только внутри первого ресивера, когда применяется ко второму

Mikhail
19.10.2018
15:31:51
ну не совсем, мемберу доступны приватные члена класса

Google
Alexander
19.10.2018
15:32:22
Сейчас это мембер экстеншен. Если будет двойной ресивер, то можно от этого термина вообще отказаться

Ну не совсем. Мембер эстеншен можно наследовать

Да, по видимости и наследованию разница есть, но по функциональности она сотрется

Mikhail
19.10.2018
15:33:47
мембер экстеншн просто метод класса с первым параметром ресивером

блин, был бы язык, в котором это есть, чтобы поиграться, почувствовать границы дозволенного

@Harmonizr ты спрашивал про доки к компилятору, нашел что нибудь? А то у меня не получилось даже собрать kotlin, валится с Gradle daemon dissapeared

Egor
19.10.2018
15:35:48
Можно теоретически на кодогенерации и на аннотациях сделать POC

И играться сколько хочется

Просто придется обойтись без интеллисенса :^)

Alexander
19.10.2018
15:36:31
Было бы хорошо. У меня есть интуитивное ощущение, что там море возможностей, но времени на кодогенерацию совершенно нет

Andrey
19.10.2018
15:40:51
В принципе, с точки зрения компилятора, конструкции вида fun A.B.C.foo() {...} можно "расахарить" в fun foo(a: A, b: B, c: C) {...} ну и там, где вызывается, тоже аналогично трансформировать при компиляции.

Anna
19.10.2018
15:43:47
Если есть две аналогичные по выразительности фичи, то скорее надо выбирать ту, которая проще реализуется конкретно в этом языке, и которая лучше вписывается в компанию к уже реализованным возможностям. Потому что крутое и всем привычное из других языков, но чужеродное будет потом сильно мешать ?

Egor
19.10.2018
15:48:01
(нет)

Anna
19.10.2018
15:49:26
Я не утверждаю, что одинаковые, я недоразобралась ещё. Но кроме того, есть же ещё компромисс между очень выразительным, но сложным, и более простым, но покрывающим большинство юзкейсов

Andrey
19.10.2018
15:50:54
Возможен ещё вариант с очень выразительным и простым

Google
Anna
19.10.2018
15:51:46
Возможен ещё вариант с очень выразительным и простым
Не, ну это конечно самый огонь. А есть что-то такое простое и крутое, чего в Котлине до сих пор нет?

Egor
19.10.2018
15:53:30
тайпклассы :^D

Andrey
19.10.2018
15:54:04
Тайп классы по своей природе - очень простая концепция. Просто интерфейс, который можно реализовать где тебе хочется. Роды типов (higher kinded types) - это уже сложнее для понимания, но позволяет реализовывать максимально общие тайп классы.

Alexander
19.10.2018
15:54:05
Если бы они были простыми, они бы уже были

KEEP-87 в том виде, в котором он предложен, довольно страшненький, а это типа самое-самое крутое, что смогли придумать.

При этом саму идею я поддерживаю.

Andrey
19.10.2018
15:55:08
Если бы они были простыми, они бы уже были
Просто в текущем KEEP их перемешели с родами типов и имплиситами (?), а надо на три фичи разбить.

Anna
19.10.2018
15:55:15
Воот. Это ж нужно в уже существующий язык вписать с минимальными фейспалмами как-то

Alexander
19.10.2018
15:55:30
Ну да, там страшное - это имплиситы. И лучше, чтобы их никогда не было

Sergey
19.10.2018
15:55:47
смотрю я на примеры arrow https://github.com/istonikula/realworld-api/blob/master/realworld-app/web/src/main/kotlin/io/realworld/profiles/Routes.kt#L78 и один вопрос только, а нафига?

Mikhail
19.10.2018
15:56:18
имплиситы затащили потому что в arrow скалисты

Andrey
19.10.2018
15:56:23
Притом имплиситы не надо. Это динамическое связывание, а оно очень легко в лапшу превращается

Alexander
19.10.2018
15:56:31
Там, я так понял, много скалистов, и еще много людей, для которых математическая стройность важнее юзабельности

Alexander
19.10.2018
15:57:41
ага

Поэтому его упорно отражают пока

В котлин комьюнити антискалистов больше, чем скалистов

Egor
19.10.2018
15:58:17
Уж по-крайней мере через Either/Try/Option ошибки собирать гораздо круче, чем в разных местах кода эксепшены отлавливать

Sergey
19.10.2018
15:59:53
https://github.com/istonikula/realworld-api/blob/master/realworld-domain/src/main/kotlin/io/realworld/domain/profiles/UseCases.kt#L70

Google
Alexander
19.10.2018
16:01:58
Вопрос вкуса, но я пожалуй согласен с тем, что Either не нужен

Sergey
19.10.2018
16:02:36
func Open(name string) (file *File, err error) чет сразу вспомнил..

Забавно такое слышать
я часто вижу как эксепшены юзают вместо goto и используют для логики приложения

Igor
19.10.2018
16:03:31
Зачем в разных, когда есть main ??
Ну рили, в новых корутинах еще проще стало ресурсы освобождать при ошибки/отмене. Поставил в корень web-контроллера try/catch и все.

Egor
19.10.2018
16:04:05
А на реакторе?

Кстати, это забавно, но те самые байндинги Arrow, которые там выше можно было наблюдать, юзают корутины

Sergey
19.10.2018
16:05:41
А на реакторе?
я честно хз зачем он на бекенде нужен

Sergey
19.10.2018
16:06:16
сделал канал и пихай себе SSE

Egor
19.10.2018
16:06:44
Ну оно и на реакторе также. Метод контроллера просто возвращает Flux и радуется

Sergey
19.10.2018
16:07:17
и зачем реактор, если можно сделать на корутинах не подключая здоровый реактор?)

Sergey
19.10.2018
16:09:53
Вкусовщина
ради интереса попробуй кому-то обьяснить как работают корутины, и как работает реактор. а потом посадить писать асинхронный код..

я не знаю как на мобилках или фронте, но на бекенде от него больше вреда

Igor
19.10.2018
16:11:11
Хех, как от rx на мобилках

Egor
19.10.2018
16:11:38
Ну, начать с того, что реактор всё-таки уже релизный, в отличие от корутин. Недостаток минорный, но для некоторых людей ощутимый

(не для меня, да)

Google
Sergey
19.10.2018
16:12:28
если исходить из этого, то можно и сказать что реактор под джавой отлично работает. точнее под нее и писан

Sergey
19.10.2018
16:13:00
Egor
19.10.2018
16:13:39
Но вообще говоря, я всё-таки не о тех ошибках говорил. Вот пример - контроллер получает какие-то данные, валидирует их, если не завалидировал - возвращает ошибку, потом пихает куда-то ещё, оттуда получает результат, который тоже может быть ошибкой. В зависимости от того, что за ошибка, контроллеру нужно вернуть определенный ResponseEntity. И как жить?

Egor
19.10.2018
16:16:05
Заниматься обработкой эксепшенов в котлине вообще неблагодарное дело, особенно когда есть sealed классы

Alexander
19.10.2018
16:17:07
Это абсолютно разные вещи

Можно делать Seled эксепшены, конечно.

Igor
19.10.2018
16:17:37
Заниматься обработкой эксепшенов в котлине вообще неблагодарное дело, особенно когда есть sealed классы
Как бы проблема в том, что код возвращающий Either все равно может кинуть исключения

Sergey
19.10.2018
16:18:33
Заниматься обработкой эксепшенов в котлине вообще неблагодарное дело, особенно когда есть sealed классы
если мне падает ошибка коннекта к базе или любой другой интернал, то для обработки мне нужно вернуть юзеру 500х ошибку и записать в лог что что-то пошло не так с валидацией и хреновым юзер инпутом отдельная тема

Руслан
19.10.2018
16:18:38
Заниматься обработкой эксепшенов в котлине вообще неблагодарное дело, особенно когда есть sealed классы
Главное, что в корутинах у тебя самый обычный exception handling, а вот в rx это все under the hood и нужно хорошо разбираться в Rx чтобы быть уверенным в результате. Лично я с Rx никогда не уверен что я правильно написал.

Egor
19.10.2018
16:19:33
Главное, что в корутинах у тебя самый обычный exception handling, а вот в rx это все under the hood и нужно хорошо разбираться в Rx чтобы быть уверенным в результате. Лично я с Rx никогда не уверен что я правильно написал.
в Rx наоборот ошибки веселей обрабатывать, все сразу в onError падает. Я когда пересел на корутины на андроиде с непривычки потерял обработку ошибок ?

Руслан
19.10.2018
16:20:12
Egor
19.10.2018
16:21:23
Если мы говорим про то чтобы обучить разработчика и что понятнее - то try/catch куда очевиднее
Там вон выше написали, что люди поток выполнения исключениями контроллируют. Вот и польза от простоты

Sergey
19.10.2018
16:22:27
Egor
19.10.2018
16:22:28
Я всем говорю, что у Rx и у корутин на самом деле разные юзкейсы. Но всё-таки плохой код на Rx встречается гораздо реже, чем когда люди исключения кидают

Руслан
19.10.2018
16:22:29
Вы учите язык, вы выучили try/catch, вы учите корутины - там try/catch, все понятно в этом плане. Вы учите язык, try/catch, вам дают rx, вас съел огр.

Я всем говорю, что у Rx и у корутин на самом деле разные юзкейсы. Но всё-таки плохой код на Rx встречается гораздо реже, чем когда люди исключения кидают
Какие-то нерелевантные примеры. Мы говорим что проще выучить, что легче понимается. А не про то что и как заобьюзить.

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