Either একটি ফাংশনাল টাইপ যা দুটি সম্ভাব্য ভেরিয়েন্টের একটি মান উপস্থাপন করে: ত্রুটির জন্য Left এবং সাফল্যের জন্য Right। ব্যতিক্রমগুলির বিপরীতে, Either ত্রুটি পরিচালনাকে টাইপ স্তরে স্পষ্ট করে এবং try-catch ব্লকের প্রয়োজন হয় না। Arrow, 2026 অনুসারে, Either ব্যাপকভাবে Kotlin প্রজেক্টে সেইসব অপারেশন কম্পোজ করার জন্য ব্যবহৃত হয় যা সাইড ইফেক্ট ছাড়াই ব্যর্থ হতে পারে।
মূল বিষয়
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-এর একটি ইনস্ট্যান্স যেকোনো মুহূর্তে তাদের মধ্যে শুধু একটি হতে পারে। Kotlin-ে সাধারণ সিগনেচার হল Either<E, A>, যেখানে E হল ত্রুটির টাইপ এবং A হল সফল মানের টাইপ।
Left ব্যর্থতার ক্ষেত্রে উপস্থাপন করে। ব্যতিক্রমের বিপরীতে, Left এক্সিকিউশন ফ্লো বাধাগ্রস্ত করে না — এটি কেবল একটি মান রিটার্ন করে যা পরিচালনা করা প্রয়োজন। ত্রুটির টাইপ যেকোনো কিছু হতে পারে: String, Int, কাস্টম sealed class বা ডোমেন মডেল।
Right অপারেশনের সঠিক ফলাফল ধারণ করে। নামটি সঠিকতা প্রতিফলিত করে — নিয়ম অনুযায়ী, Right মানে সাফল্য। map এবং flatMap-এর মতো ট্রান্সফরমেশনগুলি Right-এ প্রয়োগ করা হয়, যা প্রতিটি ধাপ চেক না করেই গণনা চেইন সক্ষম করে।
flatMap Either কম্পোজিশনের প্রধান প্রক্রিয়া। যদি বর্তমান মান Right হয়, flatMap পাস করা ফাংশন প্রয়োগ করে এবং একটি নতুন Either রিটার্ন করে। যদি Left হয়, flatMap ট্রান্সফরমেশন এড়িয়ে যায় এবং ত্রুটিটি সামনে প্রেরণ করে। এই আচরণকে শর্ট-সার্কিট মূল্যায়ন বলা হয়।
flatMap ছাড়াও, Either mapLeft (ত্রুটি ট্রান্সফরমেশনের জন্য), fold (এক জায়গায় উভয় ভেরিয়েন্ট পরিচালনার জন্য) এবং getOrElse (ডিফল্ট মান সহ মান বের করার জন্য) সমর্থন করে। এই ফাংশনগুলি সব পরিস্থিতি কভার করে: সাধারণ নিষ্কাশন থেকে শুরু করে Kotlin করুটিন বা Swift কম্বাইনে অ্যাসিঙ্ক্রোনাস কল সহ জটিল কম্পোজিশন পর্যন্ত।
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 Arrow লাইব্রেরিতে বাস্তবায়িত। Kotlin স্ট্যান্ডার্ড লাইব্রেরি Result অফার করে, কিন্তু Either বেশি নমনীয়তা দেয়: ইচ্ছামত ত্রুটি টাইপ, flatMap-এর মাধ্যমে কম্পোজিশন এবং ফাংশনাল প্যাটার্নের জন্য সমর্থন।
Arrow Kotlin-এর জন্য একটি ফাংশনাল লাইব্রেরি যা Either, Option, Validated এবং অন্যান্য টাইপ যোগ করে। Arrow.Either দুটি সাবক্লাস সহ একটি sealed class: ArrowCore.Left এবং ArrowCore.Right। লাইব্রেরিটি সুবিধাজনক এক্সটেনশনও প্রদান করে: .getOrElse(), .fold(), .mapLeft()।
একটি বাস্তব পরিস্থিতি বিবেচনা করুন — সম্ভাব্য ত্রুটি সহ একটি Android অ্যাপে নেটওয়ার্ক রিকোয়েস্ট: নেটওয়ার্ক নেই, সার্ভার ত্রুটি, ভুল প্রতিক্রিয়া। Either সব ভেরিয়েন্টকে একটি রিটার্ন টাইপে একত্রিত করতে দেয়।
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-এ, সংস্করণ 5.0 থেকে, বিল্ট-ইন Result টাইপ উপলব্ধ যা ধারণাগতভাবে Either-এর মতো কিন্তু সীমাবদ্ধতা রয়েছে: ত্রুটিকে Error প্রোটোকল মেনে চলতে হবে, এবং সফল মান একটি টাইপের হতে হবে। Swift-এ Either দুটি জেনেরিক প্যারামিটার সহ একটি enum-এর মাধ্যমে বাস্তবায়িত হয়।
Result<Success, Failure> Swift-এর বিল্ট-ইন টাইপ, যেখানে Failure: Error। Either ত্রুটি টাইপের ওপর কোনো বাধ্যবাধকতা আরোপ করে না, যা String, কাস্টম স্ট্রাকচার বা নেস্টেড enum-এর মাধ্যমে একাধিক ত্রুটি টাইপ সংরক্ষণ করতে দেয়।
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 সেই পরিস্থিতির জন্য সর্বোত্তম যেখানে ব্যতিক্রম ছাড়া স্পষ্ট এবং টাইপ-নিরাপদ ত্রুটি পরিচালনার প্রয়োজন হয়। Kotlin এবং Swift-এ মোবাইল ডেভেলপমেন্টে প্রধান ব্যবহারের ক্ষেত্রে বিবেচনা করুন।
সাইড ইফেক্ট ছাড়া সাধারণ অপারেশনের জন্য Either ব্যবহার করবেন না — সাধারণ রিটার্ন মান বেশি নির্ভরযোগ্য এবং পড়তে সহজ। Either তখনও অতিরিক্ত যখন ব্যর্থতা একটি অসাধারণ পরিস্থিতি, প্রত্যাশিত পরিস্থিতি নয়।
Either Kotlin-এ করুটিনের সাথে কাজ করার সময়ও কার্যকর। Either রিটার্ন করে এমন একটি ফাংশন থ্রেড ব্লক না করে fold বা mapLeft-এর মাধ্যমে ত্রুটি পরিচালনা সহ করুটিনের ভিতরে কল করা যেতে পারে। এটি MVVM আর্কিটেকচার সহ Android অ্যাপে বিশেষভাবে উপযোগী, যেখানে প্রতিটি রিপজিটরি Either রিটার্ন করে এবং ViewModel ফলাফলকে UiState-এ রূপান্তর করে।
Either-এর সাথে প্রথমবার পরিচিত ডেভেলপাররা প্রায়ই একই রকম ভুল করে। সবচেয়ে সাধারণ ভুল এবং সেগুলি এড়ানোর উপায় দেখি।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Optional মানের উপস্থিতি বা অনুপস্থিতি (Some/None) উপস্থাপন করে, কিন্তু অনুপস্থিতির কারণ জানায় না। Either দুটি নির্দিষ্ট টাইপ দেয় — ত্রুটির জন্য বাম এবং সাফল্যের জন্য ডান — যা ব্যর্থতার প্রসঙ্গ পাস করতে দেয়।
Java-তে বিল্ট-ইন Either নেই, কিন্তু Vavr এবং functionaljava লাইব্রেরি বাস্তবায়ন প্রদান করে। Android ডেভেলপমেন্টে, Vavr-এর Either ল্যাম্বডা সহ ফাংশনাল স্টাইলের জন্য একটি জনপ্রিয় বিকল্প।
Kotlin-এ Sealed class বেশি সুবিধাজনক যখন দুটির বেশি ভেরিয়েন্ট থাকে বা তাদের গঠন ভিন্ন হয়। বাইনারি ফলাফলের (ত্রুটি/সাফল্য) জন্য, Either বেশি কম্প্যাক্ট এবং প্রস্তুত ফাংশনাল কম্বিনেটর প্রদান করে।
Either অপরিবর্তনীয় এবং ডিফল্টভাবে থ্রেড-নিরাপদ। Kotlin-এ করুটিনের সাথে, Either পুরোপুরি কম্বাইন হয়: flatMap করুটিন স্কোপের ভিতরে কাজ করে এবং ত্রুটি পরিচালনার জন্য লক প্রয়োজন হয় না।
না। Either প্রত্যাশিত ব্যর্থতা (নেটওয়ার্ক, বৈধতা, বিজনেস লজিক) সহ অপারেশনের জন্য উপযুক্ত। সাইড ইফেক্ট ছাড়া সাধারণ গেটার এবং গণনার জন্য, সাধারণ টাইপ পড়তে সহজ এবং অপ্রয়োজনীয় জটিলতা যোগ করে না।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন