অবজেক্টিভ-সি এবং সুইফট প্রোগ্রামিং ভাষায় প্রোটোকল (Protocol) একটি গুরুত্বপূর্ণ কনসেপ্ট, যা একটি চুক্তি বা কনট্রাক্ট হিসেবে কাজ করে। প্রোটোকল ব্যবহৃত হয় ক্লাস, স্ট্রাকচার বা এনাম (enum) এর মধ্যে কিছু নির্দিষ্ট মেথড বা ফাংশন ইমপ্লিমেন্ট করতে নির্দেশ দেওয়ার জন্য। এটি একটি গঠনতন্ত্র বা ইন্টারফেসের মতো কাজ করে, যা নির্দিষ্ট ফাংশনালিটি প্রয়োগের জন্য ক্লাস বা অবজেক্টকে বাধ্য করে।
প্রোটোকল ব্যবহার করে, আমরা একটি নির্দিষ্ট মেথড বা ফাংশনকে সংজ্ঞায়িত করতে পারি এবং পরে তা বিভিন্ন ক্লাসে বাস্তবায়ন করতে পারি।
১. প্রোটোকল (Protocol) এর ধারণা
প্রোটোকল একটি ধরনের চুক্তি, যা একটি ক্লাসকে বা অবজেক্টকে কিছু নির্দিষ্ট মেথড ইমপ্লিমেন্ট করতে বলে। এটি কেবল মেথডের সিগনেচার (signature) এবং বৈশিষ্ট্য সংজ্ঞায়িত করে, কিন্তু এর কার্যকরী অংশ (implementation) প্রদান করে না। যেই ক্লাস বা অবজেক্ট প্রোটোকলটি গ্রহণ করবে, সেটি সেই প্রোটোকল সংজ্ঞায়িত মেথড বা বৈশিষ্ট্যগুলি ইমপ্লিমেন্ট করবে।
প্রোটোকল ডিফিনেশন:
@protocol CarDelegate
- (void) carDidStart;
- (void) carDidStop;
@endএখানে CarDelegate একটি প্রোটোকল যা দুটি মেথড — carDidStart এবং carDidStop — ডিফাইন করেছে। এটি কোনো নির্দিষ্ট ক্লাস বা অবজেক্টকে নির্দেশ দেয় যে তাদের এই মেথডগুলো ইমপ্লিমেন্ট করতে হবে।
২. প্রোটোকল কিভাবে কাজ করে
প্রোটোকলটি তখন কার্যকরী হয় যখন একটি ক্লাস বা অবজেক্ট এটি গ্রহণ করে এবং প্রয়োজনীয় মেথডগুলো ইমপ্লিমেন্ট করে। প্রোটোকল ব্যবহার করে আপনি বিভিন্ন ক্লাস বা অবজেক্টের মধ্যে নির্দিষ্ট ফাংশনালিটি সাধারণ করতে পারেন।
উদাহরণ:
// CarDelegate প্রোটোকল ডিফিনেশন
@protocol CarDelegate
- (void) carDidStart;
- (void) carDidStop;
@end
// Car ক্লাস যা প্রোটোকল অনুসরণ করবে
@interface Car : NSObject <CarDelegate>
- (void) startCar;
- (void) stopCar;
@end
@implementation Car
- (void) startCar {
NSLog(@"Car started");
[self carDidStart]; // carDidStart প্রোটোকল মেথড কল
}
- (void) stopCar {
NSLog(@"Car stopped");
[self carDidStop]; // carDidStop প্রোটোকল মেথড কল
}
// প্রোটোকল মেথড ইমপ্লিমেন্টেশন
- (void) carDidStart {
NSLog(@"Car has started successfully!");
}
- (void) carDidStop {
NSLog(@"Car has stopped successfully!");
}
@endএখানে:
Carক্লাসটিCarDelegateপ্রোটোকলকে অনুসরণ করছে এবংcarDidStartওcarDidStopমেথডগুলো ইমপ্লিমেন্ট করছে।startCarএবংstopCarমেথডগুলোcarDidStartএবংcarDidStopমেথডগুলো কল করে।
৩. প্রোটোকলের প্রয়োজনীয়তা
প্রোটোকল ব্যবহারের অনেক সুবিধা এবং প্রয়োজনীয়তা রয়েছে, বিশেষ করে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর ক্ষেত্রে:
১. ইন্টারফেস ডিফিনিশন
প্রোটোকল একটি নির্দিষ্ট ইন্টারফেস সংজ্ঞায়িত করে যা বিভিন্ন ক্লাসে শেয়ার করা যেতে পারে। এটি একাধিক ক্লাসের মধ্যে সাধারণ আচরণ এবং মেথড ইমপ্লিমেন্টেশন নিশ্চিত করে।
২. ডিকাপলিং (Decoupling)
প্রোটোকল ব্যবহার করলে ক্লাসগুলো একে অপর থেকে স্বাধীন থাকে, অর্থাৎ, একটি ক্লাস অন্য ক্লাসের বাস্তবায়ন জানে না, শুধু প্রোটোকলের মেথডগুলো অনুসরণ করে। এটি কোডের নমনীয়তা এবং রক্ষণাবেক্ষণ সহজ করে।
৩. মাল্টিপল ইনহেরিট্যান্স
অবজেক্টিভ-সি তে ক্লাস একাধিক ক্লাস থেকে উত্তরাধিকারী হতে পারে না, তবে প্রোটোকল ব্যবহার করে একটি ক্লাস একাধিক প্রোটোকল গ্রহণ করতে পারে, যা মাল্টিপল ইনহেরিট্যান্স সমর্থন করে।
৪. মডুলার ডিজাইন
প্রোটোকল ব্যবহারের মাধ্যমে কোড মডুলার এবং পুনঃব্যবহারযোগ্য করা যায়। বিভিন্ন ক্লাস একই প্রোটোকল অনুসরণ করে একে অপরের সাথে সহজে ইন্টিগ্রেট হতে পারে।
৫. ডেলিগেট প্যাটার্ন (Delegate Pattern)
প্রোটোকল ব্যবহৃত হয় ডেলিগেট প্যাটার্নে, যেখানে একটি অবজেক্ট অন্য অবজেক্টকে কিছু কার্য পরিচালনার জন্য দায়িত্ব দেয়। এটি বেশিরভাগ iOS অ্যাপ্লিকেশনে ব্যবহৃত হয় যেমন ইউআই ইন্টারঅ্যাকশন, নেটওয়ার্কিং, ইত্যাদি।
উদাহরণ: ডেলিগেট প্যাটার্ন
@protocol CarDelegate
- (void) carDidStart;
@end
@interface Car : NSObject
@property (nonatomic, weak) id<CarDelegate> delegate;
- (void) startCar;
@end
@implementation Car
- (void) startCar {
NSLog(@"Car started");
[self.delegate carDidStart]; // ডেলিগেট মেথড কল
}
@end
@interface Driver : NSObject <CarDelegate>
@end
@implementation Driver
- (void) carDidStart {
NSLog(@"Driver: The car has started.");
}
@endএখানে:
Carক্লাসের একটিdelegateপ্রপার্টি রয়েছে যাCarDelegateপ্রোটোকল অনুসরণ করে।Driverক্লাসCarDelegateপ্রোটোকল গ্রহণ করে এবংcarDidStartমেথডটি ইমপ্লিমেন্ট করে।
সারাংশ
- প্রোটোকল হল একটি চুক্তি যা ক্লাস বা অবজেক্টকে কিছু নির্দিষ্ট মেথড ইমপ্লিমেন্ট করতে বলে। এটি একটি ইন্টারফেস বা কনট্রাক্ট হিসেবে কাজ করে।
- প্রোটোকল ব্যবহারের মাধ্যমে আমরা কোডের পুনঃব্যবহারযোগ্যতা, মডুলার ডিজাইন, এবং একাধিক ক্লাসের মধ্যে সাধারণ আচরণ নিশ্চিত করতে পারি।
- এটি ডেলিগেট প্যাটার্নের জন্য অত্যন্ত গুরুত্বপূর্ণ, যা একাধিক ক্লাসের মধ্যে কার্যক্রমের যোগাযোগ এবং সমন্বয় করতে সহায়তা করে।
প্রোটোকল ব্যবহারে কোড আরও পরিষ্কার, নির্ভরযোগ্য, এবং রক্ষণাবেক্ষণে সহজ হয়।
Read more