Either<L, R>: İstisnasız Türlendirilmiş Hata İşleme
İstisna fırlatmadan başarı ve başarısızlığı temsil etmek için Either kullanın.
Either<L, R>: İstisnasız Türlendirilmiş Hata İşleme, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.
İş Mantığı İçin İstisnaların Sorunu
İstisnalar beklenmeyen hatalar için tasarlanmıştır (null işaretçisi, IO hatası). Beklenen iş mantığı hatalarını (doğrulama hatası, "bulunamadı") belirtmek için istisnaları kullanmak denetim akışını görünmez kılar, her çağrı noktasında try/catch kullanımını zorunlu kılar ve hataları işlev imzalarında gizler.
Either<L, R> Nedir?
Either, iki durumu olan bir toplam türdür: Left(value: L) geleneksel olarak hatayı, Right(value: R) ise geleneksel olarak başarı değerini içerir. Either döndüren bir işlev, başarısızlık olasılığını imzasında açıkça belirtir.
Arrow'un Either'ı
Either ve onun kapsamlı işleç ekosistemini edinmek için Arrow'u projenize ekleyin:
// build.gradle.kts
implementation("io.arrow-kt:arrow-core:1.2.4")
// Usage
import arrow.core.Either
import arrow.core.left
import arrow.core.rightBir İşlevden Either Döndürme
Başarı için value.right(), başarısızlık için error.left() döndürün. Çağıran tarafın her iki dalı da ele alması gerekir:
sealed class UserError { object NotFound : UserError(); data class InvalidEmail(val msg: String) : UserError() }
fun findUser(id: Long): Either<UserError, User> =
if (id <= 0) UserError.NotFound.left()
else User(id, "Alice").right()fold ile Either'ı Tüketme
Her iki durumu tek bir ifadede ele almak için fold(ifLeft, ifRight) kullanın:
val result = findUser(1L)
val message = result.fold(
ifLeft = { error -> "Error: $error" },
ifRight = { user -> "Found: ${user.name}" }
)
println(message)Right Değerini map ile Dönüştürme
map { }, Left'e dokunmadan Right değerini dönüştürür. Bu, Either'ı bir funktör hâline getirir; dönüşümleri güvenli bir şekilde zincirleyebilirsiniz:
val nameResult: Either<UserError, String> = findUser(1L).map { it.name }flatMap ile Zincirleme
flatMap { }, kendileri de Either döndüren hesaplamaları zincirler. Herhangi bir adım Left döndürürse zincir kısa devre yapar ve sonraki adımlar çalıştırılmadan hata aktarılır:
fun validateEmail(email: String): Either<UserError, String> =
if (email.contains("@")) email.right()
else UserError.InvalidEmail("bad format").left()
fun createUser(email: String): Either<UserError, User> =
validateEmail(email).flatMap { validEmail ->
User(1L, validEmail).right()
}İstisnaları Sarmalamak için Either.catch
Either.catch { } bir kod bloğunu çalıştırır ve her istisnayı Left olarak sarmalar. İstisna fırlatan eski kod ile Either tabanlı alanınız arasındaki sınırda kullanın:
val result: Either<Throwable, User> = Either.catch {
userRepository.findOrThrow(id)
}getOrElse ve orElse ile Kurtarma
getOrElse { default }, Right değerini çıkarır veya varsayılan bir değer döndürür. orElse { alternativeEither }, bir Left değerini başka bir hesaplamayla değiştirir:
val user: User = findUser(0L).getOrElse { User(-1L, "Guest") }
val user2: Either<UserError, User> = findUser(0L).orElse { User(99L, "Default").right() }when ile Desen Eşleme
Durumları eksiksiz olarak ele almak için mühürlü, Either benzeri bir sınıf üzerinde veya is Either.Left / Either.Right kullanarak doğrudan Either üzerinde when kullanın:
when (val r = findUser(1L)) {
is Either.Left -> println("Error: ${r.value}")
is Either.Right -> println("User: ${r.value.name}")
}Hizmet Katmanlarında Either
Depo ve hizmet işlevlerinden Either döndürün. İş mantığını çerçeve bileşenlerine ilişkin ayrıntılardan arındırarak bunu Ktor rota düzeyinde HTTP yanıtlarına dönüştürün:
get("/users/{id}") {
val id = call.parameters["id"]?.toLongOrNull() ?: return@get call.respond(HttpStatusCode.BadRequest)
userService.findById(id).fold(
ifLeft = { call.respond(HttpStatusCode.NotFound) },
ifRight = { call.respond(it) }
)
}Kısa Kontrol
Bir Either.Left değeri üzerinde flatMap { } ne yapar?
Özet: Either<L, R>
Önemli çıkarımlar:
Either, başarısızlık yolunu işlev imzasında açıkça belirtirRight= başarı;Left= başarısızlık (geleneksel olarak)map { }— başarı değerini dönüştürür;flatMap { }— başarısız olabilen hesaplamaları zincirlerfold(ifLeft, ifRight)— her iki durumu tek bir ifadede tüketirEither.catch { }— istisna fırlatan kodu sınır noktalarında sarar
Sıkça Sorulan Sorular
“Either<L, R>: İstisnasız Türlendirilmiş Hata İşleme” dersi ücretsiz mi?
Evet — “Either<L, R>: İstisnasız Türlendirilmiş Hata İşleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.
“Either<L, R>: İstisnasız Türlendirilmiş Hata İşleme” dersinde ne öğreneceğim?
İstisna fırlatmadan başarı ve başarısızlığı temsil etmek için Either kullanın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Either<L, R>: İstisnasız Türlendirilmiş Hata İşleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Either : İstisnasız Türlendirilmiş Hata İşleme
- Arrow Raise DSL: Türü Belirlenmiş Hataları Birleştirme
- Option ve Nullable: Hangisi Ne Zaman Kullanılır
- Arrow'un Temel Türleriyle İşlevsel Alan Modellemesi