Categories হল Objective-C তে একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একটি ক্লাসে নতুন মেথড যোগ করার সুযোগ দেয়, এমনকি যদি আপনি সেই ক্লাসের সোর্স কোড না দেখেন বা সেই ক্লাসটি আপনার নিজস্ব না হয়। Categories আপনাকে একটি ক্লাসের জন্য অতিরিক্ত কার্যক্ষমতা (functionality) যুক্ত করার সুবিধা প্রদান করে, যা সাধারণত ক্লাসের ইন্টারফেস বা ইমপ্লিমেন্টেশন পরিবর্তন না করেই করা যায়।
Categories সাধারণত তিনটি মূল ক্ষেত্রের মধ্যে ব্যবহৃত হয়:
- নতুন মেথড যোগ করা (Adding New Methods)
- মেথড ইমপ্লিমেন্টেশন পরিবর্তন করা (Modifying Existing Methods) – এই ক্ষেত্রে Method Swizzling ব্যবহৃত হয়।
- ক্লাসের নতুন বৈশিষ্ট্য যুক্ত করা (Adding New Properties) – কিন্তু Properties সরাসরি Categories-এ যোগ করা যায় না। আপনাকে Associated Objects ব্যবহার করতে হয়।
Categories এর মৌলিক গঠন
Category সাধারণত একটি নতুন .h (header) এবং .m (implementation) ফাইলে ডিফাইন করা হয়। এখানে আমরা শুধুমাত্র নতুন মেথড ডিক্লেয়ার করতে পারি, কিন্তু নতুন প্রপার্টি বা ভেরিয়েবল অ্যাড করতে পারি না।
Categories এর সিনট্যাক্স:
// Category Definition (.h file)
@interface ClassName (CategoryName)
- (void) newMethod; // New method declaration
@end
// Category Implementation (.m file)
@implementation ClassName (CategoryName)
- (void) newMethod {
// New method implementation
NSLog(@"New Method Called");
}
@end- ClassName: যে ক্লাসে নতুন মেথড যোগ করতে চান।
- CategoryName: ক্যাটাগরির নাম, এটি ঐ ক্লাসের একটি বৈশিষ্ট্য।
- newMethod: নতুন মেথড যা ক্যাটাগরি দ্বারা ক্লাসে যোগ করা হচ্ছে।
Categories এর মাধ্যমে নতুন মেথড যোগ করার উদাহরণ
ধরা যাক, আমাদের একটি ক্লাস Person আছে এবং আমরা এটিতে একটি নতুন মেথড greet যোগ করতে চাই।
Step 1: Person ক্লাস তৈরি করা
// Person.h
@interface Person : NSObject
@property NSString *name;
- (void) sayHello;
@end
// Person.m
@implementation Person
- (void) sayHello {
NSLog(@"Hello, %@", self.name);
}
@endএখন আমাদের একটি ক্লাস Person রয়েছে, যেটিতে একটি মেথড sayHello রয়েছে।
Step 2: Person ক্লাসে নতুন মেথড যোগ করা একটি Category এর মাধ্যমে
// Person+Greeting.h
@interface Person (Greeting)
- (void) greet; // New method declaration
@end
// Person+Greeting.m
#import "Person+Greeting.h"
@implementation Person (Greeting)
- (void) greet {
NSLog(@"Greetings, %@!", self.name); // New method implementation
}
@endএখানে, আমরা Person ক্লাসে একটি নতুন মেথড greet যোগ করেছি Greeting ক্যাটাগরি ব্যবহার করে। ক্যাটাগরি Greeting দ্বারা Person ক্লাসে একটি নতুন বৈশিষ্ট্য যোগ করা হয়েছে।
Step 3: Category ব্যবহার করা
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
person.name = @"John";
[person sayHello]; // Existing method
[person greet]; // New method from Category
}
return 0;
}এখানে, আমরা Person ক্লাসের অবজেক্ট person তৈরি করেছি এবং greet মেথড কল করেছি, যা Person+Greeting ক্যাটাগরি থেকে এসেছে।
আউটপুট:
Hello, John
Greetings, John!এখানে, sayHello মেথডটি মূল Person ক্লাসের মেথড, এবং greet মেথডটি Person+Greeting ক্যাটাগরি থেকে এসেছে।
Categories এর সুবিধা
- কোড পুনঃব্যবহার: আপনি যেকোনো ক্লাসের সাথে সম্পর্কিত নতুন মেথড যোগ করতে পারেন, যাতে কোড পুনঃব্যবহারযোগ্য এবং সংগঠিত থাকে।
- থার্ড-পার্টি লাইব্রেরির সাথে ইন্টিগ্রেশন: আপনি থার্ড-পার্টি লাইব্রেরির ক্লাসের সাথে নতুন ফিচার যোগ করতে পারেন, যা তার সোর্স কোড না বদলিয়ে কাজ করবে।
- ক্লাসের ক্ষমতা সম্প্রসারণ: আপনার ক্লাসে নতুন মেথড যুক্ত করতে পারলে, সেটি আপনার কোডের কার্যকারিতা বৃদ্ধি করতে সাহায্য করে।
Categories এর সীমাবদ্ধতা
- প্রপার্টি যোগ করা সম্ভব নয়: আপনি সরাসরি ক্যাটাগরিতে প্রপার্টি বা ভেরিয়েবল অ্যাড করতে পারবেন না। তবে আপনি Associated Objects ব্যবহার করে একটি প্রপার্টি কার্যকরী করতে পারেন।
- Method Overriding সীমাবদ্ধ: আপনি ক্যাটাগরি দিয়ে মেথড ওভাররাইড করতে পারেন, তবে আপনি যেই ক্লাসে ক্যাটাগরি তৈরি করছেন, তার ঐ মেথডের আচরণ পুরোপুরি পরিবর্তন করতে পারবেন না (এটা Method Swizzling ছাড়া সম্ভব নয়)।
Method Swizzling এবং Categories
Method Swizzling একটি টেকনিক, যা Objective-C তে ক্যাটাগরির মাধ্যমে মেথডের আচরণ পরিবর্তন করতে ব্যবহৃত হয়। এটি মূলত আপনার ক্লাসের কোনো একটি মেথডের আচরণ পরিবর্তন করার জন্য ব্যবহার হয়।
#import <objc/runtime.h>
- (void) swizzledMethod {
NSLog(@"This method was swizzled!");
}
+ (void) load {
Method originalMethod = class_getInstanceMethod(self, @selector(sayHello));
Method swizzledMethod = class_getInstanceMethod(self, @selector(swizzledMethod));
method_exchangeImplementations(originalMethod, swizzledMethod);
}এখানে, আমরা sayHello মেথডের আচরণ পরিবর্তন করেছি এবং তার স্থলে swizzledMethod ব্যবহার করেছি।
সারাংশ
- Categories ব্যবহারের মাধ্যমে আপনি একাধিক মেথড একটি ক্লাসে যুক্ত করতে পারেন, যা কোডের রক্ষণাবেক্ষণ সহজ করে এবং কোড পুনঃব্যবহারযোগ্য করে।
- আপনি একটি ক্লাসের সোর্স কোড পরিবর্তন না করেই নতুন মেথড যোগ করতে পারেন, যা code organization এবং modularity বাড়াতে সাহায্য করে।
- Categories ও Method Swizzling এর মাধ্যমে ক্লাসের কার্যকারিতা সহজে সম্প্রসারিত করা সম্ভব, তবে কিছু সীমাবদ্ধতাও রয়েছে, যেমন properties সরাসরি যোগ করা সম্ভব নয়।
Read more