বাউন্ডেড টাইপ এবং ডিপেন্ডেন্ট টাইপ হল স্কালার উন্নত টাইপ সিস্টেমের দুটি শক্তিশালী কনসেপ্ট। এই দুটি টাইপ সিস্টেমের মাধ্যমে আপনি কোডের নিরাপত্তা এবং কার্যকারিতা বাড়াতে পারেন, বিশেষ করে জেনেরিক টাইপস এবং টেমপ্লেটের ক্ষেত্রে।
১. বাউন্ডেড টাইপ (Bounded Types)
বাউন্ডেড টাইপ এর মাধ্যমে আপনি টাইপ প্যারামিটারগুলির জন্য একটি সীমা নির্ধারণ করতে পারেন। স্কালায় এটি সাধারণত উদ্ধৃত টাইপ (upper bound) এবং নিম্ন সীমা (lower bound) দ্বারা করা হয়। বাউন্ডেড টাইপের সাহায্যে আপনি নিশ্চিত করতে পারেন যে একটি নির্দিষ্ট টাইপের ইনস্ট্যান্স শুধুমাত্র নির্দিষ্ট সীমার মধ্যে থাকবে।
১.১ উদ্ধৃত টাইপ (Upper Bound)
উদ্ধৃত টাইপ দ্বারা একটি টাইপ প্যারামিটারকে অন্য টাইপের একটি সাবক্লাস বা সুপারক্লাস হিসেবে সীমাবদ্ধ করা হয়।
উদ্ধৃত টাইপ উদাহরণ:
class Box[T <: Animal](val value: T) { // T must be a subtype of Animal
def getValue: T = value
}
class Animal {
def sound(): Unit = {
println("Animal sound")
}
}
class Dog extends Animal {
def sound(): Unit = {
println("Bark")
}
}
object UpperBoundExample {
def main(args: Array[String]): Unit = {
val dogBox = new Box(new Dog()) // Dog is a subtype of Animal
dogBox.getValue.sound() // Output: Bark
}
}এখানে:
T <: Animalবাউন্ডেড টাইপ যাTকেAnimalটাইপের সাবক্লাস হিসেবে সীমাবদ্ধ করে।Boxক্লাস শুধুমাত্রAnimalবা তার সাবক্লাসের অবজেক্ট গ্রহণ করতে পারে।
১.২ নিম্ন সীমা (Lower Bound)
নিম্ন সীমার মাধ্যমে আপনি টাইপ প্যারামিটারকে একটি নির্দিষ্ট সুপারক্লাসের টাইপ হিসেবে সীমাবদ্ধ করতে পারেন। এটি সাধারণত >: কিওয়ার্ড ব্যবহার করে প্রকাশ করা হয়।
নিম্ন সীমা উদাহরণ:
class Box[T >: Animal](val value: T) { // T must be a supertype of Animal
def getValue: T = value
}
class Animal
class Dog extends Animal
object LowerBoundExample {
def main(args: Array[String]): Unit = {
val animalBox = new Box(new Animal()) // Animal is a supertype
val dogBox = new Box(new Dog()) // Dog is a subtype of Animal
println(animalBox.getValue)
println(dogBox.getValue)
}
}এখানে:
T >: Animalবাউন্ডেড টাইপ যাTকেAnimalটাইপের সুপারক্লাস হিসেবে সীমাবদ্ধ করে।Boxক্লাসAnimalবা তার সুপারক্লাসের টাইপ গ্রহণ করতে পারে।
২. ডিপেন্ডেন্ট টাইপ (Dependent Types)
ডিপেন্ডেন্ট টাইপ এমন টাইপ যা একটি মানের উপর নির্ভরশীল। এর মানে হল যে, টাইপটি নির্ভর করে কোন নির্দিষ্ট ইনস্ট্যান্স বা মানের উপর। ডিপেন্ডেন্ট টাইপের মাধ্যমে আপনি টাইপ এবং মানের মধ্যে সম্পর্ক নির্ধারণ করতে পারেন, যার ফলে টাইপ সিস্টেম আরও শক্তিশালী এবং নির্ভরযোগ্য হয়ে ওঠে।
২.১ ডিপেন্ডেন্ট টাইপ উদাহরণ
object DependentTypeExample {
def pair[T](first: T, second: T): (T, T) = {
(first, second)
}
def main(args: Array[String]): Unit = {
val pairOfIntegers = pair(5, 10)
println(pairOfIntegers) // Output: (5, 10)
// A more advanced dependent type example could involve arrays with size
// Here, we're simply showing how types depend on values.
}
}এখানে:
pairফাংশনে টাইপTএকাধিক মানের সাথে যুক্ত থাকে, কিন্তু ডিপেন্ডেন্ট টাইপ আরও জটিল এবং শক্তিশালী টেমপ্লেট টাইপ ধারণা ব্যবহার করতে পারে, যেখানে টাইপ প্যারামিটার নির্ভর করে ইনপুটের মানের উপর।
২.২ ডিপেন্ডেন্ট টাইপের আরো উদাহরণ (নির্দিষ্ট সাইজের অ্যারে)
এখানে একটি ডিপেন্ডেন্ট টাইপের উদাহরণ যেখানে একটি অ্যারের সাইজ টাইপ হিসেবে ব্যবহৃত হয়:
object DependentTypesWithSize {
class SizedArray[T](val arr: Array[T], val size: Int) {
def get(index: Int): T = {
if (index >= 0 && index < size) arr(index)
else throw new IndexOutOfBoundsException
}
}
def main(args: Array[String]): Unit = {
val arr = new SizedArray(Array(1, 2, 3, 4), 4)
println(arr.get(2)) // Output: 3
// arr.get(5) would throw an exception
}
}এখানে:
SizedArrayক্লাসে টাইপTএবং সাইজIntসম্পর্কিত। সাইজের উপর নির্ভরশীল যে কোন অ্যারে ব্যবহার করা হচ্ছে।sizeটাইপটি মানের উপর নির্ভরশীল, এবং এটি অ্যারের সীমারেখা নির্ধারণে ব্যবহৃত হয়।
সারাংশ
- বাউন্ডেড টাইপ স্কালায় টাইপ প্যারামিটারগুলিকে সীমাবদ্ধ করে দেয়, যার মাধ্যমে আপনি টাইপের উপর সুনির্দিষ্ট কন্ডিশন আরোপ করতে পারেন (উদ্ধৃত বা নিম্ন সীমা)।
- ডিপেন্ডেন্ট টাইপ একটি শক্তিশালী টাইপ সিস্টেমের অংশ, যেখানে টাইপটি একটি মানের উপর নির্ভরশীল। এটি আপনাকে টাইপ এবং মানের মধ্যে সম্পর্ক নির্ধারণ করতে সাহায্য করে, এবং এটি জেনেরিক টাইপ সিস্টেমে আরও শক্তিশালী ফিচার সরবরাহ করে।
এই দুটি কনসেপ্ট স্কালার টাইপ সিস্টেমকে আরও শক্তিশালী এবং নমনীয় করে তোলে, এবং এটি ফাংশনাল প্রোগ্রামিং এবং জেনেরিক টাইপ সিস্টেমে ব্যবহৃত হয়।
Read more