💬 Впервые за долгое время мы наконец смогли собраться в Москве российским Kotlin-сообществом в ФКН ВШЭ.
Хорошая новость в том, что это мероприятие планируется делать серийным и в разных городах (там, где найдём докладчиков). Если хотите встретиться и пообщаться со мной и Эмилем оффлайн, то самое то.
За анонсами можно будет следить в канале Kotlin Russia: https://t.iss.one/kotlin_russia
Хорошая новость в том, что это мероприятие планируется делать серийным и в разных городах (там, где найдём докладчиков). Если хотите встретиться и пообщаться со мной и Эмилем оффлайн, то самое то.
За анонсами можно будет следить в канале Kotlin Russia: https://t.iss.one/kotlin_russia
❤12😭1 1 1
🔴 Сегодняшний стрим переносится на завтра
Возникла куча обстоятельств, которые не зависят от нас, и по которым мы никак не сможем сегодня предоставить полезное обсуждение по теме.
Завтра в это же время (17:00 МСК) присоединяйтесь к стриму, который мы сможем хорошо для вас подготовить. Будем обсуждать Rich Errors в Kotlin и Union-типы.
Все остальные стримы планируем также по расписанию каждую субботу в 17:00 МСК.
Возникла куча обстоятельств, которые не зависят от нас, и по которым мы никак не сможем сегодня предоставить полезное обсуждение по теме.
Завтра в это же время (17:00 МСК) присоединяйтесь к стриму, который мы сможем хорошо для вас подготовить. Будем обсуждать Rich Errors в Kotlin и Union-типы.
Все остальные стримы планируем также по расписанию каждую субботу в 17:00 МСК.
👍10 4😢2 1
🔴 Мы в прямом эфире!
Тема стрима – Rich Errors: В Kotlin 2.4 появятся Union-типы? Обсудим как это реализовано в других экосистемах, и что именно предлагается ввести в Kotlin.
В этот раз мы подключили чатик к онлайн-трансляции, так что будет сразу видеть ваши сообщение. Но работать он будет только из твича, так что пишите туда.
Telegram | YouTube | Twitch
Тема стрима – Rich Errors: В Kotlin 2.4 появятся Union-типы? Обсудим как это реализовано в других экосистемах, и что именно предлагается ввести в Kotlin.
В этот раз мы подключили чатик к онлайн-трансляции, так что будет сразу видеть ваши сообщение. Но работать он будет только из твича, так что пишите туда.
Telegram | YouTube | Twitch
🔥6❤1 1 1 1
В среду мы готовим полноценный ролик с разбором новой фишки Kotlin – Rich Errors a.k.a. Union-типы для ошибок (если вы из будущего, где ролик уже выложен, то обязательно гляньте!).
Я зарисовал на картинке минимальный пример с демонстрацией новой фичи для работы с ошибками. И да, эта фича вообще никак не связана с исключениями. Слева в типе указывается успешный результат, справа – все виды ошибок, которые могут произойти. Подобно тому, как работает Result в Rust, Either в Haskell, Ocaml, Scala, Error Union Type в Zig и error в Go.
Читайте ниже про новый синтаксис.
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤4 2👍1 1
Особенности error class
Для того, чтобы тип мог использоваться в правой части Union-а, его необходимо объявить через специальную декларацию error class. Ограничения на такие классы:
• error class не может быть abstract/open
• error class не может содержать дженериков
Так почему же в каком-нибудь TypeScript я могу написать:
А в Kotlin эта фича будет работать только для error class-ов?
Для того, чтобы тип мог использоваться в правой части Union-а, его необходимо объявить через специальную декларацию error class. Ограничения на такие классы:
• error class не может быть abstract/open
• error class не может содержать дженериков
Так почему же в каком-нибудь TypeScript я могу написать:
type MessageId = string | number
А в Kotlin эта фича будет работать только для error class-ов?
Перформанс
И этот тот самый случай, когда перформанс НЕ является примером Premature Optimization. Дело в том, что проверка того, является ли один Union-тип подтипом другого Union-типа – это неразрешённая проблема. Это приводит к экспоненциальному росту времени проверки при добавлении новых подтипов в Union-тип.
В других языках такая проблема есть, но с ней живут. Так, в мире TypeScript оптимизация времени проверки типов – это одна из актуальных задач на большом проекте. Но при разделении на "основной" и "побочные" типы, ребята из JetBrains совместно с Ross Tate разработали быстрый алгоритм для проверки на сходство типов.
И этот тот самый случай, когда перформанс НЕ является примером Premature Optimization. Дело в том, что проверка того, является ли один Union-тип подтипом другого Union-типа – это неразрешённая проблема. Это приводит к экспоненциальному росту времени проверки при добавлении новых подтипов в Union-тип.
В других языках такая проблема есть, но с ней живут. Так, в мире TypeScript оптимизация времени проверки типов – это одна из актуальных задач на большом проекте. Но при разделении на "основной" и "побочные" типы, ребята из JetBrains совместно с Ross Tate разработали быстрый алгоритм для проверки на сходство типов.
❤3 2 1
Rich Errors не заменяют sealed interface, а делают работу с неудачными сценариями проще, чем это можно достичь с sealed interface. И это я бы назвал Game Changer-ом для распространения подхода Errors as Values.
Для полноценной замены Union-типов, возможно, стоит ожидать нового удобного синтаксиса для sealed interface из этого тикета в YouTrack.
Rich Errors также не заменяют исключения, и они всё ещё нужны в своей нише, а именно – логические ошибки программиста. Подобно тому, как работает panic в Go и Rust, и fatalError в Swift.
Для полноценной замены Union-типов, возможно, стоит ожидать нового удобного синтаксиса для sealed interface из этого тикета в YouTrack.
Rich Errors также не заменяют исключения, и они всё ещё нужны в своей нише, а именно – логические ошибки программиста. Подобно тому, как работает panic в Go и Rust, и fatalError в Swift.
❤2👍2 2 1
Старая добрая предложка из ВКонтакте появилась в новой версии Telegram. Обновляйте ваши клиенты, и смотрите на кнопочку внизу экрана.
А чтобы пообщаться с сообществом, вступайте в @kotlinmetachat. Я и Эмиль будем отвечать в обоих чатах.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍5
Посмотрели как к этому вообще пришли, какие есть альтернативы в других экосистемах и почему не хотят реализовывать полноценные Union-типы в Kotlin. Разобрали proposal-ы с обсуждением разработчиков из JetBrains про Union-типы в Kotlin.
И, главное, поняли чем они могут быть лучше sealed interfaces, Result-типов и checked exceptions.
YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10 3🔥2 2❤1
🔴️️️️️️ Стрим в 17:00 МСК в субботу
Расскажем про fuzz-тестирование и про новую библиотеку kotlinx.fuzz для написания таких тестов.
Обязательно ставьте себе напоминалку и приходите. В этот раз это ваши вопросы будут особо важны, потому что в конечном итоге то, что мы будем смотреть и разбирать, выльется в доклад на Mobius или JPoint.
Telegram | YouTube | Twitch
Расскажем про fuzz-тестирование и про новую библиотеку kotlinx.fuzz для написания таких тестов.
Обязательно ставьте себе напоминалку и приходите. В этот раз это ваши вопросы будут особо важны, потому что в конечном итоге то, что мы будем смотреть и разбирать, выльется в доклад на Mobius или JPoint.
Telegram | YouTube | Twitch
👍5 3🔥2 2
Что же, какое-то длиннопостное настроение на этой неделе. Сегодня поговорим про исключения. Когда их использовать нужно, и когда их использовать не нужно. Идеалом для меня по этой теме был и есть этот пост от Романа Елизарова на Medium.
Крайне советую с ним ознакомиться, сохранить в закладки, и пересылать всем, кто не следует конвенциям, описанным там. И не просто потому что так сказал Роман Елизаров, а потому что в посте очень доходчиво описаны причины таких конвенций. Их же я опишу в следующих постах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Medium
Kotlin and Exceptions
What are Kotlin Exceptions and how should you use them?
❤3 2 1
Этот уникальный концепт появился в Java для работы с исключениями. С одной стороны – мы получаем возможность не делать проверок на if, а с другой стороны – компилятор проверит, что где-нибудь мы обязательно обработаем неудачный сценарий.
Но этот концепт очень быстро оброс критикой. Многие стали злоупотреблять предоставленным инструментом, и даже в стандартной библиотеке некоторые классы помечали методы как выбрасывающие IOException, хотя все знают, что это невозможно на практике.
По итогу, начиная с 2010 года, в рекомендациях к хорошему года на Java стал фигурировать отказ от Checked Exceptions. А добивающим был выход Java-лямбд, который окончательно похоронил Checked-Exceptions.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4 1
Kotlin унаследовал концепт исключений из Java и они поддерживаются из коробки для удобной работы с Java API. Но как и другие JVM-языки, Kotlin решил не перенимать Checked Exceptions.
Несмотря на схожее название, правила использования исключений изменились. В отличие от Java, они больше не используются для того, чтобы вернуть значение из функции.
Please open Telegram to view this post
VIEW IN TELEGRAM
Основной сценарий использования исключений в Kotlin – логические ошибки (далее – нарушение контракта). Если в какой-то момент программа попала в состояние, в котором она не должна оказаться, то выкидывается исключение.
Часто для этого используются функции
check()
, require()
и error()
. Доку тут я пересказывать не буду, про отличия можете почитать сами.В случае, если возникла ошибка, которую необходимо обработать, – не нужно использовать исключения. Используйте nullable-типы или sealed interface.
Иногда, правда, заранее неизвестно, является ли определённая ошибка нарушением контракта или той, которую необходимо обработать. В таком случае предлагается делать 2 варианта для функции, как это делает стандартная библиотека Kotlin:
•
fun String.toInt(): Int
, если отличный от Int ввод является нарушением контракта•
fun String.toIntOrNull(): Int?
, если необходимо обработать сценарий некорректного вводаPlease open Telegram to view this post
VIEW IN TELEGRAM
Ох, это самое интересное, и самое спорное. IOException – точно не является нарушением контракта, но IOException любят и в JetBrains. Так, например, даже в новых библиотеках, написанных с нуля (имею ввиду ktor), активно используются эти исключения. Т.е. для таких исключений делается исключение (pun intended).
Аргументация такова: если бы после каждого IO-вызова нужно было бы проверять была ли выполнена операция успешно, то у нас было бы много бойлерплейта. Поэтому на IO-запросы нужен единый для всего приложения паттерн для обработки исключений. Обычно это делается на границе между низкоуровневой сетевой логикой и высокоуровневой доменной логикой. Для меня эта граница находится в репозитории (в архитектурном смысле). Все классы-репозитории возвращают
kotlin.Result
и не имеют права кидать никаких исключений.То, чего нет в статье Романа, но лично я предпочитаю для пущей явности: все функции, которые потенциально кидают IOException, я помечаю суффиксом
OrThrow()
. Таким образом, я всегда вижу функции, которые могут выкинуть исключение IOException, и каждый раз при их вызове мне не нужно лезть в документацию или помнить, кидает ли конкретная функция исключение.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4 2 1