Forwarded from Mobile Developer (Алексей Гладков)
Как избавиться от лишнего кода в build.gradle [EN]
https://proandroiddev.com/how-to-get-rid-of-boilerplate-code-in-build-gradle-files-7bfac83ca1c8
👉 Что можно вынести в settings.gradle
👉 Как написать convention plugin
👉 Практический совет на примере
https://proandroiddev.com/how-to-get-rid-of-boilerplate-code-in-build-gradle-files-7bfac83ca1c8
👉 Что можно вынести в settings.gradle
👉 Как написать convention plugin
👉 Практический совет на примере
Medium
How to get rid of boilerplate code in build.gradle files?
In this article I’d like to describe how you can get rid of boilerplate code in your build.gradle files in multimodule project with the…
👍1🔥1
Forwarded from Ra'Reilly - Заметки про Ktor и не только (Osip Fatkullin)
Хабр
Конструкторы-самозванцы в Kotlin
Сегодня я хочу поговорить про интересные моменты в Kotlin, связанные с вызовами конструкторов классов. Или не совсем конструкторов? Или же совсем не конструкторов? Давайте разбираться. Это...
Я веду бэклог постов и в рубрике #насмотренность следующий пост должен был быть про функции-конструкторы. Но иногда нужно просто немного подождать и кто-то сделает все за тебя :) На хабре вышла статья "Конструкторы-самозванцы в Kotlin", где автор описывает варианты мимикрии функций под синтаксис конструктора и в каких случаях это может понадобиться. Спасибо ему! Мне остаётся только досыпать примеров использования в Open Source.
1️⃣ Функция-конструктор
Это просто функция высшего порядка, написаная с большой буквы, которая внутри создаёт и возвращает инстанс класса.
Полезно, если хочется дать возможность "создавать инстанс интерфейса". Объявляете интерфейс, кладёте рядом с ним функцию с таким же названием и готово, даже импортировать её отдельно не придётся. Реализация интерфейса при этом может остаться приватной. Вызовы MutableStateFlow и MutableSharedFlow в корутинах, Json в kotlinx.serialization это всё вызовы таких функций. Это помогает уменьшить API-surface, а значит упростить использование API.
Ещё один вариант использования — вместе с inline-классами. Например, у Size в Compose конструктор помечен как
2️⃣ Перегрузка Companion.invoke
Причины применения указанные в статье (контроль над созданием объекта, создание пула объектов, кэширование и т.д.) классные, но нужны примеры. Пример контроля над созданием объекта можно увидеть в PlatformVersion в ktor. То есть в зависимости от определённой логики мы можем мы либо создаём инстанс, либо возвращаем какой-то существующий.
Но часто применение более банальное — вместо вторичного конструктора. Тут я могу только догадываться почему не используется вторичный конструктор, но примеры такого применения можно увидеть в RuleSet из detekt и MockEngine из ktor. Иногда применение вместо вторичного конструктора можно оправдать тем, что логики для подготовки параметров конструктора очень много. Например в SpriteAnimation из korge (игровой движок на Kotlin).
3️⃣ <Context>.invoke()
То же самое, что предыдущий вариант, но для случая когда нужно ограничить применение invoke контекстом.
В дикой природе этот вариант я не встречал, но сам автор даёт пример применения в yatagan и рассказывает в статье зачем это понадобилось. После выхода context parameters (следующая итерация context receiver'ов) этот вариант будет выглядеть приятнее.
🤔 Как относиться к такому?
Я часто вижу хейт в сторону подобных конструкций, мол мимикрия и переопределение операторов это зло, так как порождает неявность. Да, на самом деле вызывается не конструктор, а функция, но что в этом плохого если она выполняет ту же смысловую нагрузку? Уверен, многие с чистой совестью вызывают
Накидайте аргументов если я не прав!
#kotlin
1️⃣ Функция-конструктор
Это просто функция высшего порядка, написаная с большой буквы, которая внутри создаёт и возвращает инстанс класса.
Полезно, если хочется дать возможность "создавать инстанс интерфейса". Объявляете интерфейс, кладёте рядом с ним функцию с таким же названием и готово, даже импортировать её отдельно не придётся. Реализация интерфейса при этом может остаться приватной. Вызовы MutableStateFlow и MutableSharedFlow в корутинах, Json в kotlinx.serialization это всё вызовы таких функций. Это помогает уменьшить API-surface, а значит упростить использование API.
Ещё один вариант использования — вместе с inline-классами. Например, у Size в Compose конструктор помечен как
internal, а "создание инстанса" происходит через функцию c двумя параметрами.2️⃣ Перегрузка Companion.invoke
Причины применения указанные в статье (контроль над созданием объекта, создание пула объектов, кэширование и т.д.) классные, но нужны примеры. Пример контроля над созданием объекта можно увидеть в PlatformVersion в ktor. То есть в зависимости от определённой логики мы можем мы либо создаём инстанс, либо возвращаем какой-то существующий.
Но часто применение более банальное — вместо вторичного конструктора. Тут я могу только догадываться почему не используется вторичный конструктор, но примеры такого применения можно увидеть в RuleSet из detekt и MockEngine из ktor. Иногда применение вместо вторичного конструктора можно оправдать тем, что логики для подготовки параметров конструктора очень много. Например в SpriteAnimation из korge (игровой движок на Kotlin).
3️⃣ <Context>.invoke()
То же самое, что предыдущий вариант, но для случая когда нужно ограничить применение invoke контекстом.
В дикой природе этот вариант я не встречал, но сам автор даёт пример применения в yatagan и рассказывает в статье зачем это понадобилось. После выхода context parameters (следующая итерация context receiver'ов) этот вариант будет выглядеть приятнее.
🤔 Как относиться к такому?
Я часто вижу хейт в сторону подобных конструкций, мол мимикрия и переопределение операторов это зло, так как порождает неявность. Да, на самом деле вызывается не конструктор, а функция, но что в этом плохого если она выполняет ту же смысловую нагрузку? Уверен, многие с чистой совестью вызывают
MutableStateFlow и им не важно, что под капотом. Главное следовать принципу наименьшего удивления. Если что-то выглядит как конструктор, оно и работать должно как конструктор.Накидайте аргументов если я не прав!
#kotlin
👍2🔥1
Forwarded from Полуночные Зарисовки
Telegraph
Безболезненное перемещение ресурсов в мире нетранзитивных R-классов
Недавно делал задачу, связанную с перемещением иконок в проекте между модулями, и готовлюсь к задаче с большим количеством перемещений других ресурсов. И вот я что-то не замечал до этого момента (или не придавал особого значения) того, что Android Studio…
🤔2👍1
Forwarded from Kotlin Multiplatform (Kostya)
https://github.com/ShreyashKore/wonderous_compose
Я уже упоминал этот проект как-то раз. Очень красиво и работает на всех возможных платформах! (не надо только пробовать веб версию на мобильных устройствах)
А теперь там появились встроенные карты на всех платформах - стоит изучить 😉
Я уже упоминал этот проект как-то раз. Очень красиво и работает на всех возможных платформах! (не надо только пробовать веб версию на мобильных устройствах)
А теперь там появились встроенные карты на всех платформах - стоит изучить 😉
❤3🔥3👍1
Forwarded from Mobile Compose
#Предложка #Libs #Compose
Compose Color Preview
Наверняка вы замечали, что при работе с Compose Multiplatform в IntelliJ IDEA нет привычных превью цветов в панели слева. Одним из решений этой проблемы является Compose Color Preview — плагин, автором которого является один из подписчиков канала. Однозначно лайк 👍
Compose Color Preview
Наверняка вы замечали, что при работе с Compose Multiplatform в IntelliJ IDEA нет привычных превью цветов в панели слева. Одним из решений этой проблемы является Compose Color Preview — плагин, автором которого является один из подписчиков канала. Однозначно лайк 👍
👍8🔥3
Forwarded from Kotlin Multiplatform (Kostya)
Хабр
Как новый компилятор K2 ускоряет компиляцию Kotlin на 94%
Привет, меня зовут Мялкин Максим, я занимаюсь мобильной разработкой в KTS. Не за горами выпуск новой версии Kotlin 2.0, основной частью которого является изменение компилятора на K2. По замерам...
👍1
Forwarded from Записки разработчицы (Anna Zharkova)
Для тех, кому лень или некогда смотреть, хорошая статья на Хабре: https://habr.com/ru/companies/kts/articles/814363/
Хабр
Developer Keynote Google I/O 2024: официальная поддержка KMP, развитие Gemini и AI в Андроиде
Всем привет! Меня зовут Мялкин Максим, я лид мобильной команды в KTS . Сейчас проходит Google IO 2024, и мы с ребятами в команде решили выпустить обзор треков, которые нам показались интересными. Мы...
🔥5👍1
Forwarded from Kotlin Multiplatform Broadcast
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤1
Forwarded from iOS Makes Me Hate (Lev Bondarenko)
Как решать задачи на литкод
Какое-то монументальное видео, где чувак 4,5 часа выдает базу. Супер нишевый видос, когда автор просто на своем желании сделал офигенную лекцию, уровня которой не найдешь на ютубе. А где-то даже заменит целые курсы по алгосам от яндекса и тп.
Разобрав такие острые вопросы:
🟣 чем отличаются problem solving skills от заучивания алгоритмов
🟣 какие алгоритмы нужны и как начать понимать их пользу
🟣 почему большинство ошибается насчет бесполезности алгоритмов
🟣 работа с когнитивными искажениями и ментальными барьерами
🟣 ментальная гигиена и как не выгореть от неудач
Я тоже уже замечаю как регулярные алго задачи меняют мой мозг. Я начинаю любить шахматы, чаще думаю перед действиями в жизни, не боюсь неудач. Как-нибудь напишу пост об этом.
Пожелайте счастья таким людям, кто просто делает крутой контент для себя. Очень вайбовый видос, который смотришь на одном дыхании.
Какое-то монументальное видео, где чувак 4,5 часа выдает базу. Супер нишевый видос, когда автор просто на своем желании сделал офигенную лекцию, уровня которой не найдешь на ютубе. А где-то даже заменит целые курсы по алгосам от яндекса и тп.
Разобрав такие острые вопросы:
Я тоже уже замечаю как регулярные алго задачи меняют мой мозг. Я начинаю любить шахматы, чаще думаю перед действиями в жизни, не боюсь неудач. Как-нибудь напишу пост об этом.
Пожелайте счастья таким людям, кто просто делает крутой контент для себя. Очень вайбовый видос, который смотришь на одном дыхании.
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Как решать задачи на Leetcode(+полный гайд, работа, мотивация, депрессия, менталка, problem solving)
Telegram post: https://news.1rj.ru/str/koduryem/26
Problem solving skills. Скиллы и гайд для решения задач.
Всем привет! В этом видео будет про вообще все, что связано с решением задач - не только leetcode, но и в целом теория решения задач и в других областях, зачем…
Problem solving skills. Скиллы и гайд для решения задач.
Всем привет! В этом видео будет про вообще все, что связано с решением задач - не только leetcode, но и в целом теория решения задач и в других областях, зачем…
🔥6👍2
Forwarded from Mobile Developer (Алексей Гладков)
Coroutines Essentials [EN]
https://typealias.com/start/kotlin-coroutines/
Еще одна статья, которая разжевывает прям в мелочах, как именно работают корутины во всех деталях
👉 Что такое многопоточность
👉 Как корутины реализуют concurrency
👉 Внутренняя машинерия
👉 Реальные примеры
Все весело, задорно, с картинками и игровыми механиками. В общем, если после этого рассказа все еще не понятно что такое корутины, то в следующем посте я скину вакансии из Вкусно и точки
https://typealias.com/start/kotlin-coroutines/
Еще одна статья, которая разжевывает прям в мелочах, как именно работают корутины во всех деталях
👉 Что такое многопоточность
👉 Как корутины реализуют concurrency
👉 Внутренняя машинерия
👉 Реальные примеры
Все весело, задорно, с картинками и игровыми механиками. В общем, если после этого рассказа все еще не понятно что такое корутины, то в следующем посте я скину вакансии из Вкусно и точки
Dave Leeds on Kotlin
Coroutine Essentials
Discover the power of coroutines in Kotlin and learn how to make your applications perform tasks concurrently and in parallel. Join Rusty and his construction crew as they streamline construction projects – and see how you can apply these same techniques…
👍5🔥1
Forwarded from Mobile AppSec World (Yury Shabalin)
Небольшая статья, которая поможет разобраться в разнообразии *links в Android
Всем привет!
Давно меня не было слышно, очень-очень плотно работа забрала себе :D
Но все-таки, хочется немного порадовать себя и вас. Сегодня у нас вышла новая статья по механизмам работы WebLinks, AppLinks и DeepLinks в Android. Я очень часто их путал и до конца не понимал, а в чем же отличие одного механизма от другого.
И наконец-то, совместно с @veselinaz до конца разобрались, что это и с чем едят.
Ну и конечно, сложно было не попробовать что-то сломать и попробовать проверить разные теории, как обойти проверку по верефицированному домену. Не скажу, что у нас получилось, сломать мы так ничего и не смогли, зато написали небольшую статью, чтобы всегда можно было освежить память и вспомнить, чем каждый из механизмов отличается и как поведет себя Android в той или иной ситуации.
Очень надеюсь, вам понравится!
Приятного чтения!
Всем привет!
Давно меня не было слышно, очень-очень плотно работа забрала себе :D
Но все-таки, хочется немного порадовать себя и вас. Сегодня у нас вышла новая статья по механизмам работы WebLinks, AppLinks и DeepLinks в Android. Я очень часто их путал и до конца не понимал, а в чем же отличие одного механизма от другого.
И наконец-то, совместно с @veselinaz до конца разобрались, что это и с чем едят.
Ну и конечно, сложно было не попробовать что-то сломать и попробовать проверить разные теории, как обойти проверку по верефицированному домену. Не скажу, что у нас получилось, сломать мы так ничего и не смогли, зато написали небольшую статью, чтобы всегда можно было освежить память и вспомнить, чем каждый из механизмов отличается и как поведет себя Android в той или иной ситуации.
Очень надеюсь, вам понравится!
Приятного чтения!
Хабр
Такие разные Android AppLinks, WebLinks, DeepLinks. Разбираемся и пытаемся сломать
Введение Всем привет! На связи Юрий Шабалин и Веселина Зацепина ( @VeselinaZatsepina ) эксперты по безопасности мобильных приложений в компании Стингрей. С каждым годом...
Forwarded from Dolgo.polo Dev | Денис Долгополов
Собрал тут кажется самую большую коллекцию:
@dolgo_polo_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3❤2
Forwarded from Android Live 🤖
When и Guard Conditions
#kotlin
С релизом Kotlin 2.1.0 появился апдейт для when — guard conditions. Эта новая фича улучшает читаемость кода, делая его более наглядным.
Давайте рассмотрим на примере, что она делает.
Предположим, есть базовый класс для получения ответа от сервера:
Если включить Guard Conditions, то проверка в when специальных юзкейсов будет выглядеть так:
Как мы видим, одну ошибку от бэка мы обработали без добавления if внутри условия:
Похоже, что стало удобнее, но нужно попробовать на практике.
Чтобы включить фичу, надо убедиться, что K2 Compiler включен, а потом добавить опцию:
Чуть больше информации можно найти тут.
#kotlin
С релизом Kotlin 2.1.0 появился апдейт для when — guard conditions. Эта новая фича улучшает читаемость кода, делая его более наглядным.
Давайте рассмотрим на примере, что она делает.
Предположим, есть базовый класс для получения ответа от сервера:
sealed interface HttpResult {
data class Success(val response: String) : HttpResult
data class Failed(val statusCode: Int) : HttpResult
}
Если включить Guard Conditions, то проверка в when специальных юзкейсов будет выглядеть так:
when (response) {
is HttpResult.Success -> println("Success")
is HttpResult.Failed if response.statusCode == 503 -> println("Maintenance")
is HttpResult.Failed -> println("Failed with code ${response.statusCode}")
}
Как мы видим, одну ошибку от бэка мы обработали без добавления if внутри условия:
when (response) {
is HttpResult.Success -> println("Success")
is HttpResult.Failed -> {
if (response.statusCode == 503) {
println("Maintenance")
} else {
println("Failed with code ${response.statusCode}")
}
}
}
Похоже, что стало удобнее, но нужно попробовать на практике.
Чтобы включить фичу, надо убедиться, что K2 Compiler включен, а потом добавить опцию:
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xwhen-guards")
}
}
Чуть больше информации можно найти тут.
🔥7❤1