প্রটোকল কী এবং এর ব্যবহার

প্রটোকল এবং ডেলিগেশন - সুইফট প্রোগ্রামিং (Swift Programming) - Computer Programming

1.6k

Swift-এ প্রটোকল হলো একটি ব্লুপ্রিন্ট বা টেমপ্লেট, যা একটি বা একাধিক প্রোপার্টি, মেথড, এবং অন্যান্য প্রয়োজনীয়তাগুলির ডিফিনিশন ধারণ করে। প্রটোকল আসলে কোনো নির্দিষ্ট বাস্তবায়ন (implementation) প্রদান করে না, বরং নির্দেশ করে কীভাবে একটি ক্লাস, স্ট্রাক্ট, বা এনামকে সেই প্রটোকল মেনে কাজ করতে হবে। প্রটোকল ব্যবহার করে আমরা কোডকে আরও মডুলার, পুনঃব্যবহারযোগ্য, এবং ফ্লেক্সিবল করতে পারি।

প্রটোকল কীভাবে কাজ করে?

প্রটোকল তৈরি করতে protocol কীওয়ার্ড ব্যবহার করা হয়। প্রটোকলের মধ্যে ডিফাইন করা মেথড বা প্রোপার্টির জন্য কোনো বডি (কোড) সরবরাহ করা হয় না; এটি শুধুমাত্র তাদের সিগনেচার নির্ধারণ করে।

প্রটোকলের গঠন

protocol ProtocolName {
    // প্রোপার্টি
    var someProperty: Type { get set }
    
    // মেথড
    func someMethod(param: Type) -> ReturnType
}
  • protocol: প্রটোকল ডিফাইন করার জন্য কীওয়ার্ড।
  • প্রোপার্টি: প্রোটোকলে ডিফাইন করা প্রোপার্টির গেটার এবং সেটার থাকতে পারে (বা শুধু গেটার থাকতে পারে)।
  • মেথড: প্রোটোকলে ডিফাইন করা মেথডের শুধু সিগনেচার থাকে, কোনো বাস্তবায়ন থাকে না।

প্রটোকল উদাহরণ

protocol Describable {
    var description: String { get }
    
    func describe() -> String
}
  • এখানে, Describable নামের একটি প্রটোকল ডিফাইন করা হয়েছে, যা একটি প্রোপার্টি (description) এবং একটি মেথড (describe()) ধারণ করে।
  • প্রোপার্টিটি শুধু গেটার রয়েছে, আর মেথডটি কোনো প্যারামিটার নেয় না এবং একটি String রিটার্ন করে।

প্রটোকল গ্রহণ করা (Conforming to Protocol)

কোনো ক্লাস, স্ট্রাক্ট, বা এনাম প্রটোকল গ্রহণ করতে চাইলে : ProtocolName ব্যবহার করতে হয়। প্রটোকল গ্রহণ করার পরে, সেই ক্লাস, স্ট্রাক্ট, বা এনামকে প্রটোকলে উল্লেখিত সব প্রোপার্টি ও মেথড বাস্তবায়ন করতে হয়।

struct Car: Describable {
    var brand: String
    var model: String
    
    var description: String {
        return "\(brand) \(model)"
    }
    
    func describe() -> String {
        return "This is a \(brand) model \(model)."
    }
}

let myCar = Car(brand: "Tesla", model: "Model S")
print(myCar.description)  // Output: "Tesla Model S"
print(myCar.describe())   // Output: "This is a Tesla model Model S."
  • এখানে, Car স্ট্রাক্ট Describable প্রটোকল গ্রহণ করেছে এবং প্রটোকলে উল্লেখিত প্রোপার্টি ও মেথড বাস্তবায়ন করেছে।

প্রটোকল ইনহেরিটেন্স

Swift-এ প্রটোকল ইনহেরিট করা যায়, যেমন ক্লাসের ক্ষেত্রে হয়। একটি প্রটোকল অন্য প্রটোকল ইনহেরিট করতে পারে এবং সেই প্রটোকলের প্রোপার্টি ও মেথডগুলিও অ্যাডাপ্ট করতে হবে।

protocol Vehicle {
    var speed: Int { get set }
    func start()
}

protocol ElectricVehicle: Vehicle {
    var batteryLevel: Int { get set }
    func charge()
}

struct ElectricCar: ElectricVehicle {
    var speed: Int
    var batteryLevel: Int
    
    func start() {
        print("Car started.")
    }
    
    func charge() {
        print("Car is charging.")
    }
}

let myElectricCar = ElectricCar(speed: 100, batteryLevel: 80)
myElectricCar.start()  // Output: "Car started."
myElectricCar.charge() // Output: "Car is charging."
  • এখানে, ElectricVehicle প্রটোকল Vehicle প্রটোকল ইনহেরিট করেছে। ElectricCar স্ট্রাক্টটি ElectricVehicle প্রটোকল গ্রহণ করেছে এবং সব প্রোপার্টি ও মেথড বাস্তবায়ন করেছে।

প্রটোকল কম্পোজিশন

Swift-এ আমরা একাধিক প্রটোকল একসাথে গ্রহণ করতে পারি। এটিকে প্রটোকল কম্পোজিশন বলা হয়।

protocol Drivable {
    func drive()
}

protocol Flyable {
    func fly()
}

struct FlyingCar: Drivable, Flyable {
    func drive() {
        print("Driving on the road.")
    }
    
    func fly() {
        print("Flying in the sky.")
    }
}

let myFlyingCar = FlyingCar()
myFlyingCar.drive() // Output: "Driving on the road."
myFlyingCar.fly()   // Output: "Flying in the sky."
  • এখানে, FlyingCar স্ট্রাক্ট দুটি প্রটোকল (Drivable এবং Flyable) গ্রহণ করেছে এবং তাদের মেথড বাস্তবায়ন করেছে।

প্রটোকল ব্যবহার: ডেলিগেট প্যাটার্ন

Swift-এ প্রটোকল প্রায়শই ডেলিগেট প্যাটার্ন হিসেবে ব্যবহৃত হয়, যেখানে একটি অবজেক্ট তার কার্যক্রম অন্য একটি অবজেক্টে ডেলিগেট করতে পারে। এটি কোডকে আরও মডুলার এবং ডিকাপল করা (কম পরস্পর নির্ভরশীল) করতে সাহায্য করে।

ডেলিগেট প্যাটার্নের উদাহরণ

protocol DownloadDelegate {
    func downloadDidStart()
    func downloadDidFinish()
}

class FileDownloader {
    var delegate: DownloadDelegate?
    
    func startDownload() {
        delegate?.downloadDidStart()
        print("Downloading...")
        delegate?.downloadDidFinish()
    }
}

class DownloadHandler: DownloadDelegate {
    func downloadDidStart() {
        print("Download started.")
    }
    
    func downloadDidFinish() {
        print("Download finished.")
    }
}

let downloader = FileDownloader()
let handler = DownloadHandler()

downloader.delegate = handler
downloader.startDownload()
// Output:
// "Download started."
// "Downloading..."
// "Download finished."
  • এখানে, DownloadDelegate একটি প্রটোকল, যা দুটি মেথড ডিফাইন করে।
  • FileDownloader ক্লাসে একটি ডেলিগেট প্রোপার্টি রয়েছে, যা DownloadDelegate প্রটোকল গ্রহণ করে।
  • DownloadHandler ক্লাসটি DownloadDelegate প্রটোকল গ্রহণ করে এবং মেথডগুলির বাস্তবায়ন করে।

প্রটোকল এক্সটেনশন

Swift-এ প্রটোকল এক্সটেনশনের মাধ্যমে আমরা প্রটোকলে ডিফল্ট বাস্তবায়ন প্রদান করতে পারি। এটি কোডকে আরও ফ্লেক্সিবল করে এবং প্রোটোকল গ্রহণকারী ক্লাস বা স্ট্রাক্টকে সব সময় মেথড বাস্তবায়ন করতে হয় না।

protocol Identifiable {
    var id: String { get }
    func identify()
}

extension Identifiable {
    func identify() {
        print("My ID is \(id).")
    }
}

struct User: Identifiable {
    var id: String
}

let user = User(id: "12345")
user.identify()  // Output: "My ID is 12345."
  • এখানে, Identifiable প্রটোকলে একটি ডিফল্ট বাস্তবায়ন প্রদান করা হয়েছে identify() মেথডের জন্য। তাই User স্ট্রাক্টে এই মেথড পুনরায় বাস্তবায়ন করতে হয়নি।

উপসংহার

Swift-এ প্রটোকল হলো একটি শক্তিশালী টুল, যা প্রোগ্রামিংয়ের ক্ষেত্রে ডেটা টাইপ এবং আচরণ নির্ধারণ করতে সাহায্য করে।

  • প্রটোকল ব্যবহার করে কোডকে আরও মডুলার এবং পুনঃব্যবহারযোগ্য করা যায়।
  • প্রটোকল কম্পোজিশন, ইনহেরিটেন্স, এবং এক্সটেনশন ব্যবহার করে প্রোগ্রামে ফ্লেক্সিবল এবং ডাইনামিক কাজ করা যায়।
  • ডেলিগেট প্যাটার্নের মাধ্যমে প্রটোকল ব্যবহার করে কোডকে ডিকাপল এবং মডুলার করা যায়।

Swift-এ প্রটোকলের ব্যবহার প্রোগ্রামের স্থায়িত্ব, পুনঃব্যবহারযোগ্যতা, এবং মডিউলারিটি বাড়িয়ে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...