Either: mohiyati, qo'llanilishi va ishlash prinsipi

Muallif: IT Sectr Nashr etilgan: 2026-05-26 O'qish vaqti: 8 daq

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 — ikkita o'zaro istisno variantni ifodalash uchun algebraik ma'lumot turi: Left (xato) va Right (muvaffaqiyat).
  • Left an'anaviy ravishda xato haqidagi ma'lumotni o'z ichiga oladi, Right — to'g'ri qiymat.
  • Ochiq tiplashtirish — Either ikkala variantni kompilyatsiya bosqichida qayta ishlashga majbur qiladi, kutilmagan nosozliklarni istisno qiladi.
  • Kompozitsiya — Either map, flatMap va fold ni o'zgartirish zanjirlari uchun qo'llab-quvvatlaydi.
  • Resultdan farqi — Either faqat Error yoki Throwable emas, balki ixtiyoriy xato turini saqlashi mumkin.

Either nima?

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 qanday ishlaydi: Left va Right tuzilmasi

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 turi: xato konteyneri

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 turi: muvaffaqiyat konteyneri

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 orqali Either kompozitsiyasi

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.

kotlin
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) }

Kotlinda Either: amaliy qo'llanilish

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 kutubxonasi va Either

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().

Misol: tarmoq so'rovi bilan Either

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.

kotlin
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 ?: ""))
    }
}

Swiftda Either: standart Resultdan farqi

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.

Standart Result va Either solishtirish

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.

swift
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 }

Mobil ilovalarda Either qachon ishlatiladi

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.

  • Tarmoq so'rovlari — har bir so'rov ulanish, server yoki pars xatosini qaytarishi mumkin. Either barcha variantlarni bir turda to'playdi.
  • Forma validatsiyasi — maxsus xato turi bilan Either kiritish maydonlarini tekshirish natijasini qulay ifodalaydi: noto'g'ri email yoki parol.
  • Ma'lumot repozitoriyasi — Either turli manbalardan (kesh, ma'lumotlar bazasi, tarmoq) natijani yagona xato turi bilan birlashtirishga imkon beradi.
  • Buyruq interpretatori — agar ilova foydalanuvchi kiritishini yoki buyruqlarini tahlil qilsa, Either xato haqida xabar berishning tip xavfsiz usulini ta'minlaydi.

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 ishlashda odatiy xatolar

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.

  • Leftni e'tiborsiz qoldirish — .getOrElse() ni xato sababini tahlil qilmasdan chaqirish Either ishlatishni ma'nosiz qiladi. Xatoni ochiq boshqaring.
  • Global xato turi — loyihadagi barcha Eitherlar uchun umumiy tur sifatida String yoki Exception ishlatish tip xavfsizligini pasaytiradi. Domen sealed classlarini yarating.
  • Ichma-ich Eitherlar — Right ichida takroriy Either (Either<E, Either<E, A>>) o'qishni qiyinlashtiradi. Tekislash uchun flatMap dan foydalaning.
  • Istisnolar bilan aralashtirish — funksiya Either qaytaradi, lekin ichida istisno tashlaydi. Bu ochiq xato boshqarish g'oyasiga ziddir.

Tez-tez beriladigan savollar

Either Optionaldan qanday farq qiladi?

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.

Either Javada ishlatilishi mumkinmi?

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.

Qachon Either o'rniga sealed class ishlatish kerak?

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 ko'p oqimlilikni qo'llab-quvvatlaydimi?

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.

Either loyihadagi barcha funksiyalar uchun ishlatilishi kerakmi?

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

  • Either — ikkita variantni ifodalash uchun funksional tur: Left (xato) va Right (muvaffaqiyat), nosozliklarni qayta ishlashni tip darajasida ochiq qiladi.
  • Left standart Resultdan farqli o'laroq, Stringdan domen sealed classigacha ixtiyoriy xato turini o'z ichiga olishi mumkin.
  • flatMap Either kompozitsiyasini ichma-ich tekshirishlarsiz ta'minlaydi: xato avtomatik ravishda butun zanjir bo'ylab tarqaladi.
  • Arrow — Kotlin uchun Eitherning asosiy kutubxonasi, korutinlar va kengaytmalar uchun o'rnatilgan qo'llab-quvvatlash bilan.
  • Swift o'rnatilgan Resultdan foydalanadi, ammo Either to'liq moslashuvchanlik uchun ikkita generic parametrli enum orqali amalga oshiriladi.
  • Eitherni tarmoq so'rovlari, forma validatsiyasi va repozitoriyalar uchun qo'llang — kutilgan xatoli stsenariylar.
  • Global xato turi, Leftni e'tiborsiz qoldirish va ichma-ich Eitherlardan saqlaning — bu tip xavfsizligi afzalliklarini kamaytiradi.

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.

Loyihani muhokama qilish

Shuningdek o'qing