Either — ikki mumkin bo'lgan variantdan birining qiymatini ifodalovchi funksional tur: xato uchun chap (Left) va muvaffaqiyat uchun o'ng (Right). Istisnolardan farqli o'laroq, Either xato boshqarishni tip darajasida ochiq qiladi va try-catch bloklarini talab qilmaydi. Arrow, 2026 ma'lumotlariga ko'ra, Either Kotlin loyihalarida muvaffaqiyatsiz tugashi mumkin bo'lgan operatsiyalarni yon ta'sirlarsiz kompozitsiya qilish uchun keng qo'llaniladi.
Asosiy
Either — funksional dasturlashdan olingan algebraik ma'lumot turi bo'lib, ikkita mumkin bo'lgan turdan aynan bittasining qiymatini ifodalaydi. Xato boshqarish kontekstida quyidagi kelishuv qabul qilingan: chap tur (Left) muammo tavsifini o'z ichiga oladi, o'ng (Right) esa — muvaffaqiyatli natijani.
Either konsepsiyasi Haskell tiliga va Either a b turlari kategoriyasiga borib taqaladi, bu yerda a — chap qiymat turi, b — o'ng qiymat turi. Mobil ishlanmada Either Kotlin uchun Arrow kutubxonasi va Swiftdagi funksional yondashuvlar tufayli mashhurlikka erishdi.
Eitherning istisnolar ustidagi asosiy afzalligi — yashirin bajarilish yo'llarining yo'qligi. Either qaytaruvchi funksiya o'z imzosida xato bilan tugashi mumkinligini ochiq e'lon qiladi. Kompilyator ikkala variantning qayta ishlanganligini nazorat qiladi.
Istisnolarni tashlashdan farqli o'laroq, Either ma'lumot oqimining shaffofligini saqlaydi. Either qaytaruvchi funksiyani chaqirish try-catch talab qilmaydi — pattern-matching yoki fold yetarli. Bu, ayniqsa, har bir ma'lumot manbai Either qaytaradigan va o'zgartirish zanjiri map va flatMap orqali quriladigan reaktiv yondashuvli arxitekturalarda muhimdir.
Either ikkita kichik turdan iborat: Left va Right. Either nusxasi har bir momentda faqat ulardan biri bo'lishi mumkin. Kotlindagi odatiy imzo Either<E, A> ko'rinishiga ega, bu yerda E — xato turi, A — muvaffaqiyatli qiymat turi.
Left nosozlik holatini ifodalaydi. Istisnolardan farqli o'laroq, Left bajarilish oqimini to'xtatmaydi — u shunchaki qayta ishlanishi kerak bo'lgan qiymatni qaytaradi. Xato turi istalgan bo'lishi mumkin: String, Int, maxsus sealed class yoki domen modeli.
Right operatsiyaning to'g'ri natijasini o'z ichiga oladi. Nom „to'g'rilik"ni aks ettiradi — kelishuvga ko'ra Right muvaffaqiyatni anglatadi. Aynan Rightga map va flatMap o'zgartirishlari qo'llaniladi, bu esa har bir qadamni tekshirmasdan hisoblash zanjirlarini qurishga imkon beradi.
flatMap — Either kompozitsiyasining asosiy mexanizmi. Agar joriy qiymat Right bo'lsa, flatMap uzatilgan funksiyani qo'llaydi va yangi Either qaytaradi. Agar Left bo'lsa — flatMap o'zgartirishni o'tkazib yuboradi va xatoni oldinga uzatadi. Bu xatti-harakat short-circuit evaluation deb ataladi.
flatMapdan tashqari, Either mapLeft (xatoni o'zgartirish), fold (ikkala variantni bir joyda qayta ishlash) va getOrElse (standart qiymat bilan chiqarish) funksiyalarini qo'llab-quvvatlaydi. Bu funksiyalar barcha stsenariylarni qamrab oladi: oddiy chiqarishdan tortib Kotlin korutinlarida yoki Swiftda Combine bilan asinxron chaqiruvlarning murakkab kompozitsiyasigacha.
fun parseInt(input: String): Either<String, Int> =
input.toIntOrNull()?.let { Right(it) }
?: Left("$input ni konvertatsiya qilib bo'lmadi")
fun divide(a: Int, b: Int): Either<String, Int> =
if (b == 0) Left("Nolga bo'lish")
else Right(a / b)
val result = parseInt("10")
.flatMap { divide(it, 2) }
Kotlin ekotizimida Either Arrow kutubxonasida amalga oshirilgan. Kotlinning standart kutubxonasi Result ni taklif qiladi, ammo Either ko'proq moslashuvchanlik beradi: ixtiyoriy xato turi, flatMap orqali kompozitsiya va funksional naqshlar uchun qo'llab-quvvatlash.
Arrow — Kotlin uchun Either, Option, Validated va boshqa turlarni qo'shadigan funksional kutubxona. Arrow.Either — ikkita merosxo'rga ega sealed class: ArrowCore.Left va ArrowCore.Right. Kutubxona shuningdek qulay ishlash uchun kengaytmalarni taqdim etadi: .getOrElse(), .fold(), .mapLeft().
Haqiqiy stsenariyni ko'rib chiqaylik — Android ilovasida mumkin bo'lgan xatolar bilan tarmoq so'rovi: tarmoq yo'q, server xatosi, noto'g'ri javob. Either barcha variantlarni bitta qaytariladigan turda birlashtirishga imkon beradi.
sealed class NetworkError {
data class NoConnection(val message: String): NetworkError()
data class ServerError(val code: Int): NetworkError()
data class ParseError(val detail: String): NetworkError()
}
suspend fun fetchUser(id: String): Either<NetworkError, User> {
return try {
val response = api.getUser(id)
if (response.isSuccessful) {
Right(response.body()!!)
} else {
Left(NetworkError.ServerError(response.code()))
}
} catch (e: IOException) {
Left(NetworkError.NoConnection(e.message ?: ""))
}
}
Swift da 5.0 versiyasidan boshlab o'rnatilgan Result turi paydo bo'ldi, u konseptual jihatdan Eitherga o'xshaydi, ammo cheklovlarga ega: xato Error protokoliga mos kelishi kerak, muvaffaqiyatli qiymat esa — bitta turga. Swiftdagi Either ikkita generic parametrli enum orqali amalga oshiriladi.
Result<Success, Failure> — Swiftning o'rnatilgan turi, bu yerda Failure: Error. Either xato turiga cheklov qo'ymaydi, bu esa String, maxsus tuzilmalar yoki hatto bir nechta xato turlarini ichma-ich enumlar orqali saqlashga imkon beradi.
enum Either<E, A> {
case left(E)
case right(A)
func map<B>(_ transform: (A) -> B) -> Either<E, B> {
switch self {
case .left(let e): return .left(e)
case .right(let a): return .right(transform(a))
}
}
}
let result: Either<String, Int> = .right(42)
let mapped = result.map { $0 * 2 }
Either istisnosiz, ochiq va tip xavfsiz xato boshqarishni talab qiladigan stsenariylar uchun maqbuldir. Kotlin va Swiftda mobil ishlanmada asosiy qo'llanish holatlarini ko'rib chiqaylik.
Eitherni yon ta'sirlarsiz oddiy operatsiyalar uchun ishlatmang — oddiy qaytariladigan qiymat ishonchliroq va o'qilishi osonroq. Shuningdek, nosozlik kutilgan stsenariy emas, balki istisno holat bo'lsa, Either ortiqcha.
Either Kotlinda korutinlar bilan ishlashda ham samarali. Either qaytaruvchi funksiya korutin ichida fold yoki mapLeft orqali xato boshqaruvi bilan, oqimni bloklamasdan chaqirilishi mumkin. Bu, ayniqsa, har bir repozitoriy Either qaytaradigan va ViewModel natijani UiStatega o'zgartiruvchi MVVM arxitekturali Android ilovalarida foydalidir.
Either bilan birinchi marta tanishayotgan dasturchilar ko'pincha o'xshash xatolarga yo'l qo'yadilar. Eng keng tarqalgan xatolar va ulardan qochish usullarini ko'rib chiqaylik.
Tez-tez beriladigan savollar
Optional qiymatning mavjudligi yoki yo'qligini (Some/None) ifodalaydi, ammo yo'qligining sababini bildirmaydi. Either ikkita aniq tur beradi — xato uchun chap va muvaffaqiyat uchun o'ng, bu esa nosozlik kontekstini uzatishga imkon beradi.
Java da o'rnatilgan Either yo'q, ammo Vavr va functionaljava kutubxonalari amalga oshirishni ta'minlaydi. Android ishlanmasida Vavrdan Either lambda bilan funksional uslub uchun mashhur alternativadir.
Sealed class Kotlinda variantlar ikkitadan ko'p bo'lganda yoki turli tuzilmaga ega bo'lganda qulayroq. Ikkilik natija (xato/muvaffaqiyat) uchun Either ixchamroq va tayyor funksional kombinatorlarni taqdim etadi.
Either o'zgarmas va standart bo'yicha oqim xavfsizdir. Kotlinda korutinlar bilan Either ajoyib birlashadi: flatMap coroutine scope ichida ishlaydi, xato boshqaruvi esa blokirovkalarni talab qilmaydi.
Yo'q. Either kutilgan nosozliklarga ega operatsiyalar uchun mos keladi (tarmoq, validatsiya, biznes mantiq). Yon ta'sirsiz oddiy getterlar va hisoblashlar uchun oddiy tur o'qilishi osonroq va keraksiz murakkablikni qo'shmaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.