Kotlin Meta
246 subscribers
57 photos
2 videos
1 file
55 links
Всякое разное интересное про язык программирования Kotlin и около него.

Чатик: @kotlinmetachat.
Мы на YouTube: https://youtube.com/@KotlinMeta.
Мы на Twitch: https://twitch.tv/kotlinmeta.
Download Telegram
Live stream finished (2 hours)
Почему в Kotlin никогда не будет полноценных Union-типов?

В среду мы готовим полноценный ролик с разбором новой фишки 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
242👍11
Особенности error class

Для того, чтобы тип мог использоваться в правой части Union-а, его необходимо объявить через специальную декларацию error class. Ограничения на такие классы:

• error class не может быть abstract/open
• error class не может содержать дженериков

Так почему же в каком-нибудь TypeScript я могу написать:


type MessageId = string | number


А в Kotlin эта фича будет работать только для error class-ов?
4👍111
Перформанс

И этот тот самый случай, когда перформанс НЕ является примером Premature Optimization. Дело в том, что проверка того, является ли один Union-тип подтипом другого Union-типа – это неразрешённая проблема. Это приводит к экспоненциальному росту времени проверки при добавлении новых подтипов в Union-тип.

В других языках такая проблема есть, но с ней живут. Так, в мире TypeScript оптимизация времени проверки типов – это одна из актуальных задач на большом проекте. Но при разделении на "основной" и "побочные" типы, ребята из JetBrains совместно с Ross Tate разработали быстрый алгоритм для проверки на сходство типов.
321
Rich Errors не заменяют sealed interface, а делают работу с неудачными сценариями проще, чем это можно достичь с sealed interface. И это я бы назвал Game Changer-ом для распространения подхода Errors as Values.

Для полноценной замены Union-типов, возможно, стоит ожидать нового удобного синтаксиса для sealed interface из этого тикета в YouTrack.

Rich Errors также не заменяют исключения, и они всё ещё нужны в своей нише, а именно – логические ошибки программиста. Подобно тому, как работает panic в Go и Rust, и fatalError в Swift.
2👍221
Please open Telegram to view this post
VIEW IN TELEGRAM
📥 Мы включили возможность писать личные сообщения в этот канал

Старая добрая предложка из ВКонтакте появилась в новой версии Telegram. Обновляйте ваши клиенты, и смотрите на кнопочку внизу экрана.

А чтобы пообщаться с сообществом, вступайте в @kotlinmetachat. Я и Эмиль будем отвечать в обоих чатах.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍5
📹 Запись второго стрима: JetBrains переизобрели checked exceptions? Смотрим на Rich Errors и почему в Kotlin не будет полноценных Union-типов.

Посмотрели как к этому вообще пришли, какие есть альтернативы в других экосистемах и почему не хотят реализовывать полноценные Union-типы в Kotlin. Разобрали proposal-ы с обсуждением разработчиков из JetBrains про Union-типы в Kotlin.

И, главное, поняли чем они могут быть лучше sealed interfaces, Result-типов и checked exceptions.

YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103🔥221
🔴️️️️️️ Стрим в 17:00 МСК в субботу

Расскажем про fuzz-тестирование и про новую библиотеку kotlinx.fuzz для написания таких тестов.

Обязательно ставьте себе напоминалку и приходите. В этот раз это ваши вопросы будут особо важны, потому что в конечном итоге то, что мы будем смотреть и разбирать, выльется в доклад на Mobius или JPoint.

Telegram | YouTube | Twitch
👍53🔥22
Live stream scheduled for
💥 return делай, throw не делай

Что же, какое-то длиннопостное настроение на этой неделе. Сегодня поговорим про исключения. Когда их использовать нужно, и когда их использовать не нужно. Идеалом для меня по этой теме был и есть этот пост от Романа Елизарова на Medium.

Крайне советую с ним ознакомиться, сохранить в закладки, и пересылать всем, кто не следует конвенциям, описанным там. И не просто потому что так сказал Роман Елизаров, а потому что в посте очень доходчиво описаны причины таких конвенций. Их же я опишу в следующих постах.
Please open Telegram to view this post
VIEW IN TELEGRAM
321
☕️ Java и Checked Exceptions

Этот уникальный концепт появился в Java для работы с исключениями. С одной стороны – мы получаем возможность не делать проверок на if, а с другой стороны – компилятор проверит, что где-нибудь мы обязательно обработаем неудачный сценарий.

Но этот концепт очень быстро оброс критикой. Многие стали злоупотреблять предоставленным инструментом, и даже в стандартной библиотеке некоторые классы помечали методы как выбрасывающие IOException, хотя все знают, что это невозможно на практике.

По итогу, начиная с 2010 года, в рекомендациях к хорошему года на Java стал фигурировать отказ от Checked Exceptions. А добивающим был выход Java-лямбд, который окончательно похоронил Checked-Exceptions.
Please open Telegram to view this post
VIEW IN TELEGRAM
41
🏝 Исключения в Kotlin

Kotlin унаследовал концепт исключений из Java и они поддерживаются из коробки для удобной работы с Java API. Но как и другие JVM-языки, Kotlin решил не перенимать Checked Exceptions. До Kotlin 2.4.

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

❗️ Согласно конвенции, вы не должны отлавливать исключения в обычном Kotlin коде. Это считается плохой практикой. Отлов исключений должен происходить в библиотечном коде, либо в небольшом количестве функций, созданных под каждый сценарий, где потенциально может понадобиться обработать исключение.
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🔐 Безопасное API

Основной сценарий использования исключений в Kotlin – логические ошибки (далее – нарушение контракта). Если в какой-то момент программа попала в состояние, в котором она не должна оказаться, то выкидывается исключение.

Часто для этого используются функции check(), require() и error(). Доку тут я пересказывать не буду, про отличия можете почитать сами.

В случае, если возникла ошибка, которую необходимо обработать, – не нужно использовать исключения. Используйте nullable-типы или sealed interface.

❗️ Вы должны проектировать свои API следующим образом: используйте исключения как индикатор нарушения контракта, типобезопасные результаты для всего остального. Не используйте исключения как ожидаемый результат выполнения функции.

Иногда, правда, заранее неизвестно, является ли определённая ошибка нарушением контракта или той, которую необходимо обработать. В таком случае предлагается делать 2 варианта для функции, как это делает стандартная библиотека Kotlin:

fun String.toInt(): Int, если отличный от Int ввод является нарушением контракта

fun String.toIntOrNull(): Int?, если необходимо обработать сценарий некорректного ввода
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🌐 IOException

Ох, это самое интересное, и самое спорное. IOException – точно не является нарушением контракта, но IOException любят и в JetBrains. Так, например, даже в новых библиотеках, написанных с нуля (имею ввиду ktor), активно используются эти исключения. Т.е. для таких исключений делается исключение (pun intended).

Аргументация такова: если бы после каждого IO-вызова нужно было бы проверять была ли выполнена операция успешно, то у нас было бы много бойлерплейта. Поэтому на IO-запросы нужен единый для всего приложения паттерн для обработки исключений. Обычно это делается на границе между низкоуровневой сетевой логикой и высокоуровневой доменной логикой. Для меня эта граница находится в репозитории (в архитектурном смысле). Все классы-репозитории возвращают kotlin.Result и не имеют права кидать никаких исключений.

То, чего нет в статье Романа, но лично я предпочитаю для пущей явности: все функции, которые потенциально кидают IOException, я помечаю суффиксом OrThrow(). Таким образом, я всегда вижу функции, которые могут выкинуть исключение IOException, и каждый раз при их вызове мне не нужно лезть в документацию или помнить, кидает ли конкретная функция исключение.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍421
tg_image_3548592563.png
320.8 KB
📊 Финализируем всё таким графом, который можно себе сохранить и поделиться с другом
Please open Telegram to view this post
VIEW IN TELEGRAM
73❤‍🔥2👍1
Live stream started
🔴️️️️️️ Мы в прямом эфире

Расскажем про то, как находить больше багов с помощью fuzz-тестирования с помощью новой библиотеке kotlinx.fuzz для написания таких тестов.

Telegram | YouTube | Twitch
👍421
Live stream finished (2 hours)
Production-ready Compose Multiplatform

Не так давно произошло большое событие – вышла стабильная версия CMP под iOS. JetBrains заявляет, что Compose Multiplatform теперь является стабильным и KMP сейчас является полным решением для мобильной разработки – от общей бизнес логики вплоть до общего нативного UI.

Перед этим CMP под iOS находился довольно продолжительное время в нестабильном состоянии и многие довольно скептично относились к дальнейшему развитию технологии, но сейчас, возможно, он поменяет рынок.

До этого на рынке доминировали технологии по типу Flutter или React Native, которые рекламируются как компромисс в виде лишения возможности использовать платформенно-специфичное API в в обмен на кроссплатформенный UI. Теперь появилась стабильная технология, которая позволит писать кроссплатформенный UI с возможностью вызывать любые platform-specific API.

Но я считаю, что писать кроссплатформенный UI всё же не очень хорошо во многих случаях. Это может быть хорошо в случаях, когда надо быстро написать мобильное приложение, сэкономив на том, что UI пишется один раз. Однако если есть какие-то сложные UI-компоненты всё же было бы проще писать UI нативно, сэкономив только на написании общей логики при помощи KMP, где будет попроще вынести некоторую логику платформенной реализацией. Или, к примеру, есть рассчёт на поддержку приложения на долгосрочной перспективе – тут тоже было бы проще писать нативно UI на обеих платформах, потому что приложение рано или поздно будет обрастать сложной логикой, что сложно было бы поддерживать используя кроссплатформенный UI, если есть рассчёт на некоторое развитие приложения. Также у кроссплатформенного UI могут быть проблемы с перформансом.

И самое главное, с чем могут возникнуть проблемы при написании кроссплатформенного UI – соответствие гайдлайнам конечных платформ. Есть некоторые библиотеки для CMP с поддержкой material 3/human design, но эти стандарты отличаются друг от друга и всё равно финальная вёрстка будет отличаться на конечных платформах. Тут вступает в силу трейд-офф, по которому вы должны писать свою platform-agnostic дизайн-систему, из-за чего приложения будут выглядить менее естественными.

А как думаете вы?
9👍5🔥41
Media is too big
VIEW IN TELEGRAM
📹 kotlinx.fuzz: новая библиотека для тестирования от JetBrains – Запись стрима.

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

⚠️ Под всеми нашими видео будут тайм-коды. Их можно найти в описании. Ютуб не даёт разбивать на секции видео для маленьких каналов :(

Секции:

00:00 - Читаем блог-пост от JetBrains
19:30 - Пишем азбуку морзе и fuzz-тестируем
1:00:33 - Улучшаем код благодаря fuzz-тестам
1:14:34 - Смотрим презентацию про kotlinx.fuzz
1:38:34 - Мысли в слух о будущем

YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
50👍866🔥2