Dynamic Typing এবং Message Sending (ডাইনামিক টাইপিং এবং মেসেজ সেন্ডিং)

অবজেক্টিভ-সি (Objective-C) - Computer Programming

255

Dynamic Typing এবং Message Sending হল Objective-C এর দুইটি গুরুত্বপূর্ণ কনসেপ্ট যা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের কিছু অত্যন্ত শক্তিশালী বৈশিষ্ট্যকে বাস্তবায়িত করে। এগুলি কোডের নমনীয়তা, সাশ্রয়ীতা এবং ব্যবস্থাপনাকে আরও কার্যকরী ও গতিশীল করে।


1. Dynamic Typing (ডাইনামিক টাইপিং)

Dynamic Typing হলো এমন একটি কনসেপ্ট যেখানে একটি ভেরিয়েবলের টাইপ (data type) রানটাইমে (যখন প্রোগ্রাম চলবে) নির্ধারিত হয়, না যে কোড কম্পাইল করার সময়। এটি একটি শক্তিশালী বৈশিষ্ট্য যা Objective-C তে খুবই সাধারণ, কারণ এটি অবজেক্টগুলোকে ভিন্ন ভিন্ন টাইপের ডেটার সাথে পরিচালনা করতে সক্ষম করে।

Dynamic Typing এর সুবিধা:

  1. নমনীয়তা: প্রোগ্রাম চলাকালীন টাইপের পরিবর্তন করার সুযোগ পায়।
  2. কম্পাইল টাইমে টাইপ চেকিং না হওয়া: আপনি যে কোনও অবজেক্টের জন্য মেথড কল করতে পারেন, যদি সেই অবজেক্টে মেথডটি উপলব্ধ থাকে।
  3. ফাস্ট ডেভেলপমেন্ট: ক্লাস বা মেথড তৈরি করার সময় টাইপ নির্দিষ্ট না করলেও, এটি runtime এ সহজেই কাজ করতে পারে।

Dynamic Typing এর সিনট্যাক্স:

Objective-C তে dynamic typing ব্যবহার করতে, আপনি id টাইপ ব্যবহার করবেন, যা কোনো নির্দিষ্ট ক্লাসের বা টাইপের নয়, বরং যেকোনো টাইপের অবজেক্ট ধারণ করতে পারে।

id myObject;
myObject = [[NSString alloc] initWithString:@"Hello, World!"];
NSLog(@"%@", myObject);  // এখানে myObject একটি NSString অবজেক্ট
  • id: এটি এমন একটি টাইপ যা কোনও নির্দিষ্ট টাইপের প্রতি প্রতিশ্রুতিবদ্ধ নয়। এটি যেকোনো ধরনের অবজেক্ট ধারণ করতে পারে। এর মাধ্যমে একটি অবজেক্টের টাইপ runtime এ নির্ধারণ করা হয়।

উদাহরণ:

id myObject;

myObject = [[NSString alloc] initWithString:@"Objective-C"];  // NSString অবজেক্ট
NSLog(@"%@", myObject);  // Output: Objective-C

myObject = [[NSNumber alloc] initWithInt:100];  // NSNumber অবজেক্ট
NSLog(@"%@", myObject);  // Output: 100

এখানে myObject প্রথমে একটি NSString অবজেক্ট ধারণ করছিল এবং পরে NSNumber অবজেক্ট ধারণ করেছে। id টাইপের মাধ্যমে এটি সম্পূর্ণভাবে ডাইনামিক টাইপিংয়ের সুবিধা পেয়েছে।


2. Message Sending (মেসেজ সেন্ডিং)

Message Sending হল Objective-C তে একটি অবজেক্টে মেথড কল করার পদ্ধতি। এটি Message Passing পদ্ধতির ভিত্তিতে কাজ করে, যেখানে মেথড কল একটি বার্তা হিসেবে পাঠানো হয় এবং অবজেক্ট সেই বার্তা প্রক্রিয়া (process) করে। এটি C বা C++ এর ফাংশন কলের মতো নয়; বরং একটি মেসেজ পাসিং সিস্টেম যা অবজেক্টের কার্যক্রমকে পরিচালনা করে।

Message Sending এর মৌলিক ধারণা:

  1. মেসেজ পাসিং সিস্টেম: একটি অবজেক্ট অন্য অবজেক্টকে একটি মেসেজ পাঠায়, যা সেই অবজেক্টের মেথড বা ফাংশনকে কল করে।
  2. Dynamic Dispatch: মেসেজ পাসিং সিস্টেমে মেসেজটি runtime এ ডাইনামিক্যালি ডিসপ্যাচ (প্রেরণ) করা হয়, অর্থাৎ কোন মেথডটি কল হবে তা runtime এ নির্ধারণ করা হয়।

Message Sending এর সিনট্যাক্স:

Objective-C তে মেসেজ সেন্ডিং সাধারণত [object method] সঠিক সিনট্যাক্সের মাধ্যমে করা হয়। এখানে object হলো অবজেক্ট এবং method হলো সেই অবজেক্টের মেথড।

[myObject performAction];  // performAction মেথড কল হচ্ছে

Message Sending এর উদাহরণ:

@interface Car : NSObject
- (void) startEngine;
@end

@implementation Car
- (void) startEngine {
    NSLog(@"Engine started");
}
@end

int main() {
    Car *myCar = [[Car alloc] init];
    [myCar startEngine];  // মেসেজ সেন্ডিং, startEngine মেথড কল হচ্ছে
    return 0;
}

এখানে myCar অবজেক্টে startEngine মেসেজ পাঠানো হচ্ছে। এটি মেসেজ পাসিং সিস্টেমের মাধ্যমে অবজেক্টের startEngine মেথডটিকে কল করবে।


Dynamic Typing এবং Message Sending এর মধ্যে সম্পর্ক

  1. Dynamic Typing এবং Message Sending একে অপরের সাথে সম্পর্কিত। Dynamic Typing এর মাধ্যমে আপনি id টাইপের ভেরিয়েবল ব্যবহার করে যেকোনো টাইপের অবজেক্ট রাখতে পারেন এবং Message Sending এর মাধ্যমে সেই অবজেক্টের মেথড কল করতে পারেন।
  2. Message Sending এর মাধ্যমে মেথডটি runtime এ নির্ধারণ হয়, এবং Dynamic Typing এর মাধ্যমে যেকোনো অবজেক্টের সাথে মেসেজ সেন্ড করা সম্ভব হয়, যতক্ষণ না অবজেক্টে ওই মেথড উপলব্ধ থাকে।

সারাংশ

  • Dynamic Typing: এটি Objective-C এর একটি শক্তিশালী বৈশিষ্ট্য, যেখানে ভেরিয়েবলের টাইপ রানটাইমে নির্ধারণ করা হয়। id টাইপের মাধ্যমে কোনো নির্দিষ্ট টাইপের অবজেক্ট ধারণ করা সম্ভব হয়।
  • Message Sending: এটি মেসেজ পাসিং সিস্টেমের মাধ্যমে একটি অবজেক্টের মেথড কল করার পদ্ধতি। এই প্রক্রিয়ায় মেথড কলটি রানটাইমে নির্ধারিত হয় এবং মেসেজ পাঠানোর মাধ্যমে কার্যকর হয়।

Dynamic Typing এবং Message Sending Objective-C তে খুবই শক্তিশালী এবং নমনীয় প্রোগ্রামিং কনসেপ্ট যা প্রোগ্রামকে আরও গতিশীল এবং শক্তিশালী করে তোলে।

Content added By

Dynamic Typing এবং Static Typing দুটি প্রোগ্রামিং ভাষার টাইপিং পদ্ধতি, যা কিভাবে ডেটা টাইপ নির্ধারণ করা হয় তা নির্ধারণ করে। এই দুটি পদ্ধতির মধ্যে প্রধান পার্থক্য হল, টাইপ নির্ধারণ কখন এবং কিভাবে করা হয়।


1. Static Typing (স্ট্যাটিক টাইপিং)

Static Typing হলো সেই টাইপিং পদ্ধতি যেখানে একটি ভেরিয়েবলের টাইপ প্রোগ্রাম কম্পাইল হওয়ার সময় নির্ধারিত হয়। অর্থাৎ, টাইপ (যেমন: int, float, NSString) ডিক্লেয়ার করার সময়েই সেটি নির্ধারণ করতে হয় এবং কম্পাইলারের মাধ্যমে চেক করা হয়। একবার টাইপ নির্ধারণ হয়ে গেলে, সেই ভেরিয়েবলের টাইপ বদলানো যায় না।

স্ট্যাটিক টাইপিং এর বৈশিষ্ট্য:

  • টাইপ প্রোগ্রাম কম্পাইল হওয়ার সময় নির্ধারণ করা হয়।
  • টাইপ সঠিকতা কম্পাইলার দ্বারা চেক করা হয়, ফলে রানটাইম এরর কম হয়।
  • টাইপ সুরক্ষা (Type Safety) নিশ্চিত থাকে।
  • ভেরিয়েবলটির টাইপ আগে থেকেই নির্দিষ্ট থাকতে হয়, টাইপ পরিবর্তন করা সম্ভব নয়।

স্ট্যাটিক টাইপিং এর উদাহরণ (C, C++, Java):

int age = 25;   // টাইপ static (int)
age = "Hello";  // এটি ত্রুটি হবে, কারণ টাইপটি পরিবর্তন করা যাচ্ছে না

এখানে, age ভেরিয়েবলটি শুরুতে int টাইপে ডিক্লেয়ার করা হয়েছে এবং পরে একে String টাইপে সেট করা হলে ত্রুটি হবে। কারণ Java একটি স্ট্যাটিক টাইপিং ভাষা, এবং টাইপ একবার ডিক্লেয়ার করার পরে তা পরিবর্তন করা যায় না।


2. Dynamic Typing (ডায়নামিক টাইপিং)

Dynamic Typing হলো সেই টাইপিং পদ্ধতি যেখানে একটি ভেরিয়েবলের টাইপ রানটাইমে নির্ধারণ করা হয়, অর্থাৎ, কোড চলার সময় টাইপ অ্যাসাইন করা হয়। এতে টাইপ নির্ধারণের সময় কম্পাইলার কোনো ত্রুটি ফেলে না, বরং এটি রানটাইমের সময় টাইপের সঠিকতা পরীক্ষা করে।

ডায়নামিক টাইপিং এর বৈশিষ্ট্য:

  • টাইপ রানটাইমে নির্ধারণ করা হয়।
  • টাইপ সঠিকতা চলাকালীন সময়ে চেক করা হয় (রানটাইম এরর)।
  • ডেটা টাইপ পরিবর্তন করা সম্ভব।
  • কোড লেখা সহজতর হয়, তবে কিছু সময় রানটাইমে টাইপ সম্পর্কিত ত্রুটি হতে পারে।

ডায়নামিক টাইপিং এর উদাহরণ (Python, JavaScript, Objective-C):

age = 25   # টাইপ dynamic (int)
age = "Hello"  # এটি কাজ করবে, কারণ টাইপ পরিবর্তন করা সম্ভব

এখানে, age ভেরিয়েবলটি প্রথমে একটি int টাইপে অ্যাসাইন করা হয়েছে এবং পরে এটি একটি String টাইপে পরিবর্তন করা হয়েছে। Python একটি ডায়নামিক টাইপিং ভাষা, তাই টাইপ পরিবর্তন করা সম্ভব এবং কোনো ত্রুটি হবে না।


স্ট্যাটিক টাইপিং এবং ডায়নামিক টাইপিং এর মধ্যে পার্থক্য

বৈশিষ্ট্যStatic Typing (স্ট্যাটিক টাইপিং)Dynamic Typing (ডায়নামিক টাইপিং)
টাইপ নির্ধারণকম্পাইলেশন সময়।রানটাইম সময়ে।
টাইপ পরিবর্তনটাইপ একবার নির্ধারিত হলে পরিবর্তন করা যায় না।টাইপ পরিবর্তন করা যায়।
টাইপ চেকিংকম্পাইলারের মাধ্যমে টাইপ চেক করা হয়।রানটাইমে টাইপ চেক করা হয়।
কোডের সুরক্ষাটাইপ সুরক্ষা (Type Safety) বেশি থাকে।রানটাইমে ত্রুটি হওয়ার সম্ভাবনা বেশি।
ভাষার উদাহরণC, C++, Java, SwiftPython, Ruby, JavaScript, Objective-C
ত্রুটি সনাক্তকরণকম্পাইল সময় ত্রুটি সনাক্ত হয়।রানটাইম সময় ত্রুটি সনাক্ত হয়।

উপসংহার

  • Static Typing (স্ট্যাটিক টাইপিং) একটি শক্তিশালী টাইপিং পদ্ধতি যেখানে টাইপ কম্পাইল হওয়ার সময় নির্ধারিত হয়। এটি সাধারণত কম্পাইলার দ্বারা চেক করা হয় এবং টাইপ সুরক্ষা বজায় রাখে, ফলে রানটাইমে ত্রুটি কম হয়।
  • Dynamic Typing (ডায়নামিক টাইপিং) একটি নমনীয় টাইপিং পদ্ধতি যেখানে টাইপ রানটাইমে নির্ধারিত হয় এবং এটি কোড লিখতে সহজ কিন্তু কিছু রানটাইম ত্রুটি ঘটতে পারে।

প্রত্যেকটি পদ্ধতির সুবিধা এবং অসুবিধা রয়েছে, এবং আপনি প্রোগ্রামিং ভাষা বা প্রজেক্টের প্রয়োজন অনুসারে Static বা Dynamic টাইপিং বেছে নিতে পারেন।

Content added By

id টাইপ এবং Dynamic Object Creation হল Objective-C তে গুরুত্বপূর্ণ কনসেপ্ট। id টাইপ ব্যবহৃত হয় যখন একটি ভেরিয়েবলের ধরণ বা টাইপ নির্দিষ্ট করা না থাকে এবং Dynamic Object Creation এর মাধ্যমে রানটাইমে অবজেক্ট তৈরি করা হয়। এই বিষয়গুলো কোডের নমনীয়তা এবং ডাইনামিক আচরণ বৃদ্ধি করে। আসুন, বিস্তারিতভাবে এগুলোর ব্যবহার এবং গুরুত্ব বুঝে নিই।


1. id টাইপের ব্যবহার

id হল একটি ডাইনামিক টাইপ যা কোনো নির্দিষ্ট ক্লাসের অবজেক্টের জন্য ব্যবহৃত হয়। এটি Objective-C তে এমন ভেরিয়েবল ডিফাইন করার জন্য ব্যবহৃত হয় যেগুলোর টাইপ রানটাইমে নির্ধারণ করা হয়। id দিয়ে আপনি যে কোন ক্লাসের অবজেক্ট রেফারেন্স করতে পারেন। এটি একটি সর্বজনীন পয়েন্টার, যার মানে হল যে, এটি যেকোনো অবজেক্টের রেফারেন্স ধারণ করতে পারে।

id টাইপের বৈশিষ্ট্য:

  1. নির্দিষ্ট ক্লাস টাইপ না থাকা: id ব্যবহার করলে কোন নির্দিষ্ট টাইপের অবজেক্ট প্রয়োজন নেই।
  2. ডাইনামিক টাইপিং: রানটাইমে এটি কোনো ধরনের অবজেক্ট ধারণ করতে পারে।
  3. মেথড কল: id টাইপের মাধ্যমে আপনি যেকোনো ক্লাসের অবজেক্টের মেথড কল করতে পারেন।

সিনট্যাক্স:

id objectName;
  • এখানে, objectName যেকোনো ধরনের অবজেক্ট ধারণ করতে পারে।

উদাহরণ:

// NSString এবং NSNumber এর অবজেক্ট দুটি আলাদা টাইপ কিন্তু উভয়কেই id দিয়ে রেফারেন্স করা যাবে

id myObject;
myObject = @"Hello, Objective-C!";  // NSString টাইপের অবজেক্ট
NSLog(@"%@", myObject);

myObject = @123;  // NSNumber টাইপের অবজেক্ট
NSLog(@"%@", myObject);

এখানে, myObject একটি id টাইপ ভেরিয়েবল, যা প্রথমে একটি NSString অবজেক্ট ধারণ করছে এবং পরে একটি NSNumber অবজেক্ট ধারণ করছে। id টাইপের ব্যবহার এর নমনীয়তা বৃদ্ধি করেছে, কারণ এটি একাধিক টাইপের অবজেক্ট ধারণ করতে সক্ষম।


2. Dynamic Object Creation (ডাইনামিক অবজেক্ট তৈরি)

Dynamic Object Creation হলো একটি কৌশল যেখানে আপনি রানটাইমে অবজেক্ট তৈরি করতে পারেন, যার মানে হচ্ছে অবজেক্টের ক্লাস এবং ইনস্ট্যান্স রানটাইমে নির্ধারণ করা হয়। Objective-C তে, এটি alloc এবং init মেথডের মাধ্যমে করা হয়। এর মাধ্যমে আপনি একাধিক ধরনের অবজেক্ট তৈরি করতে পারেন, এবং id টাইপের ব্যবহার ডাইনামিক অবজেক্ট ক্রিয়েশনে খুবই সহায়ক।

Dynamic Object Creation এর সিনট্যাক্স:

id object = [[ClassName alloc] init];
  • alloc: এটি অবজেক্টের জন্য মেমরি বরাদ্দ করে।
  • init: এটি অবজেক্ট ইনিশিয়ালাইজ করে।

উদাহরণ:

id myObject;

// NSString ক্লাসের ডাইনামিক অবজেক্ট তৈরি
myObject = [[NSString alloc] initWithString:@"Dynamic Object Creation!"];
NSLog(@"%@", myObject);

// NSNumber ক্লাসের ডাইনামিক অবজেক্ট তৈরি
myObject = [[NSNumber alloc] initWithInt:42];
NSLog(@"%@", myObject);

এখানে, প্রথমে NSString এবং পরে NSNumber অবজেক্ট রানটাইমে তৈরি করা হচ্ছে। id টাইপের ভেরিয়েবল myObject যেকোনো ক্লাসের অবজেক্ট ধারণ করতে সক্ষম, এবং এটি ডাইনামিকভাবে অবজেক্ট তৈরি করছে।


3. id টাইপ এবং Dynamic Object Creation এর মধ্যে সম্পর্ক

  • id টাইপ: এটি একাধিক ধরনের অবজেক্ট ধারণ করতে পারে। যখন আপনি ডাইনামিক অবজেক্ট তৈরি করেন, তখন আপনি id টাইপ ব্যবহার করে যেকোনো ক্লাসের অবজেক্ট ধারণ করতে পারেন।
  • Dynamic Object Creation: এটি রানটাইমে নতুন অবজেক্ট তৈরি করতে সহায়ক। id টাইপের মাধ্যমে আপনি এই অবজেক্টগুলির সাথে কাজ করতে পারেন।

id টাইপের এবং Dynamic Object Creation এর ব্যবহার একত্রিত করা:

id myObject;

// ডাইনামিকভাবে NSString অবজেক্ট তৈরি করা
myObject = [[NSString alloc] initWithString:@"Dynamic Creation in Objective-C"];
NSLog(@"%@", myObject);

// ডাইনামিকভাবে NSArray অবজেক্ট তৈরি করা
myObject = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
NSLog(@"%@", myObject);

এখানে myObject একটি id টাইপ ভেরিয়েবল, যা NSString এবং NSArray এর অবজেক্ট ধারণ করছে। id টাইপের কারণে, আপনি একাধিক ধরনের অবজেক্ট একসাথে কাজ করতে পারেন।


4. id এবং Dynamic Object Creation এর সুবিধা

  1. কোড নমনীয়তা: id টাইপের মাধ্যমে আপনি একাধিক টাইপের অবজেক্ট ব্যবহার করতে পারেন। এটি ডাইনামিক অবজেক্ট ক্রিয়েশনে সহায়ক, যেখানে আপনি কোন টাইপের অবজেক্ট ব্যবহারের পূর্বে জানতে পারেন না।
  2. এন্টারপ্রাইজ অ্যাপ্লিকেশনে প্রয়োগ: যেখানে একই টাইপের ডেটার উপর বিভিন্ন কাজ করার প্রয়োজন হতে পারে, সেখানে id ব্যবহার করে ডাইনামিক অবজেক্ট তৈরি করে কোডের নমনীয়তা বৃদ্ধি করা যায়।
  3. কমপ্লেক্স অ্যাপ্লিকেশন ডিজাইন: id এবং ডাইনামিক অবজেক্ট ক্রিয়েশন সমন্বয়ে অ্যাপ্লিকেশনের বিভিন্ন অংশে ডাইনামিক আচরণ তৈরি করা যায়, যা কোডকে আরও শক্তিশালী এবং প্রসারিত করা সহজ হয়।

5. সারাংশ

  • id টাইপ হল একটি বিশেষ ডাইনামিক টাইপ যা Objective-C তে যেকোনো অবজেক্টের টাইপ ধারণ করতে পারে। এটি কোডের নমনীয়তা এবং বহুমুখিতা বৃদ্ধি করে।
  • Dynamic Object Creation হল একটি কৌশল যেখানে আপনি অবজেক্টকে রানটাইমে তৈরি করতে পারেন। এটি সাধারণত alloc এবং init মেথড ব্যবহার করে করা হয়।
  • id টাইপ এবং Dynamic Object Creation একত্রে ব্যবহৃত হলে কোডে নমনীয়তা, দ্রুত ডেভেলপমেন্ট এবং কমপ্লেক্স ডেটা ম্যানিপুলেশন সম্ভব হয়।

id এবং Dynamic Object Creation Objective-C তে শক্তিশালী টুল, যা আপনার কোডকে আরও নমনীয়, প্রাঞ্জল এবং স্কেলেবল করে তোলে।

Content added By

Message Passing হল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর একটি গুরুত্বপূর্ণ ধারণা, যা মূলত অবজেক্টগুলির মধ্যে যোগাযোগের একটি প্রক্রিয়া। Objective-C তে, এটি একটি মৌলিক বৈশিষ্ট্য, যেখানে এক অবজেক্ট অন্য অবজেক্টকে মেসেজ পাঠায় এবং সেই মেসেজের ভিত্তিতে একটি মেথড কল করা হয়। এটি প্রোগ্রামিংয়ের একটি শক্তিশালী এবং নমনীয় উপায়, যা অবজেক্টের মধ্যে আন্তঃক্রিয়া সহজ করে তোলে।


Message Passing এর মৌলিক ধারণা

মেসেজ পাসিং হল একটি অবজেক্ট-ওরিয়েন্টেড ধারণা, যেখানে একটি অবজেক্ট অন্য অবজেক্টের কাছে একটি মেসেজ পাঠায়। সেই মেসেজটি সাধারণত একটি ফাংশন বা মেথড কল হিসেবে পরিচিত, যা গ্রহণকারী অবজেক্টের দ্বারা এক্সিকিউট করা হয়। মেসেজ পাসিংয়ের মাধ্যমে, অবজেক্টগুলির মধ্যে যোগাযোগ করা যায়, যেখানে মেসেজের মাধ্যমে প্রক্রিয়া বা কাজ সম্পাদন করা হয়।

অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষায়, মেসেজ পাসিং হল সেই প্রক্রিয়া যা এক অবজেক্টকে অন্য অবজেক্টের কার্যক্রম বা মেথড কল করার অনুমতি দেয়। Objective-C তে এটি সাধারণত [object message] সিনট্যাক্সের মাধ্যমে করা হয়।

মেসেজ পাসিং কিভাবে কাজ করে?

  1. একটি অবজেক্ট অন্য অবজেক্টকে একটি মেসেজ পাঠায়।
  2. মেসেজটি মেথড কল হিসেবে ব্যবহৃত হয়।
  3. মেসেজ প্রাপ্ত অবজেক্ট, মেসেজের ভিত্তিতে একটি কার্যক্রম সম্পাদন করে।
  4. মেসেজ পাসিং সাধারণত run-time এ ঘটে, যার মানে হলো, একাধিক অবজেক্টের মধ্যে যোগাযোগ প্রয়োগ করা হয় যখন প্রোগ্রাম চলমান থাকে।

Objective-C তে মেসেজ পাসিং

Objective-C তে, মেসেজ পাসিং খুবই গুরুত্বপূর্ণ এবং এটি [] সিনট্যাক্স ব্যবহার করে করা হয়। একটি অবজেক্টের মেথড কল করতে, আপনি সাধারণত নিম্নলিখিত সিনট্যাক্স ব্যবহার করেন:

[object message];

এখানে, object হল অবজেক্টটির নাম এবং message হল মেথড যা কল করা হবে।

অবজেক্টের মেথড কল করার উদাহরণ:

// Car.h
@interface Car : NSObject
- (void) startEngine;  // মেথড ডিক্লেয়ারেশন
@end

// Car.m
@implementation Car
- (void) startEngine {
    NSLog(@"Engine started.");
}
@end

// main.m
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Car *myCar = [[Car alloc] init];  // Car অবজেক্ট তৈরি
        [myCar startEngine];  // মেসেজ পাসিং
    }
    return 0;
}

এখানে startEngine মেথডটি Car অবজেক্টে কল করা হচ্ছে। এই মেসেজ পাসিং প্রক্রিয়ার মাধ্যমে অবজেক্টটি startEngine মেথডটি এক্সিকিউট করবে এবং আউটপুট হবে "Engine started."


Message Passing এর Run-time Execution

Objective-C তে মেসেজ পাসিং run-time এ ঘটে, যা এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য। অর্থাৎ, প্রোগ্রাম চলাকালীন সময়েই অবজেক্টটি তার মেসেজ অনুযায়ী মেথডটি এক্সিকিউট করবে।

উদাহরণ:

@interface Car : NSObject
- (void) startEngine;
- (void) stopEngine;
@end

@implementation Car
- (void) startEngine {
    NSLog(@"Engine started.");
}

- (void) stopEngine {
    NSLog(@"Engine stopped.");
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Car *myCar = [[Car alloc] init]; // Car অবজেক্ট তৈরি
        
        // মেসেজ পাসিং এবং run-time মেথড এক্সিকিউশন
        SEL engineAction = @selector(startEngine); // মেথড সিলেক্টর
        [myCar performSelector:engineAction];  // মেথড কল করা হচ্ছে
        
        engineAction = @selector(stopEngine);  // মেথড পরিবর্তন
        [myCar performSelector:engineAction];  // নতুন মেথড কল
    }
    return 0;
}

এখানে, performSelector: মেথডটি ব্যবহার করে run-time এ মেথড সিলেক্টরকে অ্যাসাইন করা হচ্ছে এবং সেই সিলেক্টরের ভিত্তিতে মেথডটি কল করা হচ্ছে। এতে startEngine এবং stopEngine মেথড দুটি run-time এ কল হতে পারে, যা মেসেজ পাসিংয়ের কার্যকারিতা দেখায়।


Message Sending (মেসেজ সেন্ড করা)

মেসেজ সেন্ডিং হল একটি মেসেজের মাধ্যমে অন্য অবজেক্টের মেথড কল করার প্রক্রিয়া। Objective-C তে, যখন একটি মেসেজ পাস করা হয়, তখন আসলে একটি মেথড কল করা হয় যা একটি অবজেক্টের উপর কার্যকর হয়।

[object performSelector:selector];

এখানে object হল অবজেক্ট যা মেসেজটি গ্রহণ করবে, এবং selector হল সেই মেথড যা কল করা হবে। selector একটি স্পেশাল টাইপ যা মেথডের নাম নির্দেশ করে এবং এটি @selector() কিওয়ার্ডের মাধ্যমে তৈরি করা হয়।

উদাহরণ:

// Example of sending a message dynamically
SEL mySelector = @selector(startEngine);
[myCar performSelector:mySelector];

এখানে, @selector(startEngine) একটি সিলেক্টর তৈরি করছে যা মেথড startEngine কে নির্দেশ করে, এবং performSelector: ব্যবহার করে তা কল করা হচ্ছে।


Message Passing এর সুবিধা

  1. ডাইনামিক এবং নমনীয়: Objective-C তে, মেসেজ পাসিংকে run-time এ পরিচালনা করা যায়, যা কোডকে নমনীয় এবং পরিবর্তনযোগ্য করে তোলে।
  2. অবজেক্টের মধ্যে ইন্টারঅ্যাকশন: একাধিক অবজেক্টের মধ্যে যোগাযোগ এবং কার্যক্রম ভাগ করার জন্য এটি অত্যন্ত কার্যকর।
  3. প্রোগ্রামের গঠন: মেসেজ পাসিং কোডের গঠন পরিষ্কার এবং সহজ করে, কারণ মেথড কল সরাসরি মেসেজের মাধ্যমে সম্পাদিত হয়।

সারাংশ

  • Message Passing হল Objective-C তে এক অবজেক্ট অন্য অবজেক্টকে মেসেজ পাঠানোর মাধ্যমে মেথড কল করার প্রক্রিয়া।
  • Objective-C তে, মেসেজ পাসিং [] সিনট্যাক্স ব্যবহার করে করা হয়, যেমন: [object message]
  • মেসেজ পাসিং run-time এ ঘটে, যা এটিকে আরও নমনীয় এবং পরিবর্তনযোগ্য করে তোলে।
  • Message Sending হল মেসেজ পাসিংয়ের অংশ, যা একটি নির্দিষ্ট সিলেক্টরের মাধ্যমে মেথড কল করে।
  • performSelector মেথডের মাধ্যমে ডাইনামিকভাবে মেথড কল করা সম্ভব হয়।

এই প্রক্রিয়া কোডকে আরও মডুলার, নমনীয় এবং শক্তিশালী করে তোলে।

Content added By

Objective-C তে, SEL এবং @selector কিওয়ার্ড দুটি বিশেষভাবে মেথডের রেফারেন্স তৈরি এবং ব্যবহারের জন্য ব্যবহৃত হয়। এই দুটি কিওয়ার্ডের মাধ্যমে আমরা একটি মেথডকে রেফারেন্স হিসেবে ব্যবহার করতে পারি এবং তা অন্য জায়গায় কল (invoke) করতে পারি। এটি সাধারণত dynamic method dispatching, target-action patterns (যেমন UIButton ক্লিকের জন্য), এবং message passing ব্যবহৃত হয়।


1. SEL (Selector)

SEL একটি ডেটা টাইপ যা একটি মেথড সিগনেচার বা মেথড নাম কে রেফারেন্স করে। এটি প্রোগ্রামে মেথড নাম সংরক্ষণ এবং মেথড কলের জন্য ব্যবহৃত হয়। মূলত, এটি একটি মেথডের নামের পয়েন্টার হিসেবে কাজ করে, যা পরে অন্য যেকোনো জায়গায় মেসেজ পাসিং এর মাধ্যমে কল করা যেতে পারে।

SEL এর কাজ:

  • SEL কেবল মেথড নাম সংরক্ষণ করে, কিন্তু এর সাথে কোন মেথডের বাস্তবায়ন যুক্ত থাকে না।
  • এটি method references এর মাধ্যমে এক্সিকিউট করা যায়।

SEL ডিক্লেয়ারেশন উদাহরণ:

SEL mySelector = @selector(displayCarDetails);

এখানে, mySelector একটি SEL টাইপ ভেরিয়েবল যা displayCarDetails মেথডের সিলেক্টর বা রেফারেন্স সংরক্ষণ করছে।


2. @selector কিওয়ার্ড

@selector কিওয়ার্ডটি SEL টাইপের একটি মান তৈরি করতে ব্যবহৃত হয়, যা একটি মেথডের নাম রেফারেন্স করে। এটি একটি selector (মেথডের নাম) তৈরি করে, যেটি পরে performSelector: বা respondsToSelector: এর মতো মেথডে পাস করা যেতে পারে।

@selector এর সিনট্যাক্স:

@selector(methodName)

এটি methodName নামে একটি মেথডের সিলেক্টর (রেফারেন্স) তৈরি করবে।

@selector উদাহরণ:

SEL selector = @selector(displayCarDetails);

এখানে, @selector(displayCarDetails) একটি SEL তৈরি করছে যা displayCarDetails মেথডের রেফারেন্স।


3. SEL এবং @selector এর ব্যবহার

SEL এবং @selector এর মাধ্যমে মেথড রেফারেন্স তৈরি এবং ব্যবহার করা হয় যেখানে মেথডের নাম ডাইনামিকভাবে নির্ধারণ করা হয় এবং সেই মেথড কল করা হয়। এটি সাধারণত target-action pattern বা message passing সিস্টেমে ব্যবহৃত হয়।

performSelector: এর মাধ্যমে মেথড কল:

একবার SEL তৈরি হয়ে গেলে, performSelector: মেথড ব্যবহার করে সেই মেথড কল করা যায়।

@interface Car : NSObject
- (void) displayCarDetails;
@end

@implementation Car
- (void) displayCarDetails {
    NSLog(@"Displaying car details...");
}
@end

int main() {
    @autoreleasepool {
        Car *myCar = [[Car alloc] init];
        
        // @selector দিয়ে সিলেক্টর তৈরি
        SEL selector = @selector(displayCarDetails);
        
        // performSelector দিয়ে সিলেক্টর কল করা
        if ([myCar respondsToSelector:selector]) {
            [myCar performSelector:selector];
        }
    }
    return 0;
}
  • @selector(displayCarDetails): এটি displayCarDetails মেথডের সিলেক্টর তৈরি করে।
  • [myCar performSelector:selector]: এটি সিলেক্টরের মাধ্যমে displayCarDetails মেথড কল করে।

এখানে performSelector: মেথডটি SEL টাইপের একটি আর্গুমেন্ট নেয় এবং ঐ মেথডটি ডাইনামিকভাবে কল করে।


4. respondsToSelector: এর মাধ্যমে মেথড চেক করা

respondsToSelector: মেথড ব্যবহার করে আপনি চেক করতে পারেন যে, একটি অবজেক্ট নির্দিষ্ট SEL (মেথড) সিলেক্টরটি প্রাপ্ত এবং কার্যকরভাবে বাস্তবায়িত করতে পারে কিনা।

respondsToSelector: উদাহরণ:

if ([myCar respondsToSelector:selector]) {
    [myCar performSelector:selector];
} else {
    NSLog(@"Method not found");
}

এখানে, প্রথমে respondsToSelector: চেক করবে যে myCar অবজেক্টের মধ্যে displayCarDetails মেথডটি বিদ্যমান কিনা। যদি মেথডটি বিদ্যমান থাকে, তবে তা কল করা হবে, অন্যথায় একটি বার্তা প্রদর্শিত হবে।


5. SEL এবং @selector এর মধ্যে পার্থক্য

বৈশিষ্ট্যSEL@selector
মূল্যএটি একটি টাইপ যা একটি মেথডের নাম ধারণ করেএটি একটি কিওয়ার্ড যা SEL টাইপ তৈরি করে
ব্যবহারমেথডের নামকে রেফারেন্স করার জন্য ব্যবহৃতমেথডের নাম selector হিসেবে রেফারেন্স করার জন্য ব্যবহৃত
কোডে ব্যবহারের প্রকারSEL mySelector = @selector(mymethod)SEL selector = @selector(mymethod)
ধরনSEL একটি টাইপ যা মেথডের নাম ধারণ করে@selector একটি কিওয়ার্ড যা মেথডের নামকে SEL টাইপে রূপান্তরিত করে

6. সারাংশ

  • SEL একটি ডেটা টাইপ যা মেথডের নামের রেফারেন্স বা পয়েন্টার ধারণ করে এবং এটি মেসেজ পাসিং ও ডাইনামিক মেথড কলের জন্য ব্যবহৃত হয়।
  • @selector কিওয়ার্ডটি ব্যবহার করে আপনি মেথডের নাম থেকে একটি SEL তৈরি করেন যা মেথড রেফারেন্স হিসেবে কাজ করে।
  • performSelector: এবং respondsToSelector: এর মতো মেথড ব্যবহার করে ডাইনামিকভাবে মেথড কল করা যায় এবং মেথডের উপস্থিতি পরীক্ষা করা যায়।

এটি Objective-C তে messae passing এবং dynamic method invocation এর মাধ্যমে ডাইনামিক প্রোগ্রামিংয়ের অংশ হিসেবে ব্যবহৃত হয়।

Content added By
Promotion

Are you sure to start over?

Loading...