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
tg_image_3548592563.png
320.8 KB
Please open Telegram to view this post
VIEW IN TELEGRAM
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 дизайн-систему, из-за чего приложения будут выглядить менее естественными.
А как думаете вы?
Не так давно произошло большое событие – вышла стабильная версия 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 дизайн-систему, из-за чего приложения будут выглядить менее естественными.
А как думаете вы?
Media is too big
VIEW IN TELEGRAM
Написали небольшой проект для кодирования азбуки морзе, протестировали его с помощью фаззи тестинга. Интересно, как фаззи тестирование в данном случае не просто генерирует рандомные тест-кейсы, но и запоминает неуспешные, автоматически повышает 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👍8❤6 6🔥2
🔴️️️️️️ Стрим в 17:00 МСК в субботу
Расскажем про то, как можно реализовать мультиплатформенную систему плагинов с Kotlin DSL.
Посмотрим на то, как можно реализовать удобное создание и использование кастомной системы плагинов с использованием фишек языка. И покажем какие есть основные способы создания кастомной системы плагинов на стороне платформы и как можно было бы сделать плагины сразу на нескольких платформах. Попишем плагины разными способами и определим каким способом будет лучше всего это сделать.
Поставьте себе уведомление, если интересно, а пока можете посмотреть прошлые стримы.
Telegram | YouTube | Twitch
Расскажем про то, как можно реализовать мультиплатформенную систему плагинов с Kotlin DSL.
Посмотрим на то, как можно реализовать удобное создание и использование кастомной системы плагинов с использованием фишек языка. И покажем какие есть основные способы создания кастомной системы плагинов на стороне платформы и как можно было бы сделать плагины сразу на нескольких платформах. Попишем плагины разными способами и определим каким способом будет лучше всего это сделать.
Поставьте себе уведомление, если интересно, а пока можете посмотреть прошлые стримы.
Telegram | YouTube | Twitch
Explicit Backing Fields: новая итерация
Когда мы хотим объявить некоторую изменяющуюся сущность с приватным доступом в рамках класса и при этом сделать дублирующее поле, которое позволяет получить публичный доступ к полю извне только для чтения, мы обычно писали два поля.
И по аналогии с неявными теневыми полями (implicit backing fields), предлагается ввести понятие "явные теневые поля". На YouTrack уже давно был proposal, о котором подробнее почитать можно тут. В нём предлагается добавить возможность переписать вышеописанный код при помощи одного поля, сократив количество кода. Но недавно началась новая итерация proposal-а, в котором слегка упростили фичу.
Когда мы хотим объявить некоторую изменяющуюся сущность с приватным доступом в рамках класса и при этом сделать дублирующее поле, которое позволяет получить публичный доступ к полю извне только для чтения, мы обычно писали два поля.
И по аналогии с неявными теневыми полями (implicit backing fields), предлагается ввести понятие "явные теневые поля". На YouTrack уже давно был proposal, о котором подробнее почитать можно тут. В нём предлагается добавить возможность переписать вышеописанный код при помощи одного поля, сократив количество кода. Но недавно началась новая итерация proposal-а, в котором слегка упростили фичу.
1 7❤2 2🎉1
Как попробовать самим?
Действительно ли фича упростит код или она просто будет ненужным сахаром, из-за которого будет сложнее войти в язык новичкам. Будет ли мешанина старых и новых подходов?
Вы можете опробовать эту фичу сами уже сейчас, для этого добавляем компиляторный флаг
Подробнее про мотивацию, предыдущие итерации и фидбек других участников сообщества можно глянуть в дискуссии на GitHub.
Действительно ли фича упростит код или она просто будет ненужным сахаром, из-за которого будет сложнее войти в язык новичкам. Будет ли мешанина старых и новых подходов?
Вы можете опробовать эту фичу сами уже сейчас, для этого добавляем компиляторный флаг
-XXLanguage:+ExplicitBackingFields
в build.gradle.kts.Подробнее про мотивацию, предыдущие итерации и фидбек других участников сообщества можно глянуть в дискуссии на GitHub.
1 6👍2 2