Elvis Operator হল একটি বাইনারি অপারেটর যা বাম অপারেন্ড রিটার্ন করে যদি এটি null না হয়, এবং অন্যথায় ডান অপারেন্ড রিটার্ন করে। এটি Kotlin, Groovy এবং কিছু অন্যান্য ভাষায় ?: হিসেবে লেখা হয়। Kotlin Language Documentation, 2024 অনুসারে, অপারেটরটি ভাষার null-সুরক্ষা সিস্টেমের অংশ এবং পঠনযোগ্যতা না হারিয়ে শর্তসাপেক্ষ কাঠামোকে এক লাইনে সংক্ষিপ্ত করতে দেয়। পূর্ণাঙ্গ if-else এক্সপ্রেশনের বিপরীতে, Elvis Operator ডান পাশটি মূল্যায়ন করে শুধুমাত্র যখন বাম পাশটি null হয়, যা ব্যয়বহুল ডিফল্ট এক্সপ্রেশন ব্যবহার করার সময় কর্মক্ষমতা সুবিধা দেয়।
মূল পয়েন্ট
Elvis Operator হল একটি বাইনারি অপারেটর যা এলভিস প্রেসলির চুলের স্টাইলের নামে নামকরণ করা হয়েছে। ?: চিহ্নটি পাশ থেকে গায়কের মুখের মতো দেখায়: প্রশ্নবোধক চিহ্নটি চোখ ও সাইডবার্ন, কোলনটি মুখ। অপারেটর দুটি অপারেন্ড নেয়: যদি প্রথমটি null না হয় — সেটি রিটার্ন করা হয়, অন্যথায় দ্বিতীয়টি রিটার্ন করা হয়। এটি একটি পূর্ণাঙ্গ if-else কাঠামোকে একটি ছোট এক্সপ্রেশন দিয়ে প্রতিস্থাপন করতে দেয়।
“Elvis Operator” নামটি Kotlin এবং Groovy কমিউনিটিতে প্রতিষ্ঠিত হয়েছে এবং পরে Xtend ও অন্যান্য JVM ভাষায় ছড়িয়ে পড়েছে। Swift এবং Dart-এ অনুরূপ কাঠামোকে nil-coalescing operator বলা হয়, কিন্তু এটি কার্যকরীভাবে অভিন্ন। এলভিস প্রেসলির সাথে দৃশ্যমান সম্পর্ক অপারেটরটিকে আধুনিক প্রোগ্রামিং ভাষার সিনট্যাক্সে সবচেয়ে পরিচিত প্রতীকগুলির একটি হতে সাহায্য করেছে।
Elvis Operator null safety সিস্টেমের অংশ যা NullPointerException (NPE) প্রতিরোধ করে। JetBrains 2023-এর একটি গবেষণা অনুসারে, NPE প্রোডাকশন JVM কোডে 28% সমস্ত ব্যতিক্রমের কারণ। Elvis Operator ব্যবহার অ্যাসাইনমেন্ট পয়েন্টে NPE সম্পূর্ণরূপে দূর করে, একটি ডিফল্ট মান নিশ্চিত করে। নিরাপদ কল অপারেটর ?. এর সাথে সংমিশ্রণে, একটি নির্ভরযোগ্য চেইন তৈরি হয় যেখানে একটি if ব্লকও থাকে না।
Kotlin-এ, Elvis Operator দুটি এক্সপ্রেশনের মধ্যে ?: হিসেবে লেখা হয়। যদি বাম এক্সপ্রেশনটি null না হয় — ফলাফল বামটির সমান হয়, অন্যথায় ডানটি মূল্যায়ন করা হয়। ডান এক্সপ্রেশনটি অলসভাবে মূল্যায়ন করা হয় — শুধুমাত্র যখন বাম অপারেন্ড null হয়, যা ব্যয়বহুল গণনা বা API কল ব্যবহার করার সময় কর্মক্ষমতার জন্য গুরুত্বপূর্ণ।
val name: String? = getUserName()
val displayName = name ?: "Guest"
fun getLength(str: String?): Int {
return str?.length ?: 0
}
val config: Config? = loadConfig()
val timeout = config?.timeout ?: 30
println("Timeout: $timeout")
// Elvis throw সহ প্রয়োজনীয় প্যারামিটারের জন্য
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")
// Elvis return সহ তাড়াতাড়ি প্রস্থানের জন্য
fun process(data: String?): Result {
val safe = data ?: return Result.failure("No data")
return processInternal(safe)
}
let-এর সাথে সংমিশ্রণ Kotlin-এ একটি সাধারণ প্যাটার্ন, যেখানে Elvis Operator একটি ডিফল্ট মান প্রদান করে, এবং let নন-null ফলাফলে একটি কাজ সম্পাদন করে। এই পদ্ধতি পঠনযোগ্যতা না হারিয়ে সম্পূর্ণ if-else ব্লককে একটি কল চেইন দিয়ে প্রতিস্থাপন করে। Elvis Operator throw-এর সাথেও ব্যবহার করা যেতে পারে একটি আবশ্যক প্যারামিটার অনুপস্থিত থাকলে জোর করে বন্ধ করার জন্য — এটি ইনপুট ডেটা বৈধতা দেওয়ার একটি স্বাভাবিক উপায়।
Kotlin-এ একটি সাধারণ প্যাটার্ন হল Elvis + return। যদি মান null হয়, ফাংশন তাৎক্ষণিকভাবে ফলাফল রিটার্ন করে বা একটি ব্যতিক্রম নিক্ষেপ করে। Elvis with return ইডিয়ম প্রায়ই ডেটা ট্রান্সফরমেশন ফাংশনে ব্যবহৃত হয়: val processed = rawData ?: return defaultValue। এটি Swift-এর guard let থেকে বেশি সংক্ষিপ্ত এবং কোড নেস্টিং বাড়ায় না।
Elvis Operator if-else থেকে ছোট এবং ভেরিয়েবল পুনরাবৃত্তির প্রয়োজন নেই। তুলনা করুন: val x = a ?: b বনাম val x = if (a != null) a else b। জটিল এক্সপ্রেশনের সাথে, কোড হ্রাস 60% পর্যন্ত পৌঁছায়, অন্যদিকে সিম্যান্টিক্স সম্পূর্ণ অভিন্ন — কম্পাইলার উভয় ভেরিয়েন্টের জন্য একই বাইটকোড তৈরি করতে পারে।
| মাপকাঠি | Elvis Operator | if-else |
|---|---|---|
| দৈর্ঘ্য | 1 লাইন, 5–10 অক্ষর | 3 লাইন, 15–30 অক্ষর |
| এক্সপ্রেশন পুনরাবৃত্তি | না | হ্যাঁ (a != null) ? a : b |
| অলস ডান দিক | হ্যাঁ | হ্যাঁ (elvis ছোট) |
| পার্শ্ব প্রতিক্রিয়া | শুধুমাত্র ডান দিকে | উভয় শাখায় |
| পঠনযোগ্যতা | সাধারণ ক্ষেত্রে উচ্চ | জটিল লজিকের জন্য ভালো |
Elvis Operator ডিফল্ট মান নির্ধারণ, নিরাপদ অ্যাক্সেস সহ ফাংশন কল চেইন করা এবং অনুপস্থিত মান লগ করার জন্য সর্বোত্তম। Kotlin-এর স্বাভাবিক প্যাটার্ন একে এক্সপ্রেশনে সাধারণ null পরীক্ষার জন্য if-else-এর প্রতিস্থাপন হিসেবে সুপারিশ করে। ?. এর সাথে সংমিশ্রণে, এটি অস্থায়ী ভেরিয়েবল ছাড়াই সংক্ষিপ্ত চেইন তৈরি করে।
if-else একাধিক অবস্থার জন্য, যখন পার্শ্ব প্রতিক্রিয়া সম্পাদনের প্রয়োজন হয়, বা যখন উভয় অপারেন্ড জটিল কোড ব্লক হয় একাধিক অপারেশন সহ, তখন ভালো থাকে। Elvis Operator নেস্টেড ব্লক সমর্থন করে না — প্রতিটি অপারেন্ডের জন্য শুধুমাত্র একক এক্সপ্রেশন। যদি ডান দিক পার্শ্ব প্রতিক্রিয়া সহ ফাংশন কল করে, তাহলে if-else-এর পঠনযোগ্যতা বেশি।
Groovy ঠিক Kotlin-এর মতোই ?: সিনট্যাক্স ব্যবহার করে, কারণ উভয় ভাষাই JVM-এ চলে এবং null-safety দর্শন ভাগ করে। অপারেটরটি Groovy-তে আগে আবির্ভূত হয়েছিল — এটি 2011 সালে প্রকাশিত সংস্করণ 1.8 থেকে ভাষায় রয়েছে। Groovy Elvis অ্যাসাইনমেন্টও সমর্থন করে: x ?= value (শুধুমাত্র যদি x null হয় তবেই অ্যাসাইন করুন)।
def name = getUserName()
def display = name ?: "Guest"
def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)
// Groovy-তে Elvis অ্যাসাইনমেন্ট
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"
Swift-এ সমতুল্যকে nil-coalescing operator বলা হয় এবং এটি ?? হিসেবে লেখা হয়। Dart-এ একই ?? সিনট্যাক্স ব্যবহার করা হয়। পার্থক্য হল Swift এবং Dart-এ অপারেন্ড টাইপ মেলানোর প্রয়োজন, যেখানে Kotlin সাধারণ সুপারটাইপে স্বয়ংক্রিয় রূপান্তরের সাথে ভিন্ন টাইপ অনুমোদন করে। TypeScript-এ, ?? অপারেটর (nullish coalescing) সংস্করণ 3.7-এ আবির্ভূত হয়েছে এবং শুধুমাত্র null এবং undefined-এর সাথে কাজ করে, ||-এর বিপরীতে যা সমস্ত falsy মান ফিল্টার করে। PHP-তে, ?? অপারেটর সংস্করণ 7.0-এ আবির্ভূত হয়েছে, C#-এ — ?? সংস্করণ 6.0 থেকে।
সবচেয়ে সাধারণ ভুল হল Elvis Operator ?: কে নিরাপদ কল অপারেটর ?. এর সাথে গুলিয়ে ফেলা। Kotlin-এ, ?. শুধুমাত্র তখনই একটি মেথড বা প্রপার্টি কল করে যখন অবজেক্টটি null না হয়, যেখানে ?: null হলে একটি ডিফল্ট মান রিটার্ন করে। এগুলি ক্রমান্বয়ে একত্রিত করা হয়, কিন্তু প্রতিটি নিজস্ব কাজ সম্পাদন করে। বিভ্রান্তি নতুনদের মধ্যে দেখা দেয় যারা ?. ছাড়া ?: ব্যবহার করার চেষ্টা করে।
Elvis-এর ডান দিক অলসভাবে মূল্যায়ন করা হয়, কিন্তু যদি এতে পার্শ্ব প্রতিক্রিয়া সহ ফাংশন কল থাকে, তাহলে এটি অপ্রত্যাশিত আচরণের কারণ হতে পারে। ডেভেলপাররা কখনও কখনও ডান দিকে ব্যয়বহুল গণনা বা লগিং রাখেন, যা নন-null মান থাকলে সম্পাদিত হয় না। মনে রাখা গুরুত্বপূর্ণ যে ডান দিকটি একটি এক্সপ্রেশন যা শুধুমাত্র প্রয়োজন হলেই মূল্যায়ন করা হয়।
এক সারিতে একাধিক Elvis কোড পড়া কঠিন করতে পারে। উদাহরণস্বরূপ, a ?: b ?: c ?: d বাম থেকে ডানে মূল্যায়ন করা হয়, প্রথম নন-null রিটার্ন করে। গ্রুপিং বন্ধনীর মাধ্যমে বা লজিক আলাদা ফাংশনে নেওয়া পঠনযোগ্যতা বাড়ায় এবং ডিবাগিং সহজ করে। যদি চেইনটি ৩ এলিমেন্টের বেশি হয়, তাহলে when এক্সপ্রেশন বা সহায়ক ফাংশন ব্যবহার করা উচিত।
নতুন ডেভেলপাররা কখনও কখনও বুলিয়ান মান পরীক্ষার জন্য Elvis Operator ব্যবহার করার চেষ্টা করে: val x = flag ?: false। এটি কেবল তখনই কাজ করে যদি flag null হতে পারে। null ছাড়া বুলিয়ান অবস্থার জন্য, সাধারণ if-else বা টার্নারি অপারেটর প্রয়োজন — Kotlin-এ টার্নারি অপারেটর নেই, কিন্তু এটি if-else এক্সপ্রেশন দ্বারা প্রতিস্থাপিত হয়: val x = if (flag) a else b।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Elvis Operator শুধুমাত্র null পরীক্ষা করে, যেখানে টার্নারি অপারেটর যেকোনো বুলিয়ান শর্ত গ্রহণ করে। Kotlin-এ টার্নারি অপারেটর নেই — এটি if-else এক্সপ্রেশন দ্বারা প্রতিস্থাপিত হয়। Elvis একটি নির্দিষ্ট কাজ সমাধান করে: null হলে ডিফল্ট মান, যেখানে টার্নারি অপারেটর সব শর্তসাপেক্ষ এক্সপ্রেশন কভার করে।
হ্যাঁ, ডান দিক একটি ফাংশন কল হতে পারে: val x = a ?: calculateDefault()। অলস মূল্যায়নের কারণে ফাংশনটি শুধুমাত্র তখনই মূল্যায়ন করা হয় যখন a null হয়। এটি মান উপস্থিত থাকলে কর্মক্ষমতা ক্ষতি ছাড়াই ব্যয়বহুল গণনা, API কল বা ডাটাবেস কোয়েরি ব্যবহারের অনুমতি দেয়।
Java-তে সরাসরি Elvis Operator বিদ্যমান নেই। Java 8 থেকে শুরু করে, Optional.ofNullable(value).orElse(default) ব্যবহার করা যেতে পারে। Java 14+ switch এক্সপ্রেশন চালু করেছে, কিন্তু পূর্ণাঙ্গ ?: অনুপস্থিত। Kotlin এবং Groovy এটিকে ভাষার একটি অন্তর্নির্মিত সিনট্যাক্টিক কাঠামো হিসেবে প্রদান করে।
সাধারণ প্যাটার্ন হল একটি নিরাপদ কল ?. তারপর Elvis। উদাহরণ: user?.address?.city ?: “Unknown”। যদি চেইনের কোনো এলিমেন্ট null হয় — ডিফল্ট মান রিটার্ন করা হয়। এটি নেস্টেড if পরীক্ষার একটি সংক্ষিপ্ত প্রতিস্থাপন, যা প্রথাগত পদ্ধতির তুলনায় কোড 3–5 গুণ কমায়।
Elvis Operator ভাষা স্তরে একটি সিনট্যাক্টিক কাঠামো, যেখানে orElse Java-তে Optional-এর একটি মেথড। Elvis অলস (ডান দিক শুধুমাত্র null হলে মূল্যায়ন করা হয়), যেখানে orElse সবসময় তার আর্গুমেন্ট মূল্যায়ন করে। Java-তে অলস ভেরিয়েন্টের জন্য orElseGet আছে, যা Supplier গ্রহণ করে। Elvis ছোট এবং Optional তৈরি করার প্রয়োজন নেই।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন