
Quantum Harmonizer
07.09.2018
13:45:02

Alexander
07.09.2018
14:54:37
Перевод статьи Mike Hearn'а о том почему они использовали Kotlin в Corda и какой опыт они получили. Оригинальная статья дотирована январем 2017.
https://habr.com/post/422549/
статя дОтирована?
В этом что-то есть

Google

Руслан
07.09.2018
14:55:05
Спасибо, уже поправил
Занятно что автор указал ссылкой на оригинал kotlin.link) https://kotlin.link/articles/Corda-Kotlin.html

Andrew
07.09.2018
14:56:39
https://www.corda.net/2017/01/10/kotlin/
А ссылочка с kotlin.link, кстати, ведёт вникуда.

Руслан
07.09.2018
14:57:49
Да, видимо поэтому. И оригинал в гугле не могу найти. Все-таки не зря архивировал статьи)

Andrew
07.09.2018
14:57:54
Похоже, сейчас у них блог на медиуме, и статья по Котлину туда не переехала. ?

abdurrahim hassan
07.09.2018
16:41:09
What is lambda?

ЕВГЕНИЙ
07.09.2018
16:54:30
Всем привет, ребят расскажите новичку зачем в котлин избавились от cheked exception?

dimiii
07.09.2018
16:56:27

ЕВГЕНИЙ
07.09.2018
17:01:19

dimiii
07.09.2018
17:03:51


ЕВГЕНИЙ
07.09.2018
17:08:09

Bogdan
07.09.2018
17:10:44

Google

Bogdan
07.09.2018
17:10:57
когда нул, когда и какое исключения


Ivan
07.09.2018
17:11:23
Ну просто странная история получается, например мы отправляем какой то вызов в библиотеку которая кидает например io, то есть получается мне нужно лезть в сорсы чтобы понять это? Я понимаю что мехонизм сам по себе сложный, я про то когда там через 5 классов исключение сквозное и тд, но тем не менее все знают что оно там есть и что его придется обрабатывать хочешь или нет :))
Метод не должен диктовать, как вызывающая сторона будет обрабатывать ошибки; объявление throws раскрывает детали имплементации; обработка проверяемых исключений, которые никогда не произойдут, замусоривает код. Проблем с проверяемыми исключениями больше, чем пользы, типы исключений должны быть в документации, а не в сигнатуре. В Джаве они были ошибкой, не зря современные языки от них отказались.
Пункт 7 в статье https://medium.com/@lukleDev/how-effective-java-may-have-influenced-the-design-of-kotlin-part-2-89844d62ddf3 и соответствующая глава в Effective Java.

Bogdan
07.09.2018
17:12:06

Igor
07.09.2018
17:14:54

ЕВГЕНИЙ
07.09.2018
17:19:49

Bogdan
07.09.2018
17:21:23
некоторые юзкейсы того не стоят

ЕВГЕНИЙ
07.09.2018
17:22:05

Bogdan
07.09.2018
17:23:42

Igor
07.09.2018
17:24:08

ЕВГЕНИЙ
07.09.2018
17:24:29
некоторые юзкейсы того не стоят
Я согласен как и в большинстве случаев связанных с какими то граничащими условиями это хорошо не везде и далеко не всегда я говорю о тех там 5% где это действительно смотрится хорошо а не о методах которые при делении на ноль кидают исключения :)

Ivan
07.09.2018
17:24:31

Andrey
07.09.2018
17:26:50
как можно правильно замапить data class с Any
data class ExampleDataClass(val number: Int)
если я сделаю так val example = msg.data to obj.dataClass
dataClass это ExampleDataClass::class.java
то получу на выхлопе ({z=2.0} а ожидаю Int

dimiii
07.09.2018
17:27:38

ЕВГЕНИЙ
07.09.2018
17:27:38

Bogdan
07.09.2018
17:28:21
если я правильно понял

dimiii
07.09.2018
17:29:28

Google

Bogdan
07.09.2018
17:29:34
тиапм таких лямб

dimiii
07.09.2018
17:29:46

Bogdan
07.09.2018
17:29:48
ну дык и функция чистая
а умник засунул чекед и теперь вместо обычной лямбы тебе нужн проверять исключения которое случается когда динозавры вымирают

dimiii
07.09.2018
17:30:43
Ну тут уже религия пошла. Кто то скажет по умному - раскрытие деталей реализации, а кто-то скажет - это часть контракта

Bogdan
07.09.2018
17:30:58
главная проблема чекед исключений, их начали юзать где не нужно

ЕВГЕНИЙ
07.09.2018
17:31:37

Bogdan
07.09.2018
17:31:37
(не спорю есть, но сколько их)

dimiii
07.09.2018
17:32:08

ЕВГЕНИЙ
07.09.2018
17:32:16
примеры
Создать файл и записать его :)

Andrey
07.09.2018
17:32:50

Bogdan
07.09.2018
17:32:54

Igor
07.09.2018
17:34:05

Bogdan
07.09.2018
17:35:36
SuccessOrFailure ?
я к примеру, чекед ничем не лучше, вот JS на самом деле если убрать динамическую типизацию станет топовым, а нет что-то TypeScript не зашел, ибо программисты говнокодят, а яп плохой

dimiii
07.09.2018
17:37:16
А каким образом контракт на метод нарушает инкапсуляцию?

Bogdan
07.09.2018
17:37:53
а вообще оффтоп пошел

Google

ЕВГЕНИЙ
07.09.2018
17:40:51


Bogdan
07.09.2018
17:42:17
У меня просто нет выбора, там потоки и функциональный код, связанный с дикрептованием hls, просто я хотел прерывать сразу если опираций не имеют смысла по той или иной причине, и я так понял что разработчикам на котлин это будет приятной неожиданностью какой метод упадет ...
возникла идея, не знаю поможет ли в данном примере, еще смотря что метод возращает, но базируется он на Empty. Возращаем некий буфер для чтения файла, и он буде пустой если не прочитан, и будет что-то типа статуса (пока непонятно как это красивей сделать, saled class), если тебя беспокоет что файл не прочитался ты проверишь, если нет то ты пропустишь проверку и не свалишся в рантайме, в этом и идея. Вот как ее правильней развить, остается открытым вопросом


ЕВГЕНИЙ
07.09.2018
17:52:27
возникла идея, не знаю поможет ли в данном примере, еще смотря что метод возращает, но базируется он на Empty. Возращаем некий буфер для чтения файла, и он буде пустой если не прочитан, и будет что-то типа статуса (пока непонятно как это красивей сделать, saled class), если тебя беспокоет что файл не прочитался ты проверишь, если нет то ты пропустишь проверку и не свалишся в рантайме, в этом и идея. Вот как ее правильней развить, остается открытым вопросом
Понимаешь весь косяк в том что там си, даже наверное больше ассемблер, он понятия не имеет о том что существуют saled классы и вообще что это за штука такая jvm, зато он знает что такое прерывания, и я подумал дай ка я возьму да и кину их клиенту, почему нет, например исключение связанное с целостностью, работа с библиотекой далее не имеет смысла, как и например если произошла какая та не штатная ситуация из разряда "кто то пишет в эту область" да можно это решить в плане устанавливать блокировки на деректорию , или пытаться пересоздать объекты, но просто лично мне было бы куда понятнее если бы я получил исключение а не чисел бы репу думая о том интересно у меня сейчас линейное шифрование или блочное, я вроде как пихаю блочное при линейной инициализации..
Короче я понял исключение проделки дьявола :))


Bogdan
07.09.2018
17:56:05
Понимаешь весь косяк в том что там си, даже наверное больше ассемблер, он понятия не имеет о том что существуют saled классы и вообще что это за штука такая jvm, зато он знает что такое прерывания, и я подумал дай ка я возьму да и кину их клиенту, почему нет, например исключение связанное с целостностью, работа с библиотекой далее не имеет смысла, как и например если произошла какая та не штатная ситуация из разряда "кто то пишет в эту область" да можно это решить в плане устанавливать блокировки на деректорию , или пытаться пересоздать объекты, но просто лично мне было бы куда понятнее если бы я получил исключение а не чисел бы репу думая о том интересно у меня сейчас линейное шифрование или блочное, я вроде как пихаю блочное при линейной инициализации..
получать исклюения от си-ой либы ? в джаве ?
>работа с библиотекой далее не имеет смысла
в этом суть Empty, объект есть, а результата не будет, или кинуть Nothing, то сделает код недостижимым, и прервет выолнения

Admin
ERROR: S client not available


Andrew
07.09.2018
17:56:24
Понимаешь весь косяк в том что там си, даже наверное больше ассемблер, он понятия не имеет о том что существуют saled классы и вообще что это за штука такая jvm, зато он знает что такое прерывания, и я подумал дай ка я возьму да и кину их клиенту, почему нет, например исключение связанное с целостностью, работа с библиотекой далее не имеет смысла, как и например если произошла какая та не штатная ситуация из разряда "кто то пишет в эту область" да можно это решить в плане устанавливать блокировки на деректорию , или пытаться пересоздать объекты, но просто лично мне было бы куда понятнее если бы я получил исключение а не чисел бы репу думая о том интересно у меня сейчас линейное шифрование или блочное, я вроде как пихаю блочное при линейной инициализации..
Вообще говоря в свете отсутствия checked exceptions Kotlin-разработчики должны быть чуть лучше Java-разработчиков подготовлены к внезапным исключениям. Так что @throws в документации к методу и ещё одной оговорки в текстовой документации на всякий случай должно быть достаточно.
Ну либо, как правильно подсказывает Богдан, вместо бросания исключений обработать прерывание в сишном коде и учесть его в результате метода — для JNI sealed класс ничем не отличается от обычного, просто вернуть инстанс либо объекта с результатом, либо объекта с ошибкой.


Bogdan
07.09.2018
17:56:46
Понимаешь весь косяк в том что там си, даже наверное больше ассемблер, он понятия не имеет о том что существуют saled классы и вообще что это за штука такая jvm, зато он знает что такое прерывания, и я подумал дай ка я возьму да и кину их клиенту, почему нет, например исключение связанное с целостностью, работа с библиотекой далее не имеет смысла, как и например если произошла какая та не штатная ситуация из разряда "кто то пишет в эту область" да можно это решить в плане устанавливать блокировки на деректорию , или пытаться пересоздать объекты, но просто лично мне было бы куда понятнее если бы я получил исключение а не чисел бы репу думая о том интересно у меня сейчас линейное шифрование или блочное, я вроде как пихаю блочное при линейной инициализации..
зачастую с либы как раз возращаю статус код, покрайне мере древние, и они не связаны с с++

Andrew
07.09.2018
17:56:58
Ну если я правильно понял и исключение кидается каким-нибудь env->ThrowException(...).

Bogdan
07.09.2018
18:02:29


ЕВГЕНИЙ
07.09.2018
18:09:25
Прерывание — это такая прикольная штука, которая происходит в отрыве от выполняющегося в данный момент кода, и в целом нетривиально из обработчика прерывания протащить ошибку в функцию, которая выполнялась до него — это почти наверняка через глобальное состояние делать придётся. Так что исключение в целом бросить сильно проще.
Да все верно, у меня so кидает статусы, два варианта либо где то в jni их мапить (рефлексией создавать классы) и откидывать клиенту или кидать исключение , с одной стороны исключения чем хороши, в моем случаи есть последовательность методов, например первичная инициализация состоит из 5 методов, которые следуют строго определенным образом (я знаю я даун можно объединить в 1 или делать объекты которые требуются функциям нижнего уровня в верхнем) тем не менее мне кажется лучше написать 1 try блок чем 5 проверок тип isSuccess() , с другой стороны клиенты котлин понятия не имеют (ТК врятли они будут да и читать документацию никому не нравиться) что эти методы могут порождать ошибки, тут такая интересная картинка появляется , если делать исключения, то это плохо, делать объекты тоже тк задержки + накладные расходы + гулячие данные + невнятный внешний интерфейс вот и я не знаю тип как лучше по этому и спросил чем мотивируется отказ от исключений, в принципе идеи ясны..


Andrew
07.09.2018
18:15:12
Да все верно, у меня so кидает статусы, два варианта либо где то в jni их мапить (рефлексией создавать классы) и откидывать клиенту или кидать исключение , с одной стороны исключения чем хороши, в моем случаи есть последовательность методов, например первичная инициализация состоит из 5 методов, которые следуют строго определенным образом (я знаю я даун можно объединить в 1 или делать объекты которые требуются функциям нижнего уровня в верхнем) тем не менее мне кажется лучше написать 1 try блок чем 5 проверок тип isSuccess() , с другой стороны клиенты котлин понятия не имеют (ТК врятли они будут да и читать документацию никому не нравиться) что эти методы могут порождать ошибки, тут такая интересная картинка появляется , если делать исключения, то это плохо, делать объекты тоже тк задержки + накладные расходы + гулячие данные + невнятный внешний интерфейс вот и я не знаю тип как лучше по этому и спросил чем мотивируется отказ от исключений, в принципе идеи ясны..
Ну конкретно правильность порядка вызова пяти функций -- это плохая задача для checked exceptions, ибо такое дев обработает приблизительно никак в 99% случаев :)
Может, эти нативные методы стоит спрятать за котлин-методами, которые поймают исключение и вернут в свою очередь sealed class? Нативную часть тогда менять не придётся, а потребитель получит удобный программный интерфейс.


ЕВГЕНИЙ
07.09.2018
18:17:34


Bogdan
07.09.2018
18:18:09
Да все верно, у меня so кидает статусы, два варианта либо где то в jni их мапить (рефлексией создавать классы) и откидывать клиенту или кидать исключение , с одной стороны исключения чем хороши, в моем случаи есть последовательность методов, например первичная инициализация состоит из 5 методов, которые следуют строго определенным образом (я знаю я даун можно объединить в 1 или делать объекты которые требуются функциям нижнего уровня в верхнем) тем не менее мне кажется лучше написать 1 try блок чем 5 проверок тип isSuccess() , с другой стороны клиенты котлин понятия не имеют (ТК врятли они будут да и читать документацию никому не нравиться) что эти методы могут порождать ошибки, тут такая интересная картинка появляется , если делать исключения, то это плохо, делать объекты тоже тк задержки + накладные расходы + гулячие данные + невнятный внешний интерфейс вот и я не знаю тип как лучше по этому и спросил чем мотивируется отказ от исключений, в принципе идеи ясны..
исключения тоже не бесплатны


Andrew
07.09.2018
18:18:15

ЕВГЕНИЙ
07.09.2018
18:25:16
А, я думал, речь именно об ошибках в случае неправильного порядка вызова методов.
Извини, я наверное плохо свои мысли вырожаю,там есть initResurces (тут может упасть куча всего не примонтировалась файловая система например или пользовательский ввод) потом идёт handshake ( рукопожатие не имеет смысла без корневой дериктории ТК сохранять результат не получиться ну и ошибка неверных данных например перепутали алгоритм или тип того) остальные в принципе друг от друга не зависят но должны пройти после handshake'a все исключения у меня это 1 класс который имеет код ну и красивое сообщение с разбором деталей. Вот я и думал все в 1 try обьеденить...

Andrew
07.09.2018
18:28:35
Если для него исключение упадёт внезапно -- значит он ССЗБ и не прочитал документацию :)

Google

ЕВГЕНИЙ
07.09.2018
18:30:54

Andrew
07.09.2018
18:34:23
Хххх звучит справедливо, просто мне котлин в новинку (4 месяца где то что-то пробую) заметил что на каждое сложное решение есть какая та магия, подумал малоли тут что то тоже есть :)) спасибо огромное за помощь !!
Магии нету. Она могла бы быть в умном тулинге, который бы читал джавадоки / смотрел бы на @Throws и следил бы за исключениями, которые проваливались бы вникуда, но, видимо, это либо непростая задача, либо просто невостребовано, раз до сих пор не реализовали :)
Да не за что, не помогли же ничем)

Alexander
07.09.2018
18:51:08
Обсуждали возможность сделать проверку @Throws линтером. Ничего невозможного, просто у людей руки не долшли. Я думаю, что рань или поздон оно будет.

Mikhail
07.09.2018
19:32:28
я обновил json-бенчмарки https://github.com/wizzardo/json-benchmarks
добавил на графики аллокацию памяти, но klaxon все портит и ее не везде видно

OlegKrikun
07.09.2018
21:01:24

Mikhail
07.09.2018
21:01:48
Зверюга?
Может я его готовлю неправильно?

OlegKrikun
07.09.2018
21:05:08
Я фиг знает, может ну его с графиков, написать в ридми чтт боец выбыл

Никита?❄️
07.09.2018
21:53:36
худшая производительность везде, больше всех треша и так далее

Mikhail
07.09.2018
21:56:17
А звёзд то сколько у него

OlegKrikun
07.09.2018
21:57:45
862 ?

Alexander
08.09.2018
04:46:21
Не всем производительность нужна, кому-то генерация объектиков. Кстати, я не увидел вот такой момент: мне к примеру нужно быстро парсить дерево, но при этом не нужно считывать все значения, а только маленькое количество отдельных элементов. Я чего-то не вижу такого случая.
Я просто специально для этого переполз с glassfish на json-simple и скорость увеличилась в несколько раз. А у вас оно наоборот.

Dmitry
08.09.2018
07:06:36

Alexander
08.09.2018
07:08:21
Маленького, но их много, надо прочитать быстро несколько сот и из каждого нужно одно-два поля