Kotlin-result - функциональный подход к обработке ошибок в Kotlin
Представьте: ваш код выполняет цепочку операций, и где-то посередине что-то идёт не так. Традиционный подход — исключения — часто превращает отладку в квест по поиску того места, где же на самом деле произошла ошибка. Вот тут-то и приходит на помощь kotlin-result.
Что такое kotlin-result?
Это мультиплатформенная библиотека для Kotlin, которая реализует функциональный подход к обработке ошибок через Result-монаду. Вместо того чтобы бросать исключения или возвращать null, ваши функции начинают явно возвращать либо успешный результат (Ok(value)), либо ошибку (Err(error)).
Кому это нужно?
- Разработчикам, уставшим от непредсказуемых исключений
- Тем, кто хочет сделать потоки ошибок в приложении явными и предсказуемыми
- Командам, переходящим с языков вроде Rust или Haskell, где Result — стандартный подход
5 причин попробовать kotlin-result
- Ясный поток выполнения Ваш код превращается в "железнодорожные пути" (Railway Oriented Programming), где чётко видно, где "хэппи-пэйс", а где обработка ошибок.
fun validateUser(input: String): Result<User, ValidationError> {
return parseInput(input)
.andThen(::validateEmail)
.andThen(::checkEmailUniqueness)
}
-
Нулевые накладные расходы Благодаря inline-классам Kotlin, на "хэппи-пэйсе" нет дополнительных аллокаций объектов.
-
Удобные трансформации Легко преобразовывайте результаты и ошибки:
fetchUserData()
.map { it.toDomainModel() } // преобразуем успешный результат
.mapError { ApiError(it.message) } // преобразуем ошибку
-
Мультиплатформенность Работает на всех платформах Kotlin: JVM, JS, Native (включая iOS и Android).
-
Корутины и асинхронность Специальный модуль для работы с корутинами:
suspend fun loadData(): Result<Data, Error> = coroutineBinding {
val a = fetchA().bind() // если здесь ошибка, дальше выполнение не пойдёт
val b = fetchB().bind()
combineData(a, b)
}
Под капотом
Библиотека использует несколько интересных технических решений:
- Inline-классы для минимизации накладных расходов
- Единый интерфейс для всех платформ
- Полная поддержка null-safety Kotlin
- Более 100 unit-тестов
Когда особенно полезно?
- Веб-сервисы — явная обработка ошибок API
- Бизнес-логика — чёткое разделение успешных и ошибочных сценариев
- Мобильная разработка — унифицированная обработка ошибок на всех платформах
- Работа с легаси-кодом — постепенный перевод исключений на Result
Альтернативы
В стандартной библиотеке Kotlin есть похожие механизмы (Result, runCatching), но kotlin-result предлагает:
- Более богатый API (как в Rust/Elm)
- Лучшую мультиплатформенную поддержку
- Более гибкую работу с типами ошибок
Как начать использовать?
Добавьте зависимость в build.gradle.kts:
dependencies {
implementation("com.michael-bull.kotlin-result:kotlin-result:2.1.0")
// для корутин:
implementation("com.michael-bull.kotlin-result:kotlin-result-coroutines:2.1.0")
}
Kotlin-result — это не просто ещё одна библиотека, а целая философия написания надёжного кода. Если вы:
- Хотите сделать обработку ошибок предсказуемой
- Любите функциональный подход
- Работаете с мультиплатформенными проектами
...то стоит попробовать kotlin-result прямо сейчас. Первое время будет непривычно, но когда "щёлкнет", обратного пути уже не будет.
P.S. Полный пример использования с Ktor можно найти в репозитории проекта.
