Either: সারমর্ম, ব্যবহার এবং কাজের নীতি

লেখক: IT Sectr প্রকাশিত: 2026-05-26 পড়ার সময়: 8 মিনিট

Either একটি ফাংশনাল টাইপ যা দুটি সম্ভাব্য ভেরিয়েন্টের একটি মান উপস্থাপন করে: ত্রুটির জন্য Left এবং সাফল্যের জন্য Right। ব্যতিক্রমগুলির বিপরীতে, Either ত্রুটি পরিচালনাকে টাইপ স্তরে স্পষ্ট করে এবং try-catch ব্লকের প্রয়োজন হয় না। Arrow, 2026 অনুসারে, Either ব্যাপকভাবে Kotlin প্রজেক্টে সেইসব অপারেশন কম্পোজ করার জন্য ব্যবহৃত হয় যা সাইড ইফেক্ট ছাড়াই ব্যর্থ হতে পারে।

মূল বিষয়

  • Either দুটি পরস্পরবিরোধী ভেরিয়েন্ট উপস্থাপনের জন্য একটি বীজগাণিতিক ডেটা টাইপ: Left (ত্রুটি) এবং Right (সাফল্য)।
  • Left ঐতিহ্যগতভাবে ত্রুটির তথ্য ধারণ করে, Right সঠিক মান ধারণ করে।
  • স্পষ্ট টাইপিং — Either কম্পাইল সময়ে উভয় ভেরিয়েন্ট পরিচালনা করতে বাধ্য করে, অপ্রত্যাশিত ব্যর্থতা দূর করে।
  • কম্পোজিশন — Either নেস্টেড চেক ছাড়াই ট্রান্সফরমেশন চেইনের জন্য map, flatMap এবং fold সমর্থন করে।
  • Result থেকে পার্থক্য — Either শুধু Error বা Throwable নয়, বরং যেকোনো ত্রুটি টাইপ সংরক্ষণ করতে পারে।

Either কী?

Either একটি বীজগাণিতিক ডেটা টাইপ, যা ফাংশনাল প্রোগ্রামিং থেকে নেওয়া, যা দুটি সম্ভাব্য টাইপের মধ্যে ঠিক একটি মান উপস্থাপন করে। ত্রুটি পরিচালনার প্রসঙ্গে, নিয়ম হল: Left টাইপ (Left) সমস্যার বিবরণ ধারণ করে, যখন Right টাইপ (Right) সফল ফলাফল ধারণ করে।

Either-এর ধারণাটি Haskell ভাষা এবং Either a b টাইপ ক্যাটাগরি থেকে উদ্ভূত, যেখানে a হল বাম মানের টাইপ এবং b হল ডানের টাইপ। মোবাইল ডেভেলপমেন্টে, Either Kotlin-এর জন্য Arrow লাইব্রেরি এবং Swift-এ ফাংশনাল পদ্ধতির কারণে জনপ্রিয়তা অর্জন করেছে।

ব্যতিক্রমের ওপর Either-এর মূল সুবিধা হল কোনো লুকানো এক্সিকিউশন পাথ নেই। Either রিটার্ন করা একটি ফাংশন তার সিগনেচারে স্পষ্টভাবে ঘোষণা করে যে এটি ব্যর্থ হতে পারে। কম্পাইলার নিয়ন্ত্রণ করে যে উভয় ভেরিয়েন্ট পরিচালনা করা হয়েছে কিনা।

ব্যতিক্রম ছোঁড়ার বিপরীতে, Either ডেটা ফ্লো স্বচ্ছতা বজায় রাখে। Either রিটার্ন করে এমন ফাংশন কল করার জন্য কলার পাশে try-catch প্রয়োজন হয় না — pattern-matching বা fold যথেষ্ট। এটি বিশেষ করে রিঅ্যাকটিভ পদ্ধতির আর্কিটেকচারে গুরুত্বপূর্ণ, যেখানে প্রতিটি ডেটা সোর্স Either রিটার্ন করে এবং ট্রান্সফরমেশন চেইন map ও flatMap-এর মাধ্যমে তৈরি হয়।

Either কীভাবে কাজ করে: Left এবং Right গঠন

Either দুটি সাবটাইপ নিয়ে গঠিত: Left এবং Right। Either-এর একটি ইনস্ট্যান্স যেকোনো মুহূর্তে তাদের মধ্যে শুধু একটি হতে পারে। Kotlin-ে সাধারণ সিগনেচার হল Either<E, A>, যেখানে E হল ত্রুটির টাইপ এবং A হল সফল মানের টাইপ।

Left টাইপ: ত্রুটি কন্টেইনার

Left ব্যর্থতার ক্ষেত্রে উপস্থাপন করে। ব্যতিক্রমের বিপরীতে, Left এক্সিকিউশন ফ্লো বাধাগ্রস্ত করে না — এটি কেবল একটি মান রিটার্ন করে যা পরিচালনা করা প্রয়োজন। ত্রুটির টাইপ যেকোনো কিছু হতে পারে: String, Int, কাস্টম sealed class বা ডোমেন মডেল।

Right টাইপ: সাফল্য কন্টেইনার

Right অপারেশনের সঠিক ফলাফল ধারণ করে। নামটি সঠিকতা প্রতিফলিত করে — নিয়ম অনুযায়ী, Right মানে সাফল্য। map এবং flatMap-এর মতো ট্রান্সফরমেশনগুলি Right-এ প্রয়োগ করা হয়, যা প্রতিটি ধাপ চেক না করেই গণনা চেইন সক্ষম করে।

flatMap-এর মাধ্যমে Either কম্পোজিশন

flatMap Either কম্পোজিশনের প্রধান প্রক্রিয়া। যদি বর্তমান মান Right হয়, flatMap পাস করা ফাংশন প্রয়োগ করে এবং একটি নতুন Either রিটার্ন করে। যদি Left হয়, flatMap ট্রান্সফরমেশন এড়িয়ে যায় এবং ত্রুটিটি সামনে প্রেরণ করে। এই আচরণকে শর্ট-সার্কিট মূল্যায়ন বলা হয়।

flatMap ছাড়াও, Either mapLeft (ত্রুটি ট্রান্সফরমেশনের জন্য), fold (এক জায়গায় উভয় ভেরিয়েন্ট পরিচালনার জন্য) এবং getOrElse (ডিফল্ট মান সহ মান বের করার জন্য) সমর্থন করে। এই ফাংশনগুলি সব পরিস্থিতি কভার করে: সাধারণ নিষ্কাশন থেকে শুরু করে Kotlin করুটিন বা Swift কম্বাইনে অ্যাসিঙ্ক্রোনাস কল সহ জটিল কম্পোজিশন পর্যন্ত।

kotlin
fun parseInt(input: String): Either<String, Int> =
    input.toIntOrNull()?.let { Right(it) }
    ?: Left("রূপান্তর করতে ব্যর্থ: $input")

fun divide(a: Int, b: Int): Either<String, Int> =
    if (b == 0) Left("শূন্য দ্বারা ভাগ")
    else Right(a / b)

val result = parseInt("10")
    .flatMap { divide(it, 2) }

Kotlin-এ Either: ব্যবহারিক প্রয়োগ

Kotlin ইকোসিস্টেমে, Either Arrow লাইব্রেরিতে বাস্তবায়িত। Kotlin স্ট্যান্ডার্ড লাইব্রেরি Result অফার করে, কিন্তু Either বেশি নমনীয়তা দেয়: ইচ্ছামত ত্রুটি টাইপ, flatMap-এর মাধ্যমে কম্পোজিশন এবং ফাংশনাল প্যাটার্নের জন্য সমর্থন।

Arrow লাইব্রেরি এবং Either

Arrow Kotlin-এর জন্য একটি ফাংশনাল লাইব্রেরি যা Either, Option, Validated এবং অন্যান্য টাইপ যোগ করে। Arrow.Either দুটি সাবক্লাস সহ একটি sealed class: ArrowCore.Left এবং ArrowCore.Right। লাইব্রেরিটি সুবিধাজনক এক্সটেনশনও প্রদান করে: .getOrElse(), .fold(), .mapLeft()

উদাহরণ: নেটওয়ার্ক রিকোয়েস্ট সহ Either

একটি বাস্তব পরিস্থিতি বিবেচনা করুন — সম্ভাব্য ত্রুটি সহ একটি Android অ্যাপে নেটওয়ার্ক রিকোয়েস্ট: নেটওয়ার্ক নেই, সার্ভার ত্রুটি, ভুল প্রতিক্রিয়া। Either সব ভেরিয়েন্টকে একটি রিটার্ন টাইপে একত্রিত করতে দেয়।

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

Swift-এ Either: স্ট্যান্ডার্ড Result থেকে পার্থক্য

Swift-এ, সংস্করণ 5.0 থেকে, বিল্ট-ইন Result টাইপ উপলব্ধ যা ধারণাগতভাবে Either-এর মতো কিন্তু সীমাবদ্ধতা রয়েছে: ত্রুটিকে Error প্রোটোকল মেনে চলতে হবে, এবং সফল মান একটি টাইপের হতে হবে। Swift-এ Either দুটি জেনেরিক প্যারামিটার সহ একটি enum-এর মাধ্যমে বাস্তবায়িত হয়।

স্ট্যান্ডার্ড Result বনাম Either

Result<Success, Failure> Swift-এর বিল্ট-ইন টাইপ, যেখানে Failure: Error। Either ত্রুটি টাইপের ওপর কোনো বাধ্যবাধকতা আরোপ করে না, যা String, কাস্টম স্ট্রাকচার বা নেস্টেড enum-এর মাধ্যমে একাধিক ত্রুটি টাইপ সংরক্ষণ করতে দেয়।

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 }

মোবাইল অ্যাপে কখন Either ব্যবহার করবেন

Either সেই পরিস্থিতির জন্য সর্বোত্তম যেখানে ব্যতিক্রম ছাড়া স্পষ্ট এবং টাইপ-নিরাপদ ত্রুটি পরিচালনার প্রয়োজন হয়। Kotlin এবং Swift-এ মোবাইল ডেভেলপমেন্টে প্রধান ব্যবহারের ক্ষেত্রে বিবেচনা করুন।

  • নেটওয়ার্ক রিকোয়েস্ট — প্রতিটি রিকোয়েস্ট সংযোগ ত্রুটি, সার্ভার ত্রুটি বা পার্সিং ত্রুটি রিটার্ন করতে পারে। Either সব ভেরিয়েন্টকে এক টাইপে সংগ্রহ করে।
  • ফর্ম বৈধতা — কাস্টম ত্রুটি টাইপ সহ Either ইনপুট ফিল্ড বৈধতা ফলাফল সুবিধাজনকভাবে উপস্থাপন করে: অবৈধ ইমেল বা পাসওয়ার্ড।
  • ডেটা রিপজিটরি — Either একটি ইউনিফাইড ত্রুটি টাইপের সাথে বিভিন্ন উৎস (ক্যাশ, DB, নেটওয়ার্ক) থেকে ফলাফল একত্রিত করতে দেয়।
  • কমান্ড ইন্টারপ্রেটার — যদি অ্যাপ ব্যবহারকারীর ইনপুট বা কমান্ড পার্স করে, Either ত্রুটি রিপোর্ট করার একটি টাইপ-নিরাপদ উপায় প্রদান করে।

সাইড ইফেক্ট ছাড়া সাধারণ অপারেশনের জন্য Either ব্যবহার করবেন না — সাধারণ রিটার্ন মান বেশি নির্ভরযোগ্য এবং পড়তে সহজ। Either তখনও অতিরিক্ত যখন ব্যর্থতা একটি অসাধারণ পরিস্থিতি, প্রত্যাশিত পরিস্থিতি নয়।

Either Kotlin-এ করুটিনের সাথে কাজ করার সময়ও কার্যকর। Either রিটার্ন করে এমন একটি ফাংশন থ্রেড ব্লক না করে fold বা mapLeft-এর মাধ্যমে ত্রুটি পরিচালনা সহ করুটিনের ভিতরে কল করা যেতে পারে। এটি MVVM আর্কিটেকচার সহ Android অ্যাপে বিশেষভাবে উপযোগী, যেখানে প্রতিটি রিপজিটরি Either রিটার্ন করে এবং ViewModel ফলাফলকে UiState-এ রূপান্তর করে।

Either নিয়ে কাজ করার সময় সাধারণ ভুল

Either-এর সাথে প্রথমবার পরিচিত ডেভেলপাররা প্রায়ই একই রকম ভুল করে। সবচেয়ে সাধারণ ভুল এবং সেগুলি এড়ানোর উপায় দেখি।

  • Left উপেক্ষা করা — ত্রুটির কারণ বিশ্লেষণ না করে ডিফল্ট মান সহ .getOrElse() কল করা Either ব্যবহারের অর্থ নষ্ট করে। ত্রুটিটি স্পষ্টভাবে পরিচালনা করুন।
  • গ্লোবাল ত্রুটি টাইপ — প্রজেক্টে সব Either-এর জন্য সাধারণ টাইপ হিসেবে String বা Exception ব্যবহার করা টাইপ নিরাপত্তা কমিয়ে দেয়। ডোমেন sealed class তৈরি করুন।
  • নেস্টেড Either — Right-এর ভিতরে Either (Either<E, Either<E, A>>) পড়তে অসুবিধা সৃষ্টি করে। সমতল করার জন্য flatMap ব্যবহার করুন।
  • ব্যতিক্রমের সাথে মিশ্রণ — ফাংশন Either রিটার্ন করে কিন্তু ভিতরে ব্যতিক্রম ছোঁড়ে। এটি স্পষ্ট ত্রুটি পরিচালনার ধারণার বিরোধিতা করে।

সচরাচর জিজ্ঞাসিত প্রশ্ন

Either কীভাবে Optional থেকে আলাদা?

Optional মানের উপস্থিতি বা অনুপস্থিতি (Some/None) উপস্থাপন করে, কিন্তু অনুপস্থিতির কারণ জানায় না। Either দুটি নির্দিষ্ট টাইপ দেয় — ত্রুটির জন্য বাম এবং সাফল্যের জন্য ডান — যা ব্যর্থতার প্রসঙ্গ পাস করতে দেয়।

Java-তে Either ব্যবহার করা যাবে?

Java-তে বিল্ট-ইন Either নেই, কিন্তু Vavr এবং functionaljava লাইব্রেরি বাস্তবায়ন প্রদান করে। Android ডেভেলপমেন্টে, Vavr-এর Either ল্যাম্বডা সহ ফাংশনাল স্টাইলের জন্য একটি জনপ্রিয় বিকল্প।

কখন Either-এর পরিবর্তে sealed class ব্যবহার করা উচিত?

Kotlin-এ Sealed class বেশি সুবিধাজনক যখন দুটির বেশি ভেরিয়েন্ট থাকে বা তাদের গঠন ভিন্ন হয়। বাইনারি ফলাফলের (ত্রুটি/সাফল্য) জন্য, Either বেশি কম্প্যাক্ট এবং প্রস্তুত ফাংশনাল কম্বিনেটর প্রদান করে।

Either কি মাল্টিথ্রেডিং সমর্থন করে?

Either অপরিবর্তনীয় এবং ডিফল্টভাবে থ্রেড-নিরাপদ। Kotlin-এ করুটিনের সাথে, Either পুরোপুরি কম্বাইন হয়: flatMap করুটিন স্কোপের ভিতরে কাজ করে এবং ত্রুটি পরিচালনার জন্য লক প্রয়োজন হয় না।

প্রজেক্টের সব ফাংশনের জন্য Either ব্যবহার করা উচিত?

না। Either প্রত্যাশিত ব্যর্থতা (নেটওয়ার্ক, বৈধতা, বিজনেস লজিক) সহ অপারেশনের জন্য উপযুক্ত। সাইড ইফেক্ট ছাড়া সাধারণ গেটার এবং গণনার জন্য, সাধারণ টাইপ পড়তে সহজ এবং অপ্রয়োজনীয় জটিলতা যোগ করে না।

সারসংক্ষেপ

  • Either দুটি ভেরিয়েন্ট উপস্থাপনের জন্য একটি ফাংশনাল টাইপ: Left (ত্রুটি) এবং Right (সাফল্য), যা টাইপ স্তরে ত্রুটি পরিচালনাকে স্পষ্ট করে।
  • Left স্ট্যান্ডার্ড Result-এর বিপরীতে, String থেকে ডোমেন sealed class পর্যন্ত যেকোনো ত্রুটি টাইপ ধারণ করতে পারে।
  • flatMap নেস্টেড চেক ছাড়াই Either কম্পোজিশন সক্ষম করে: ত্রুটি স্বয়ংক্রিয়ভাবে পুরো চেইনে প্রসারিত হয়।
  • Arrow Kotlin-এর জন্য প্রধান Either লাইব্রেরি যার বিল্ট-ইন করুটিন সমর্থন এবং এক্সটেনশন রয়েছে।
  • Swift বিল্ট-ইন Result ব্যবহার করে, কিন্তু Either সম্পূর্ণ নমনীয়তার জন্য দুটি জেনেরিক প্যারামিটার সহ enum-এর মাধ্যমে বাস্তবায়ন করা যেতে পারে।
  • নেটওয়ার্ক রিকোয়েস্ট, ফর্ম বৈধতা এবং রিপজিটরির জন্য Either ব্যবহার করুন — প্রত্যাশিত ত্রুটি সহ পরিস্থিতি।
  • গ্লোবাল ত্রুটি টাইপ, Left উপেক্ষা করা এবং নেস্টেড Either এড়িয়ে চলুন — এগুলো টাইপ নিরাপত্তার সুবিধা হ্রাস করে।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন