অবজেক্টিভ-সি (Objective-C) তে প্রপার্টি (Properties) এবং ইনস্ট্যান্স ভেরিয়েবলস (Instance Variables) দুটি গুরুত্বপূর্ণ কনসেপ্ট। যদিও এই দুটি একে অপরের সাথে সম্পর্কিত, তবুও তাদের ব্যবহারের মধ্যে কিছু পার্থক্য রয়েছে।
এখানে আমরা প্রপার্টি এবং ইনস্ট্যান্স ভেরিয়েবলস সম্পর্কে বিস্তারিত আলোচনা করব।
১. ইনস্ট্যান্স ভেরিয়েবলস (Instance Variables)
ইনস্ট্যান্স ভেরিয়েবল হল ক্লাসের একটি অবজেক্টের (ইন্সট্যান্স) ডেটা ধারণকারী সদস্য। এটি সাধারণত @interface এবং @implementation ব্লকের মধ্যে @private বা @protected দ্বারা চিহ্নিত করা হয় এবং এটি ক্লাসের মধ্যে স্থানীয়ভাবে ব্যবহৃত হয়।
ইনস্ট্যান্স ভেরিয়েবল সাধারণত এক্সটার্নাল অ্যাক্সেসের জন্য সরাসরি ব্যবহৃত হয় না, বরং মেথড বা প্রপার্টি ব্যবহার করে তাদের অ্যাক্সেস করা হয়।
উদাহরণ:
@interface Car : NSObject {
NSString *model; // ইনস্ট্যান্স ভেরিয়েবল
int year;
}
- (void) setModel:(NSString *)newModel;
- (NSString *) model;
- (void) setYear:(int)newYear;
- (int) year;
@end
@implementation Car
- (void) setModel:(NSString *)newModel {
model = newModel; // ইনস্ট্যান্স ভেরিয়েবলের মান সেট করা
}
- (NSString *) model {
return model; // ইনস্ট্যান্স ভেরিয়েবলটির মান রিটার্ন করা
}
- (void) setYear:(int)newYear {
year = newYear;
}
- (int) year {
return year;
}
@endব্যাখ্যা:
modelএবংyear: ইনস্ট্যান্স ভেরিয়েবলস যা ক্লাসের অবজেক্টের মধ্যে ডেটা রাখে।setModel:এবংmodel: ইনস্ট্যান্স ভেরিয়েবলটি অ্যাক্সেস করার জন্য গেটার এবং সেটার মেথড।- ইনস্ট্যান্স ভেরিয়েবল সাধারণত
@privateবা@protectedথাকে, এবং মেথডের মাধ্যমে অ্যাক্সেস করা হয়।
২. প্রপার্টি (Properties)
প্রপার্টি হল অবজেক্টের একটি পাবলিক ফেসড ডেটা সদস্য, যা ইনস্ট্যান্স ভেরিয়েবল এর উপর এক্সেস প্রোভাইড করে। প্রপার্টি এর মাধ্যমে ইনস্ট্যান্স ভেরিয়েবলগুলির অ্যাক্সেসের জন্য গেটার এবং সেটার মেথড অটোমেটিক্যালি তৈরি করা হয়।
অবজেক্টিভ-সি তে @property কিওয়ার্ড ব্যবহার করে ক্লাসের প্রপার্টি ডিফাইন করা হয় এবং এটি অটোমেটিকভাবে সেটার এবং গেটারের জন্য মেথড তৈরি করে। এতে কোড আরও ক্লিন এবং সহজ হয়, কারণ ডেভেলপারদের নিজে গেটার বা সেটার মেথড তৈরি করতে হয় না।
উদাহরণ:
@interface Car : NSObject
@property NSString *model; // প্রপার্টি ডিফাইন
@property int year;
@end
@implementation Car
// স্বয়ংক্রিয়ভাবে গেটার এবং সেটার তৈরি হয়
@endএখানে @property কিওয়ার্ডটি ইনস্ট্যান্স ভেরিয়েবল model এবং year এর জন্য গেটার এবং সেটারের মেথড তৈরি করবে। আপনি যদি model বা year এর মান সেট করতে বা রিটার্ন করতে চান, তবে আপনি সরাসরি প্রপার্টি ব্যবহার করতে পারবেন, যেমন:
Car *myCar = [[Car alloc] init];
myCar.model = @"Tesla Model 3"; // সেটিং প্রপার্টি
NSLog(@"Car model: %@", myCar.model); // গেটিং প্রপার্টিএখানে প্রপার্টি ব্যবহারের ফলে আমাদের ইনস্ট্যান্স ভেরিয়েবলটির জন্য গেটার এবং সেটারের মেথড লেখার প্রয়োজন হয়নি। অটোমেটিক গেটার এবং সেটার তৈরি হয়ে গেছে।
৩. প্রপার্টি এবং ইনস্ট্যান্স ভেরিয়েবলস এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | ইনস্ট্যান্স ভেরিয়েবল (Instance Variable) | প্রপার্টি (Property) |
|---|---|---|
| অ্যাক্সেস | সাধারণত ক্লাসের অভ্যন্তরীণ ব্যবহার (এটি সরাসরি অ্যাক্সেস করা হয়)। | পাবলিক অ্যাক্সেসের জন্য, গেটার এবং সেটারের মাধ্যমে। |
| কোড জেনারেশন | গেটার বা সেটারের জন্য নিজে ম্যানুয়ালি কোড লিখতে হয়। | স্বয়ংক্রিয়ভাবে গেটার এবং সেটার মেথড জেনারেট করা হয়। |
| উদ্দেশ্য | ক্লাসের অভ্যন্তরীণ ডেটা বা স্টেট ধারণ করতে ব্যবহৃত হয়। | ইনস্ট্যান্স ভেরিয়েবল্সের পাবলিক অ্যাক্সেস প্রদান করতে। |
| অ্যাক্সেস কন্ট্রোল | প্রাইভেট বা প্রটেক্টেড হতে পারে। | সাধারণত পাবলিক। |
| অটো সিঙ্ক্রোনাইজেশন | না, ডেভেলপারকে নিজে অ্যাক্সেস কন্ট্রোল ম্যানেজ করতে হয়। | হ্যাঁ, অ্যাক্সেসার বা মিউটেটার মেথডের মাধ্যমে অটোমেটিক অ্যাক্সেস। |
৪. প্রপার্টি এবং ইনস্ট্যান্স ভেরিয়েবলস ব্যবহার করতে উপকারিতা
প্রপার্টির সুবিধা:
- কোড ক্লিন এবং সহজ:
@propertyকিওয়ার্ড ব্যবহার করে ডেভেলপার গেটার এবং সেটার মেথড না লিখেও প্রপার্টি অ্যাক্সেস করতে পারেন। - অটোমেটিক মেমরি ম্যানেজমেন্ট: ARC (Automatic Reference Counting) দ্বারা প্রপার্টি ডিফাইন করা হলে মেমরি ম্যানেজমেন্ট স্বয়ংক্রিয়ভাবে চলে।
ইনস্ট্যান্স ভেরিয়েবলের সুবিধা:
- ক্লাসের অভ্যন্তরীণ কাজ: যখন আপনি কোনো প্রপার্টি বা ভেরিয়েবল ক্লাসের মধ্যে শুধু অভ্যন্তরীণ কাজের জন্য ব্যবহার করতে চান, তখন ইনস্ট্যান্স ভেরিয়েবল ব্যবহার করা হয়।
সারাংশ
- ইনস্ট্যান্স ভেরিয়েবলস সাধারণত একটি ক্লাসের মধ্যে ডেটা ধারণ করে এবং তা ক্লাসের মধ্যে ব্যবহার করা হয়।
- প্রপার্টি একটি পাবলিক ফেসড ডেটা সদস্য, যা গেটার এবং সেটার মেথডের মাধ্যমে অ্যাক্সেস করা হয় এবং এটি ইনস্ট্যান্স ভেরিয়েবলের জন্য সাধারণত অ্যাক্সেস প্রোভাইড করে।
প্রপার্টি ইনস্ট্যান্স ভেরিয়েবলসের চেয়ে আরও বেশি অ্যাবস্ট্রাক্ট এবং ফ্লেক্সিবল, কারণ এটি স্বয়ংক্রিয়ভাবে গেটার এবং সেটার তৈরি করে, যা কোডিং প্রক্রিয়াকে দ্রুত এবং সহজ করে তোলে।
@property এবং @synthesize হল Objective-C তে প্রপার্টি (Properties) সংজ্ঞায়িত এবং ব্যবহার করার জন্য গুরুত্বপূর্ণ কিওয়ার্ড। এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর একটি গুরুত্বপূর্ণ অংশ, যেখানে অ্যাপ্লিকেশন ডেভেলপমেন্টে ক্লাসের মধ্যে ডেটা সংরক্ষণের জন্য প্রপার্টি ব্যবহৃত হয়।
1. @property কিওয়ার্ড
@property কিওয়ার্ডটি একটি ক্লাসে প্রপার্টি ঘোষণা করতে ব্যবহৃত হয়। এটি এক ধরনের গেটার (getter) এবং সেটার (setter) মেথড তৈরি করে দেয়। এটি একটি বৈশিষ্ট্যকে প্রকাশ করে এবং সেই বৈশিষ্ট্যটির জন্য কিছু মৌলিক কাজ সম্পাদন করতে পারে যেমন: ডেটা সংরক্ষণ এবং এক্সেস করা।
@property এর বৈশিষ্ট্য:
- এটি ক্লাসের মধ্যে একটি নতুন বৈশিষ্ট্য সংজ্ঞায়িত করে।
- Getter এবং Setter মেথডগুলোর জন্য ডিফল্ট আচরণ প্রদান করে।
- আপনি এটি ব্যবহার করে দ্রুত অ্যাক্সেসর এবং মিউটেটর মেথড তৈরি করতে পারেন।
@property এর সিনট্যাক্স:
@property dataType variableName; // সাধারণভাবে প্রপার্টি ডিফাইন করা হয়dataType: প্রপার্টির ডেটা টাইপ, যেমনNSString,int,float, ইত্যাদি।variableName: প্রপার্টির নাম।
উদাহরণ:
@interface Person : NSObject
@property NSString *name; // প্রপার্টি ডিক্লেয়ারেশন
@property int age; // প্রপার্টি ডিক্লেয়ারেশন
@endএখানে name এবং age হল Person ক্লাসের প্রপার্টি, যা অবজেক্টে ডেটা সংরক্ষণ করতে ব্যবহৃত হবে।
2. @synthesize কিওয়ার্ড
@synthesize কিওয়ার্ডটি getter এবং setter মেথডগুলোকে বাস্তবায়ন (synthesize) করতে ব্যবহৃত হয়। এর মাধ্যমে আপনি প্রপার্টির জন্য ডিফল্ট মেথড তৈরি করতে পারেন, তবে @synthesize আধুনিক Objective-C কোডে আর দরকার হয় না কারণ Xcode স্বয়ংক্রিয়ভাবে getter এবং setter মেথড তৈরি করে।
যদি আপনি @synthesize ব্যবহার না করেন, তবে @property ব্যবহৃত প্রপার্টির জন্য স্বয়ংক্রিয়ভাবে getter এবং setter মেথড তৈরি করা হবে।
@synthesize এর সিনট্যাক্স:
@synthesize variableName = _variableName;variableName: প্রপার্টির নাম যা আপনি@propertyএ ডিক্লেয়ার করেছেন।_variableName: প্রপার্টি মেম্বার ভেরিয়েবল। এটি একটি অভ্যন্তরীণ ভেরিয়েবল যা getter এবং setter মেথডে ব্যবহৃত হয়।
উদাহরণ:
@implementation Person
@synthesize name = _name; // প্রপার্টি নামের জন্য getter এবং setter তৈরি করা হচ্ছে
@synthesize age = _age; // প্রপার্টি বয়সের জন্য getter এবং setter তৈরি করা হচ্ছে
@endএখানে name এবং age এর জন্য স্বয়ংক্রিয়ভাবে getter এবং setter মেথড তৈরি করা হচ্ছে, এবং অভ্যন্তরীণ ভেরিয়েবল হিসেবে _name এবং _age ব্যবহার করা হচ্ছে।
3. @property এবং @synthesize এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | @property | @synthesize |
|---|---|---|
| কার্য | ক্লাসে প্রপার্টি ডিক্লেয়ার করার জন্য ব্যবহৃত | প্রপার্টি ডিফাইন করে এবং গেটার ও সেটার মেথড তৈরি করে |
| মেথড তৈরি | স্বয়ংক্রিয়ভাবে গেটার এবং সেটার তৈরি করে | কাস্টম মেম্বার ভেরিয়েবল তৈরি এবং কাস্টম গেটার/সেটার অ্যাসাইন করতে পারে |
| ডিফল্ট ব্যবহার | Xcode স্বয়ংক্রিয়ভাবে গেটার ও সেটার তৈরি করে | এখন আর সাধারণত ব্যবহৃত হয় না (আধুনিক Xcode এ) |
| ব্যবহার | শুধুমাত্র প্রপার্টি ডিক্লেয়ার করতে ব্যবহৃত | প্রপার্টি ডিক্লেয়ারেশনের পরে প্রপার্টি বাস্তবায়নে ব্যবহৃত |
4. প্রপার্টি অ্যাট্রিবিউট (Property Attributes)
@property কিওয়ার্ডে কিছু অ্যাট্রিবিউট (attributes) ব্যবহার করা হয়, যা প্রপার্টির আচরণ নির্ধারণ করে। এগুলোর মধ্যে কিছু গুরুত্বপূর্ণ অ্যাট্রিবিউট হলো:
nonatomic: এটি বলে দেয় যে, প্রপার্টি অ্যাট্রিবিউটটি থ্রেড-সেফ নয়। এটি ডিফল্টভাবে ব্যবহার হয়।atomic: এটি বলে দেয় যে, প্রপার্টি অ্যাট্রিবিউটটি থ্রেড-সেফ এবং ডেটা অ্যাক্সেস নিশ্চিত করে।strong: এটি প্রপার্টি ভ্যালু ধরা রাখে এবং রেফারেন্স কাউন্ট বাড়ায়।weak: এটি রেফারেন্স কাউন্ট বাড়ায় না এবং শুধুমাত্র অবজেক্টের রেফারেন্স রাখে, যেটিnilহতে পারে।copy: এটি অবজেক্টকে কপি করে এবং মূল অবজেক্টে পরিবর্তন হলে কপি অবজেক্ট অপরিবর্তিত থাকে।
উদাহরণ:
@property (nonatomic, strong) NSString *name;
@property (nonatomic, copy) NSArray *friends;
@property (nonatomic, weak) id delegate;strong:nameপ্রপার্টি একটি শক্তিশালী রেফারেন্স হিসাবে থাকবে।copy:friendsপ্রপার্টি একটি কপি করা অ্যারের রেফারেন্স থাকবে।weak:delegateপ্রপার্টি একটি দুর্বল রেফারেন্স থাকবে, যাতে রেফারেন্স কাউন্ট না বাড়ে।
5. সারাংশ
@propertyকিওয়ার্ডটি একটি প্রপার্টি ডিক্লেয়ার করতে ব্যবহৃত হয় এবং এটি getter এবং setter মেথড তৈরি করে দেয়।@synthesizeকিওয়ার্ডটি ব্যবহৃত হয় প্রপার্টি মেম্বার ভেরিয়েবল এবং getter/setter মেথড তৈরি করতে। আধুনিক Objective-C তে এটি স্বয়ংক্রিয়ভাবে ব্যবহৃত হয় এবং সাধারণত ব্যবহৃত হয় না।- প্রপার্টি অ্যাট্রিবিউটের মাধ্যমে আমরা nonatomic, strong, weak, copy ইত্যাদি ব্যবহার করে প্রপার্টির আচরণ নিয়ন্ত্রণ করতে পারি।
এটি ছিল Objective-C তে @property এবং @synthesize এর ব্যবহারের মৌলিক ধারণা।
Instance Variables অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের (OOP) একটি গুরুত্বপূর্ণ ধারণা, যা ক্লাসের মধ্যে সংরক্ষিত তথ্য বা স্টেট রক্ষার জন্য ব্যবহৃত হয়। Objective-C তে Instance Variables একটি ক্লাসের অবজেক্টে থাকা ডেটার প্রতিনিধিত্ব করে, যা শুধুমাত্র ঐ ক্লাসের ইন্সট্যান্সের (অবজেক্ট) মাধ্যমে অ্যাক্সেস করা যায়। এই ভেরিয়েবলের মান প্রতিটি অবজেক্টের জন্য আলাদা থাকে।
১. Instance Variables (প্রাইভেট ভেরিয়েবল)
Instance Variables হল সেই ভেরিয়েবলগুলো যা ক্লাসের অবজেক্টে সংরক্ষিত থাকে। এগুলো সাধারণত @interface এবং @implementation এর মধ্যে সংজ্ঞায়িত করা হয়। ইনস্ট্যান্স ভেরিয়েবল সাধারণত প্রাইভেট হয়, অর্থাৎ, এগুলি ক্লাসের বাইরের কোড থেকে সরাসরি অ্যাক্সেস করা যায় না। তবে, getter এবং setter মেথড ব্যবহার করে এগুলোর মান সেট এবং রিট্রিভ করা সম্ভব।
উদাহরণ:
// @interface - ক্লাসের প্রাইভেট ভেরিয়েবল
@interface Car : NSObject {
NSString *model; // instance variable
NSInteger year; // instance variable
}
- (void) setModel: (NSString *)newModel;
- (NSString *) getModel;
- (void) setYear: (NSInteger)newYear;
- (NSInteger) getYear;
@end
// @implementation - মেথড ডিফিনেশন
@implementation Car
- (void) setModel: (NSString *)newModel {
model = newModel; // মডেল পরিবর্তন
}
- (NSString *) getModel {
return model; // মডেল রিটার্ন
}
- (void) setYear: (NSInteger)newYear {
year = newYear; // বছর পরিবর্তন
}
- (NSInteger) getYear {
return year; // বছর রিটার্ন
}
@endএখানে model এবং year হলো instance variables যা Car ক্লাসের অবজেক্টে সংরক্ষিত থাকে। এগুলোর মান setModel: এবং setYear: মেথডের মাধ্যমে সেট করা হয়, এবং getModel এবং getYear মেথডের মাধ্যমে রিট্রিভ করা হয়।
২. Instance Variables এর ম্যানিপুলেশন
Instance Variables এর মান ম্যানিপুলেট করার জন্য সাধারণত getter এবং setter মেথড ব্যবহার করা হয়, যা ভেরিয়েবলগুলির অ্যাক্সেস কন্ট্রোল করতে সাহায্য করে। Objective-C তে ইনস্ট্যান্স ভেরিয়েবলগুলোর অ্যাক্সেস সঠিকভাবে পরিচালনার জন্য properties ব্যবহৃত হয়, যা getter এবং setter মেথডের কাজ সহজ করে দেয়।
Properties ব্যবহারের মাধ্যমে instance variables এর ম্যানিপুলেশন:
Objective-C তে properties ব্যবহারের মাধ্যমে মেমরি ম্যানেজমেন্ট এবং getter/setter মেথডের কাজ সহজ হয়। এটি @property এবং @synthesize নির্দেশক দিয়ে করা হয়।
উদাহরণ:
@interface Car : NSObject
@property NSString *model; // property, instance variable হবে
@property NSInteger year; // property, instance variable হবে
@end
@implementation Car
// @synthesize দ্বারা getter এবং setter মেথড তৈরি হবে
@endএখানে, model এবং year হলো প্রপার্টি যা স্বয়ংক্রিয়ভাবে getter এবং setter মেথড তৈরি করে। এখন, আপনি সরাসরি প্যারেন্ট ক্লাসের মেথড ব্যবহার করে এই ভেরিয়েবলের মান অ্যাক্সেস বা পরিবর্তন করতে পারবেন।
Car *myCar = [[Car alloc] init];
myCar.model = @"Tesla"; // setter মেথড কল হবে
myCar.year = 2022; // setter মেথড কল হবে
NSLog(@"Car Model: %@", myCar.model); // getter মেথড কল হবে
NSLog(@"Car Year: %ld", (long)myCar.year); // getter মেথড কল হবেএখানে model এবং year প্যারেন্ট ক্লাসের ভেরিয়েবলগুলোর মান getter এবং setter মেথডের মাধ্যমে পরিবর্তিত হচ্ছে।
৩. Instance Variables এর Access Control
Objective-C তে, আপনি ক্লাসের ইনস্ট্যান্স ভেরিয়েবলগুলোর অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। প্রাইভেট ভেরিয়েবলগুলি সাধারণত @interface এবং @implementation এর মধ্যে সংজ্ঞায়িত হয়, এবং পাবলিক ভেরিয়েবলগুলোর জন্য @public, @private, বা @protected অ্যাক্সেস কন্ট্রোল করা যায়।
উদাহরণ:
@interface Car : NSObject {
@private
NSString *model; // শুধুমাত্র ক্লাসের অভ্যন্তরে অ্যাক্সেসযোগ্য
@public
NSInteger year; // বাইরে থেকেও অ্যাক্সেসযোগ্য
}
@endএখানে, model একটি প্রাইভেট ভেরিয়েবল যা ক্লাসের বাইরের কোড থেকে অ্যাক্সেস করা যাবে না, কিন্তু year একটি পাবলিক ভেরিয়েবল যা বাইরের কোড থেকেও অ্যাক্সেস করা সম্ভব।
৪. Encapsulation (এনক্যাপসুলেশন)
এনক্যাপসুলেশন একটি OOP কনসেপ্ট যা instance variables এর মাধ্যমে বাস্তবায়িত হয়। এই কনসেপ্টের মাধ্যমে, একটি ক্লাসের ভেরিয়েবল এবং মেথডগুলিকে একত্রিত করে একটি সুরক্ষিত ইউনিট তৈরি করা হয়, যাতে বাইরের কোড ওই ভেরিয়েবলগুলির সরাসরি অ্যাক্সেস না পায়। শুধুমাত্র getter এবং setter মেথড ব্যবহার করে বাইরের কোড ভেরিয়েবলগুলির মান রিট্রিভ বা সেট করতে পারে।
উদাহরণ:
@interface Car : NSObject
{
NSString *model; // private instance variable
}
- (void) setModel: (NSString *)newModel; // setter method
- (NSString *) getModel; // getter method
@end
@implementation Car
- (void) setModel: (NSString *)newModel {
model = newModel;
}
- (NSString *) getModel {
return model;
}
@endএখানে, model ভেরিয়েবলটি প্রাইভেট, এবং বাইরের কোড শুধুমাত্র getter এবং setter মেথড ব্যবহার করে এর মান অ্যাক্সেস করতে পারে। এতে কোডের নিরাপত্তা বৃদ্ধি পায় এবং ভেরিয়েবলগুলোর ম্যানিপুলেশন সুনির্দিষ্টভাবে করা যায়।
সারাংশ
- Instance Variables হলো ক্লাসের অবজেক্টে সংরক্ষিত ভেরিয়েবল, যা প্রতিটি অবজেক্টের জন্য আলাদা থাকে।
- এগুলোর মান পরিবর্তন বা অ্যাক্সেস করার জন্য সাধারণত getter এবং setter মেথড ব্যবহার করা হয়।
- Encapsulation এবং Access Control এর মাধ্যমে ইনস্ট্যান্স ভেরিয়েবলগুলির নিরাপত্তা নিশ্চিত করা যায়, এবং কোডের গঠন আরও সুনির্দিষ্ট এবং সুরক্ষিত থাকে।
Properties অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের (OOP) একটি গুরুত্বপূর্ণ অংশ, যা ক্লাসের মধ্যে ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়। Objective-C তে accessor এবং mutator মেথড ব্যবহার করে প্রপার্টি মান অ্যাক্সেস এবং পরিবর্তন করা হয়। এখানে আমরা accessor এবং mutator মেথড তৈরি করার প্রক্রিয়া এবং তার ব্যবহার নিয়ে আলোচনা করব।
1. Properties এবং Accessors (Getter)
Accessor মেথডগুলি এমন মেথড যা প্রপার্টির মান রিটার্ন করে (অথবা অ্যাক্সেস করে)। সাধারণত এই মেথডগুলিকে getter বলা হয়।
Accessor (Getter) মেথডের গঠন:
- (dataType) propertyName; // Getter মেথডএখানে dataType হলো প্রপার্টির ডেটা টাইপ এবং propertyName হলো প্রপার্টির নাম।
Example:
@interface Car : NSObject
@property NSString *model; // Property Declaration
@end
@implementation Car
- (NSString *) model { // Getter Method (Accessor)
return _model;
}
@endএখানে model একটি property এবং model এর জন্য একটি getter method তৈরি করা হয়েছে, যা _model (instance variable) রিটার্ন করবে।
2. Mutators (Setter)
Mutator মেথডগুলি এমন মেথড যা প্রপার্টির মান পরিবর্তন করে। এই মেথডগুলিকে setter বলা হয়।
Mutator (Setter) মেথডের গঠন:
- (void) setPropertyName:(dataType)value; // Setter Methodএখানে value হলো নতুন মান যা প্রপার্টিতে অ্যাসাইন করা হবে।
Example:
@interface Car : NSObject
@property NSString *model; // Property Declaration
@end
@implementation Car
- (void) setModel:(NSString *)newModel { // Setter Method (Mutator)
_model = newModel;
}
@endএখানে model এর জন্য একটি setter method তৈরি করা হয়েছে, যা _model (instance variable) এ newModel এর মান অ্যাসাইন করবে।
3. @property এবং @synthesize
Objective-C তে, @property এবং @synthesize কিওয়ার্ডগুলি ব্যবহার করে প্রপার্টির জন্য getter এবং setter মেথড তৈরি করা হয়।
@property: এটি একটি প্রপার্টি ঘোষণা করে এবং সেই প্রপার্টির জন্য getter এবং setter মেথড তৈরি করতে সহায়তা করে।@synthesize: এটি প্রপার্টি জন্য getter এবং setter মেথড তৈরি করে এবং অভ্যন্তরীণ ভেরিয়েবল (instance variable) ম্যানেজ করতে সহায়তা করে। আধুনিক Objective-C তে@synthesizeকিওয়ার্ডটি সাধারণত স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়, তবে এটি কাস্টমাইজ করা সম্ভব।
Example with @property and @synthesize:
@interface Car : NSObject
@property NSString *model; // Property Declaration
@property int year; // Property Declaration
@end
@implementation Car
// @synthesize automatically creates getter and setter methods
@synthesize model = _model; // Custom instance variable
@synthesize year = _year;
@endএখানে @property কিওয়ার্ড ব্যবহার করা হয়েছে model এবং year প্রপার্টির জন্য এবং @synthesize কিওয়ার্ড ব্যবহার করে getter এবং setter মেথডগুলি স্বয়ংক্রিয়ভাবে তৈরি করা হয়েছে। _model এবং _year হল অভ্যন্তরীণ ভেরিয়েবল (instance variables), যা প্রপার্টির জন্য ব্যবহৃত হবে।
4. Custom Accessor এবং Mutator
কখনও কখনও প্রপার্টি ম্যানিপুলেশনের জন্য কাস্টম getter এবং setter মেথড তৈরি করতে হয়। আপনি যদি চান যে প্রপার্টির মান সেট করার সময় কিছু অতিরিক্ত লজিক প্রয়োগ হোক, তাহলে আপনি কাস্টম getter এবং setter ব্যবহার করতে পারেন।
Custom Accessor (Getter) Example:
- (NSString *) model {
if (_model == nil) {
_model = @"Unknown"; // Default value
}
return _model;
}এখানে getter মেথডটি চেক করবে যে _model যদি nil হয়, তবে একটি ডিফল্ট মান "Unknown" প্রদান করবে।
Custom Mutator (Setter) Example:
- (void) setModel:(NSString *)newModel {
if (![newModel isEqualToString:@""]) { // Check if the value is not an empty string
_model = newModel;
} else {
NSLog(@"Invalid model value");
}
}এখানে setter মেথডটি চেক করবে যে newModel এর মান যদি খালি (empty string) না হয়, তবে সেটি _model এ অ্যাসাইন করবে, অন্যথায় একটি ত্রুটি বার্তা দেখাবে।
5. @dynamic
@dynamic কিওয়ার্ডটি তখন ব্যবহৃত হয় যখন আপনি getter এবং setter মেথডগুলি কাস্টমভাবে সরবরাহ করতে চান এবং Core Data বা অন্যান্য লাইব্রেরি স্বয়ংক্রিয়ভাবে তাদের তৈরি করবে না। এটি নির্দেশ করে যে, মেথডগুলো রানটাইম এ প্রাপ্ত হবে, কম্পাইলার এটি স্বয়ংক্রিয়ভাবে তৈরি করবে না।
উদাহরণ:
@interface Car : NSObject
@property NSString *model;
@end
@implementation Car
@dynamic model; // Custom getter and setter provided at runtime
@endএখানে, @dynamic ব্যবহার করা হয়েছে, যা নির্দেশ করে যে model প্রপার্টির জন্য কাস্টম getter এবং setter মেথড প্রস্তুত করা হবে।
সারাংশ
- Accessors (Getter): প্রপার্টির মান রিট্রিভ (retrieve) করার জন্য ব্যবহৃত মেথড।
- Mutators (Setter): প্রপার্টির মান সেট (set) করার জন্য ব্যবহৃত মেথড।
@property: প্রপার্টি ডিক্লেয়ার করার জন্য ব্যবহৃত হয় এবং স্বয়ংক্রিয়ভাবে getter ও setter তৈরি করে।@synthesize: getter এবং setter তৈরি করতে ব্যবহৃত হয়, তবে আধুনিক Objective-C এ এটি স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়।- Custom Accessor & Mutator: প্রপার্টির মানে কাস্টম লজিক প্রয়োগ করতে কাস্টম getter এবং setter তৈরি করা হয়।
এই প্রক্রিয়াটি কোডকে আরও পরিষ্কার এবং সুরক্ষিত করে, কারণ ডেটা ম্যানিপুলেশন শুধুমাত্র নির্দিষ্ট মেথডের মাধ্যমে করা হয়।
Atomic এবং Non-atomic প্রপার্টি অ্যাট্রিবিউটগুলি Objective-C তে ব্যবহৃত হয়, যা একটি প্রপার্টির এ্যাক্সেস এবং ম্যানিপুলেশন নিয়ন্ত্রণ করে। এগুলি সাধারণত থ্রেড সেফটি (Thread Safety) এবং পারফরম্যান্সের মধ্যে একটি ভারসাম্য তৈরি করতে ব্যবহৃত হয়।
1. Atomic Properties
Atomic প্রপার্টি হল এমন একটি প্রপার্টি, যার getter এবং setter মেথড সঠিকভাবে থ্রেড সেফ (Thread-safe) হয়। এর মানে হল যে, যখন একাধিক থ্রেড একই প্রপার্টির মান পরিবর্তন করার চেষ্টা করে, তখন atomic property এটি নিশ্চিত করে যে এক থ্রেড সম্পূর্ণভাবে প্রপার্টির মান পরিবর্তন করার পর অন্য থ্রেড সেটি অ্যাক্সেস করতে পারবে।
Atomic প্রপার্টির প্রধান বৈশিষ্ট্য:
- Thread-Safety: এটি নিশ্চিত করে যে, একাধিক থ্রেড যখন একই প্রপার্টি অ্যাক্সেস বা পরিবর্তন করার চেষ্টা করবে তখন কোনো সমস্যা হবে না।
- Locking:
atomicপ্রপার্টি ডিফল্টভাবে একটি লক ব্যবহার করে, যাতে একথ্রেড সম্পূর্ণভাবে প্রপার্টির কাজ শেষ করার পর অন্যথ্রেড সেই প্রপার্টি অ্যাক্সেস করতে পারে। - Performance:
atomicপ্রপার্টি কিছুটা ধীর হতে পারে, কারণ এটি প্রতিটি অ্যাক্সেসের জন্য লক মেকানিজম ব্যবহার করে।
Atomic প্রপার্টি উদাহরণ:
@interface Car : NSObject
@property (atomic) NSString *model; // Atomic property
@endএখানে, model প্রপার্টি atomic অ্যাট্রিবিউট দ্বারা ডিফাইন করা হয়েছে, যা থ্রেড সেফ করার জন্য getter এবং setter মেথডের মধ্যে লক প্রক্রিয়া ব্যবহার করবে।
Atomic এবং Thread Safety:
যখন একাধিক থ্রেড একই সময় model প্রপার্টির মান পরিবর্তন বা রিট্রিভ করার চেষ্টা করবে, তখন atomic প্রপার্টি নিশ্চিত করবে যে এক থ্রেডের পরিবর্তন সম্পূর্ণ হলে অন্য থ্রেড তার পরিবর্তন করতে পারবে।
2. Non-atomic Properties
Non-atomic প্রপার্টি হলো একটি প্রপার্টি যা thread-safety নিশ্চিত করে না। এটি atomic প্রপার্টির তুলনায় অনেক দ্রুত কাজ করে, কারণ এটি কোনও লকিং প্রক্রিয়া ব্যবহার করে না। তবে, একাধিক থ্রেড যখন এক প্রপার্টি অ্যাক্সেস বা পরিবর্তন করতে চেষ্টা করবে তখন এটি থ্রেড-সেফ নয় এবং তাতে সমস্যা সৃষ্টি হতে পারে।
Non-atomic প্রপার্টির প্রধান বৈশিষ্ট্য:
- Performance:
non-atomicপ্রপার্টি দ্রুত কাজ করে কারণ এতে কোনো লক ব্যবহৃত হয় না। এটি সাধারণত পারফরম্যান্সের জন্য ব্যবহার করা হয়। - No Thread-Safety: একাধিক থ্রেড যখন একই প্রপার্টি পরিবর্তন করতে চেষ্টা করবে, তখন একথ্রেড অন্যথ্রেডের পরিবর্তন উপেক্ষা করতে পারে এবং এতে data corruption হতে পারে।
Non-atomic প্রপার্টি উদাহরণ:
@interface Car : NSObject
@property (nonatomic) NSString *model; // Non-atomic property
@endএখানে, model প্রপার্টি nonatomic অ্যাট্রিবিউট দ্বারা ডিফাইন করা হয়েছে, যার মানে হলো এটি thread-safe নয় এবং লকিং প্রক্রিয়া ব্যবহার করে না, ফলে এটি দ্রুত কাজ করবে কিন্তু একাধিক থ্রেডে একসাথে প্রপার্টি অ্যাক্সেস করা হলে সমস্যা হতে পারে।
3. Atomic vs Non-atomic: পার্থক্য
| বৈশিষ্ট্য | Atomic | Non-atomic |
|---|---|---|
| Thread Safety | হ্যাঁ, এটি থ্রেড সেফ | না, এটি থ্রেড সেফ নয় |
| Performance | কিছুটা ধীর, কারণ লকিং ব্যবহৃত হয় | দ্রুত, লকিং ব্যবহৃত হয় না |
| Use case | থ্রেড সেফটি গুরুত্বপূর্ণ ক্ষেত্রে ব্যবহার করা হয় | একক থ্রেডে ব্যবহৃত বা পারফরম্যান্স গুরুত্বপূর্ণ ক্ষেত্রে |
| Synchronization | atomic গেটার এবং সেটার মেথডে লক ব্যবহার করে | non-atomic গেটার এবং সেটার মেথডে লক ব্যবহৃত হয় না |
4. কখন Atomic এবং Non-atomic ব্যবহার করবেন?
- Atomic প্রপার্টি ব্যবহার করুন যখন আপনার অ্যাপ্লিকেশন থ্রেড-সেফটি এবং ডেটার সঠিকতা নিশ্চিত করতে হবে। উদাহরণস্বরূপ, যখন আপনার অ্যাপ্লিকেশন একাধিক থ্রেডের মাধ্যমে একটি প্রপার্টি রিড এবং রাইট করবে, তখন
atomicপ্রপার্টি ব্যবহার করা উত্তম। - Non-atomic প্রপার্টি ব্যবহার করুন যখন আপনি পারফরম্যান্সের জন্য সর্বোচ্চ গুরুত্ব দেন এবং থ্রেড-সেফটি প্রয়োজনীয় নয়। সাধারণত একক থ্রেডে কাজ করা অ্যাপ্লিকেশন এবং ইউআই সম্পর্কিত প্রপার্টি গুলোর জন্য
non-atomicব্যবহৃত হয়।
5. সারাংশ
- Atomic Properties: থ্রেড সেফ, অর্থাৎ একাধিক থ্রেড যখন একই প্রপার্টি অ্যাক্সেস করতে চেষ্টা করবে, তখন atomic প্রপার্টি ডেটার নিরাপত্তা নিশ্চিত করে। তবে এটি কিছুটা ধীর কাজ করে।
- Non-atomic Properties: পারফরম্যান্সের জন্য দ্রুত, তবে এতে থ্রেড সেফটি নেই এবং একাধিক থ্রেডের অ্যাক্সেসের ক্ষেত্রে ডেটা করাপশন হতে পারে।
আপনার প্রোগ্রামে কখন atomic এবং কখন non-atomic ব্যবহার করবেন তা নির্ভর করবে আপনার অ্যাপ্লিকেশনের প্রয়োজন এবং থ্রেড-সেফটি বা পারফরম্যান্সের গুরুত্বের ওপর।
Read more