Destructuring declaration — এটি কী, সিনট্যাক্স এবং Kotlin-এ ব্যবহার

লেখক: IT Sectr প্রকাশিত: 2026-06-23 পড়ার সময়: 7 মিনিট

Destructuring declaration হল Kotlin-এর একটি বৈশিষ্ট্য যা আপনাকে একটি অবজেক্টকে একটি একক এক্সপ্রেশনে একাধিক ভেরিয়েবলে বিভক্ত করতে দেয়। val (name, age) = user কন্সট্রাক্ট একসাথে দুটি ভেরিয়েবল ঘোষণা করে, তাদের অবজেক্টের কম্পোনেন্ট থেকে মান প্রদান করে। Kotlin ডকুমেন্টেশন (2026) অনুসারে, data class-এর সাথে কাজ করার সময় ডিস্ট্রাকচারিং কোডের পরিমাণ 30–50% কমিয়ে দেয়। Destructuring declaration কোডকে আরও সংক্ষিপ্ত এবং পঠনযোগ্য করে তোলে।

মূল পয়েন্ট

  • Destructuring declaration — একটি অবজেক্টকে ভেরিয়েবলে বিভক্ত করার জন্য সিনট্যাক্স val (a, b) = obj
  • ComponentN() — ফাংশন component1(), component2(), component3() ইত্যাদি, স্বয়ংক্রিয়ভাবে কল করা হয়
  • Data class প্রাথমিক কনস্ট্রাক্টরে ঘোষিত সমস্ত প্রপার্টির জন্য স্বয়ংক্রিয়ভাবে componentN() জেনারেট করে
  • Pair এবং Triple — দুই এবং তিনটি মানের জন্য বিল্ট-ইন ডিস্ট্রাকচারিং সহ স্ট্যান্ডার্ড ক্লাস
  • Map.Entry — সুবিধাজনক ইটারেশনের জন্য key এবং value-তে ডিস্ট্রাকচারিং সমর্থন করে

ডিস্ট্রাকচারিং ডিক্লারেশন কী?

Destructuring declaration (বিভাজন ঘোষণা) হল Kotlin-এর একটি সিনট্যাকটিক কন্সট্রাকশন যা আপনাকে একটি ক্লাস ইনস্ট্যান্সকে একটি একক এক্সপ্রেশনে একাধিক ভেরিয়েবলে বিভক্ত করতে দেয়। বাম পাশে ব্র্যাকেটের মধ্যে ভেরিয়েবলের একটি তালিকা থাকে, ডান পাশে বিভক্ত করা অবজেক্ট থাকে। Kotlin স্বয়ংক্রিয়ভাবে প্রতিটি ভেরিয়েবলের জন্য সংশ্লিষ্ট componentN() ফাংশন কল করে, যেখানে N হল ব্র্যাকেটের মধ্যে ভেরিয়েবলের ক্রমিক সংখ্যা।

ডিস্ট্রাকচারিং ডিক্লারেশন সবচেয়ে বেশি ব্যবহৃত হয় data classes-এর সাথে। Kotlin কম্পাইলার প্রতিটি data class-এর জন্য প্রাথমিক কনস্ট্রাক্টরে প্রপার্টির সংখ্যার ভিত্তিতে স্বয়ংক্রিয়ভাবে component1(), component2() ইত্যাদি জেনারেট করে। data মডিফায়ার ছাড়া সাধারণ ক্লাসের জন্য, componentN() জেনারেট হয় না, কিন্তু সেগুলি operator কীওয়ার্ডের সাথে ম্যানুয়ালি সংজ্ঞায়িত করা যেতে পারে।

ডিস্ট্রাকচারিং ডিক্লারেশন জোড়ার সংগ্রহ, ফাংশন ফলাফল এবং Map ইটারেশনের সাথে কাজ করার সময় কোড সহজ করার ক্ষমতার কারণে একটি জনপ্রিয় প্যাটার্ন হয়ে উঠেছে। person.firstName, person.lastName লেখার পরিবর্তে, ডেভেলপার val (firstName, lastName) = person লেখেন। এটি লাইনের সংখ্যা হ্রাস করে এবং পঠনযোগ্যতা উন্নত করে, বিশেষ করে লুপ এবং ল্যাম্বডায়।

Kotlin-এ ডিস্ট্রাকচারিং কীভাবে কাজ করে?

val (a, b) = obj কন্সট্রাক্টের সম্মুখীন হলে, Kotlin কম্পাইলার নিম্নলিখিত কোড জেনারেট করে: val a = obj.component1(); val b = obj.component2()। যদি ভেরিয়েবলগুলি var দিয়ে ঘোষণা করা হয়, তাহলে var অ্যাসাইনমেন্ট জেনারেট হয়। প্রতিটি ভেরিয়েবলের টাইপ সংশ্লিষ্ট componentN() ফাংশনের রিটার্ন টাইপ থেকে অনুমান করা হয়। এর মানে হল যে ডিস্ট্রাকচারিং ডিক্লারেশন সম্পূর্ণ টাইপ-নিরাপদ এবং কম্পাইল টাইমে পরীক্ষা করা হয়।

kotlin
data class Person(val firstName: String, val lastName: String, val age: Int)

fun main() {
    val person = Person("Alice", "Smith", 30)

    // ডিস্ট্রাকচারিং: component1(), component2(), component3()
    val (firstName, lastName, age) = person
    println("$firstName $lastName, $age বছর")
}

লিস্টিং-এ, Person তিনটি প্রপার্টি সহ একটি data class। Kotlin component1() → firstName, component2() → lastName, component3() → age জেনারেট করে। এক্সপ্রেশন val (firstName, lastName, age) = person এই ফাংশনগুলিকে কল করে এবং ফলাফল প্রদান করে। গুরুত্বপূর্ণ: ভেরিয়েবলের নামের সাথে প্রপার্টির নাম মেলানো প্রয়োজন নেই — কম্পাইলার শুধু componentN()-এর ক্রম এবং তাদের টাইপ দেখে। আপনি শুধুমাত্র প্রথম N প্রপার্টি বিভক্ত করতে পারেন, বাকিগুলি উপেক্ষা করে।

data classes এবং স্ট্যান্ডার্ড টাইপের ডিস্ট্রাকচারিং

Data classes ডিস্ট্রাকচারিং ডিক্লারেশনের জন্য প্রাথমিক প্রার্থী। প্রতিটি data class স্বয়ংক্রিয়ভাবে প্রাথমিক কনস্ট্রাক্টরের সমস্ত প্রপার্টির জন্য componentN() পায়। componentN()-এর ক্রম প্রপার্টি ঘোষণার ক্রমের সাথে মিলে যায়। এর মানে হল যে আপনি যখন data class-এ ফিল্ডের ক্রম পরিবর্তন করেন, তখন ডিস্ট্রাকচারিং-এ ভেরিয়েবলের ক্রমও পরিবর্তিত হয় — যা সূক্ষ্ম বাগের কারণ হতে পারে।

kotlin
// Pair ডিস্ট্রাকচারিং
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")

// Triple ডিস্ট্রাকচারিং
val triple = Triple("A", "B", "C")
val (first, second, third) = triple

// Map.Entry লূপে
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
    println("$k = $v")
}

Pair এবং Triple হল দুই এবং তিনটি কম্পোনেন্টের জন্য বিল্ট-ইন ডিস্ট্রাকচারিং সহ স্ট্যান্ডার্ড ক্লাস। Pair প্রায়শই ফাংশনের রিটার্ন টাইপ হিসাবে ব্যবহৃত হয় যেগুলিকে একটি আলাদা data class তৈরি না করে দুটি সম্পর্কিত মান ফেরত দিতে হয়। Map.Entry-এর উপর for লুপে, (k, v) = entry কন্সট্রাক্ট component1() এবং component2()-এর মাধ্যমে কী এবং মান বিভক্ত করে। Kotlin-এ Map-এর উপর ইটারেশন করার এটি স্ট্যান্ডার্ড প্যাটার্ন, যা সম্পূর্ণরূপে key এবং value-এর স্পষ্ট কল প্রতিস্থাপন করে।

অব্যবহৃত ভেরিয়েবলের জন্য আন্ডারস্কোর

যদি ডিস্ট্রাকচারিং-এর সময় কিছু কম্পোনেন্টের প্রয়োজন না হয়, তাহলে Kotlin আপনাকে সেগুলিকে আন্ডারস্কোর _ দিয়ে প্রতিস্থাপন করতে দেয়। এটি পঠনযোগ্যতা উন্নত করে — পাঠক অবিলম্বে দেখতে পান যে কম্পোনেন্টটি উপেক্ষা করা হচ্ছে। উপরন্তু, _ ব্যবহার একটি অপ্রারম্ভিত ভেরিয়েবলে আকস্মিক অ্যাক্সেস প্রতিরোধ করে: কম্পাইলার _-এর জন্য কোনো ভেরিয়েবল তৈরি করে না, যা অব্যবহৃত ভেরিয়েবল সম্পর্কে সতর্কতা দূর করে।

kotlin
data class Order(
    val id: Long,
    val customerName: String,
    val amount: Double,
    val status: String
)

fun process(orders: List<Order>) {
    for ((id, _, amount) in orders) {
        println("অর্ডার $id: $amount")
    }
}

লিস্টিং-এ, Order-এর চারটি প্রপার্টি আছে, কিন্তু লুপের শুধু id এবং amount প্রয়োজন। customerName-এর জায়গায় আন্ডারস্কোর কম্পাইলারকে বলে “component2() স্কিপ কর”। Kotlin component2() কল করে না এবং এই কম্পোনেন্টের জন্য কোনো ভেরিয়েবল তৈরি করে না। গুরুত্বপূর্ণ: আন্ডারস্কোর শুধুমাত্র ডিস্ট্রাকচারিং ডিক্লারেশনে ব্যবহার করা যেতে পারে, data class কনস্ট্রাক্টরে নয়। যদি একাধিক ধারাবাহিক কম্পোনেন্ট স্কিপ করা হয়, প্রতিটি তার নিজস্ব আন্ডারস্কোর পায়।

কাস্টম ক্লাসের জন্য componentN() তৈরি করা

data মডিফায়ার ছাড়া ক্লাসের জন্য, আপনি operator কীওয়ার্ড যোগ করে ম্যানুয়ালি componentN() সংজ্ঞায়িত করতে পারেন। এটি আপনাকে যেকোনো ক্লাসের সাথে ডিস্ট্রাকচারিং ডিক্লারেশন ব্যবহার করার অনুমতি দেয়, যার মধ্যে থার্ড-পার্টি ক্লাস রয়েছে যার সোর্স কোড পরিবর্তন করা যাবে না — শুধু operator সহ একটি এক্সটেনশন ফাংশন লিখুন। এই পদ্ধতিটি বিশেষ করে লাইব্রেরি ক্লাস এবং Java ক্লাসের জন্য উপযোগী যাতে স্বয়ংক্রিয় componentN() নেই।

kotlin
class Rect(val width: Int, val height: Int)

operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height

// getters সহ Java ক্লাসের জন্য
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height

fun main() {
    val rect = Rect(1920, 1080)
    val (w, h) = rect
    println("রিজোলিউশন: ${w}x${h}")
}

উদাহরণে, Rect data ছাড়া একটি সাধারণ ক্লাস। operator fun component1() = width এবং component2() = height সহ এক্সটেনশন ফাংশন ডিস্ট্রাকচারিং সমর্থন যোগ করে। একইভাবে java.awt.Dimension-এর জন্য: Dimension-এ একটি operator এক্সটেনশন এটিকে width এবং height-এ বিভক্ত করার অনুমতি দেয়। সীমাবদ্ধতা: ডিস্ট্রাকচারিং ডিক্লারেশনের জন্য কম্পোনেন্টের সর্বোচ্চ সংখ্যা 5। তাত্ত্বিকভাবে আপনি component6() এবং তার উপরে সংজ্ঞায়িত করতে পারেন, কিন্তু Kotlin ব্র্যাকেটে 6+ ভেরিয়েবলের জন্য সংশ্লিষ্ট সিনট্যাক্স জেনারেট করবে না।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

প্রতিটি data class কি ডিস্ট্রাকচারিং সমর্থন করে?

হ্যাঁ, প্রতিটি data class স্বয়ংক্রিয়ভাবে প্রাথমিক কনস্ট্রাক্টরের সমস্ত প্রপার্টির জন্য componentN() পায়। ক্লাস বডিতে ঘোষিত প্রপার্টি (val/var ছাড়া কনস্ট্রাক্টর প্যারামিটার ব্যবহার করে) componentN() জেনারেট করে না।

ভেরিয়েবলের সংখ্যা মেল না খেলে কী হয়?

যদি val (a, b, c) = obj-এ শুধুমাত্র দুটি component ফাংশন সহ একটি অবজেক্ট থাকে, তাহলে কম্পাইলার একটি ত্রুটি দেবে। যদি কম ভেরিয়েবল থাকে (val (a) = pair), তাহলে Kotlin শুধুমাত্র component1() কল করবে এবং component2() উপেক্ষা করবে — কোনো ত্রুটি হবে না।

লুপ ছাড়া কি Map ডিস্ট্রাকচার করা যায়?

হ্যাঁ, Map.Entry ডিস্ট্রাকচারিং সমর্থন করে: val (key, value) = map.entries.first()। ডিস্ট্রাকচারিং সম্পূর্ণ Map-এ একসাথে কাজ করে না — শুধু উপাদান অনুযায়ী, for লুপে বা ইটারেটরের মাধ্যমে।

ল্যাম্বডায় কি ডিস্ট্রাকচারিং কাজ করে?

হ্যাঁ, Kotlin ল্যাম্বডা প্যারামিটারে ডিস্ট্রাকচারিং সমর্থন করে: map.forEach { (k, v) -> ... }। ল্যাম্বডা প্যারামিটারে data classes-এর জন্য, আপনাকে প্যারামিটারের চারপাশে নেস্টেড ব্র্যাকেট যোগ করতে হবে।

ডিস্ট্রাকচারিং-এর সর্বোচ্চ আকার কত?

Kotlin একটি ডিস্ট্রাকচারিং ডিক্লারেশনে 5টি ভেরিয়েবল পর্যন্ত সমর্থন করে। যদি আপনার পাঁচটির বেশি প্রপার্টি বিভক্ত করার প্রয়োজন হয়, সেগুলিকে নেস্টেড data classes-এ একত্রিত করুন বা একটি ভেরিয়েবলের ভিতরে Pair/Triple ব্যবহার করুন।

সারসংক্ষেপ

  • Destructuring declaration — সিনট্যাক্স val (a, b) = obj, একটি অবজেক্টকে একটি একক এক্সপ্রেশনে একাধিক ভেরিয়েবলে বিভক্ত করে
  • ComponentN() — ফাংশন component1(), component2(), ... ডিস্ট্রাকচারিংয়ের সময় কম্পাইলার দ্বারা স্বয়ংক্রিয়ভাবে কল করা হয়
  • Data class প্রাথমিক কনস্ট্রাক্টরের সমস্ত প্রপার্টির জন্য স্বয়ংক্রিয়ভাবে componentN() জেনারেট করে
  • Pair এবং Triple — 2 এবং 3 কম্পোনেন্টের জন্য বিল্ট-ইন ডিস্ট্রাকচারিং সহ স্ট্যান্ডার্ড ক্লাস
  • আন্ডারস্কোর _ ভেরিয়েবল তৈরি না করে অব্যবহৃত কম্পোনেন্ট প্রতিস্থাপন করে
  • Operator componentN() এক্সটেনশন ফাংশনে Java সহ যেকোনো ক্লাসে ডিস্ট্রাকচারিং যোগ করে
  • Map.Entry for লুপে ((k, v) in map) — একটি অভিধানে ইটারেশনের জন্য স্ট্যান্ডার্ড ইডিওম্যাটিক Kotlin প্যাটার্ন

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

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

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

আরও পড়ুন