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-এ প্রটোকলের ব্যবহার প্রোগ্রামের স্থায়িত্ব, পুনঃব্যবহারযোগ্যতা, এবং মডিউলারিটি বাড়িয়ে তোলে।
Read more