স্কালায় প্যাটার্ন ম্যাচিং একটি শক্তিশালী ফিচার, যা কোডকে আরও পরিষ্কার এবং কার্যকরী করে তোলে। এটি স্কালার ফাংশনাল প্রোগ্রামিং প্যারাডাইমের একটি প্রধান অংশ, যা ডাটা স্ট্রাকচার বা ভ্যালুগুলির উপর ভিত্তি করে বিভিন্ন কন্ডিশন অনুসারে কার্য সম্পাদন করতে সাহায্য করে। স্কালায় সাধারণ প্যাটার্ন ম্যাচিং এর পাশাপাশি অ্যাডভান্সড প্যাটার্ন ম্যাচিং কৌশলগুলো কোড লেখাকে আরও শক্তিশালী এবং নমনীয় করে তোলে।
এই লেখায় আমরা স্কালার অ্যাডভান্সড প্যাটার্ন ম্যাচিং কৌশলগুলো সম্পর্কে বিস্তারিত জানবো।
১. কেস ক্লাউজ (Case Class) এবং প্যাটার্ন ম্যাচিং
স্কালায় case class এর সাথে প্যাটার্ন ম্যাচিং ব্যবহার করা হয় খুবই শক্তিশালীভাবে, কারণ case class-এ ডিফাইন করা ডাটা সহজেই প্যাটার্ন ম্যাচিংয়ের জন্য প্রোসেস করা যায়।
উদাহরণ:
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(length: Double, width: Double) extends Shape
def area(shape: Shape): Double = shape match {
case Circle(r) => Math.PI * r * r
case Rectangle(l, w) => l * w
}
val circle = Circle(5)
val rectangle = Rectangle(4, 6)
println(area(circle)) // Output: 78.53981633974483
println(area(rectangle)) // Output: 24.0এখানে:
Shapeএকটি sealed trait এবং এর দুটি case class (CircleএবংRectangle) তৈরি করা হয়েছে।- প্যাটার্ন ম্যাচিংয়ে
CircleএবংRectangleএর ভ্যালুগুলোকে ভিন্নভাবে প্রক্রিয়া করা হচ্ছে।
sealed trait ব্যবহার করার সুবিধা:
- এটি নিশ্চিত করে যে,
Shapeএর সব সাবক্লাসগুলোই কোডে ডিফাইন করা থাকবে। এর ফলে কম্পাইলার আপনাকেmatchব্লক লেখার সময় সব কেস চেক করতে সাহায্য করবে।
২. উপাদানসমূহের উপর প্যাটার্ন ম্যাচিং (Matching on Elements)
স্কালায় প্যাটার্ন ম্যাচিং বিভিন্ন ডাটা স্ট্রাকচার যেমন লিস্ট, টিউপল, অ্যারে ইত্যাদির উপাদানগুলির উপর কাজ করতে পারে। এখানে একাধিক উপাদানের সাথে match ব্যবহার করা হয়।
উদাহরণ:
val numbers = List(1, 2, 3)
val result = numbers match {
case List(1, 2, 3) => "Matched the pattern 1, 2, 3"
case List(1, _*) => "Starts with 1"
case _ => "No match"
}
println(result) // Output: Matched the pattern 1, 2, 3এখানে:
List(1, 2, 3): এটি সম্পূর্ণভাবে মেলানো হচ্ছে এবং "Matched the pattern 1, 2, 3" আউটপুট হচ্ছে।List(1, _*): এটি একটি আংশিক মেলানো প্যাটার্ন যেখানে লিস্টের প্রথম উপাদানটি1হতে হবে এবং বাকি উপাদানগুলো যে কোনো কিছু হতে পারে।
৩. গার্ড কন্ডিশন (Guard Condition)
গার্ড কন্ডিশন প্যাটার্ন ম্যাচিংয়ের একটি গুরুত্বপূর্ণ অংশ, যা আপনাকে প্যাটার্ন ম্যাচিংয়ের সাথে অতিরিক্ত শর্ত বা কন্ডিশন চেক করতে দেয়। গার্ড কন্ডিশন সাধারণত if বা require বা guard ব্যবহার করে যোগ করা হয়।
উদাহরণ:
val x = 15
val result = x match {
case x if x % 2 == 0 => "Even"
case x if x % 2 != 0 => "Odd"
case _ => "Unknown"
}
println(result) // Output: Oddএখানে:
case x if x % 2 == 0: এখানে গার্ড কন্ডিশন ব্যবহার করা হয়েছে, যাতেxযদি সঠিকভাবে ইভেন হয়, তবে প্যাটার্ন ম্যাচ হবে।case x if x % 2 != 0: এখানে গার্ড কন্ডিশন দিয়ে আন্ডারলাইন করা হয়েছে যে,xযদি ইমপেয়ার হয় তবে "Odd" হবে।
৪. টিউপল এবং লিস্ট প্যাটার্ন ম্যাচিং
স্কালায় টিউপল বা লিস্ট এর উপাদানগুলোর উপরও প্যাটার্ন ম্যাচিং করা যেতে পারে।
উদাহরণ:
val point = (3, 4)
val result = point match {
case (0, 0) => "Origin"
case (x, y) if x == y => "On the line x = y"
case (x, y) => s"Point is at ($x, $y)"
}
println(result) // Output: Point is at (3, 4)এখানে:
case (0, 0): প্রথম উপাদান (x) এবং দ্বিতীয় উপাদান (y) যদি ০ হয়, তবে এটি "Origin" চিহ্নিত করবে।case (x, y) if x == y: এই কেসটি তখনই ম্যাচ হবে যখন x এবং y সমান হবে।case (x, y): সবগুলো কেসে ডিফল্ট হিসেবে(x, y)থাকবে এবং এটি সঠিকভাবে মূল্যায়ন করবে।
৫. কোলেকশন প্যাটার্ন ম্যাচিং (Matching Collections)
স্কালায় প্যাটার্ন ম্যাচিং কোলেকশনগুলোর উপরও কাজ করতে পারে, এবং এতে আপনি :: (প্রথম এলিমেন্ট এবং বাকি এলিমেন্ট) বা Nil (খালি লিস্ট) ব্যবহার করতে পারেন।
উদাহরণ:
val numbers = List(1, 2, 3, 4)
val result = numbers match {
case Nil => "Empty list"
case x :: xs => s"First element is $x, rest are $xs"
}
println(result) // Output: First element is 1, rest are List(2, 3, 4)এখানে:
case Nil: এটি একটি খালি লিস্টের জন্য।case x :: xs: এটি একটি লিস্টের প্রথম উপাদান এবং বাকি উপাদানগুলিকে আলাদা করতে ব্যবহৃত হয়।xহল প্রথম এলিমেন্ট এবংxsহল বাকি এলিমেন্টের লিস্ট।
৬. অ্যাডভান্সড প্যাটার্ন ম্যাচিং কৌশল
- কেস ক্লাসের সাথে প্যাটার্ন ম্যাচিং: আপনি কেস ক্লাসের জন্য স্বয়ংক্রিয়ভাবে প্যাটার্ন ম্যাচিং করতে পারেন এবং ক্লাসের ভ্যালু সহজেই এক্সট্র্যাক্ট করতে পারেন।
- প্যাটার্ন গার্ডস: প্যাটার্ন ম্যাচিংয়ের শর্তযুক্ত সিদ্ধান্ত গ্রহণের জন্য গার্ড কন্ডিশন ব্যবহার করা হয়।
- স্ট্রাকচারাল প্যাটার্ন ম্যাচিং: নতুন স্কালা 3 এ স্ট্রাকচারাল প্যাটার্ন ম্যাচিং ফিচার এসেছে, যেখানে আপনি ক্লাসের ভ্যালু ডিরেক্টলি এক্সট্র্যাক্ট করতে পারবেন।
সারাংশ
- স্কালা প্যাটার্ন ম্যাচিং হলো একটি শক্তিশালী এবং নমনীয় কৌশল, যা ডাটা স্ট্রাকচার বা ভ্যালু অনুযায়ী সহজে কোডের কার্যকারিতা নির্ধারণ করতে সাহায্য করে।
- অ্যাডভান্সড প্যাটার্ন ম্যাচিং-এর মাধ্যমে আপনি কেস ক্লাস, গার্ড কন্ডিশন, কোলেকশন প্যাটার্ন, টিউপল ইত্যাদি ব্যবহার করে আরও জটিল এবং শক্তিশালী ম্যাচিং করতে পারেন।