অবজেকটিভ সি প্রোগ্রামিং ল্যাঙ্গুয়েজের একটি অন্যতম শক্তিশালী ফিচার হল ব্লক। প্রোগ্রামিং এ ব্লক কথাটার সাথে হয়তো আমরা পরিচিত না, কিন্তু এটাকে আমরা ব্যবহার করেছি অন্য ভাষায়, অন্যভাবে। যেমন, জাভাস্ক্রিপ্ট, রুবি কিংবা পাইথনের ক্লোজার (closures)।
ব্লক ব্যাপারটা আসলে কি ? অ্যাপল বলে,
“An Objective-C class defines an object that combines data with related behavior. Sometimes, it makes sense just to represent a single task or unit of behavior, rather than a collection of methods.”
খাঁটি বাংলায় বলতে গেলে, ব্লক হল একটা কোডব্লক যেটা ভবিষ্যতে কোন একটা সময় এক্সিকিউট হবে। উপরের ইংরেজি কথার ভিতর সবচেয়ে গুরুত্বপূর্ণ কথাটা হল, ব্লক একটা অবজেকটিভ সি অবজেক্ট। কেন ? কারন, যেহেতু দেখতে যেমনই হোক এবং যত বিদঘুটেই হোক, এটা একটা অবজেক্ট। সুতরাং আমরা এটাকে আমাদের এতদিনের জানা অবজেক্ট এর মতই ব্যবহার করতে পারব। যেমন, কোন ভ্যারিয়েবলের সাথে আস্যাইন করতে পারব, ফাংশন বা মেথডের আর্গুমেন্ট হিসেবে পাঠাতে পারব কিংবা কোন মেথড বা ফাংশন থেকে রিটার্ন ও করতে পারব।
এখন দেখা যাক কিভাবে ব্লক ব্যবহার করতে হয়…
অবজেকটিভ সিতে ব্লক লেখার নিয়ম হল
return_type (^block_name)(param_type, param_type, ...)
এখানে দুইটা জিনিস লক্ষণীয়। প্রথমটা হল, উপরের সিনট্যাক্স আমাদের মোটামুটি পরিচিত, সি এর ফাংশনের মত দেখতে অনেকটা। শুধু একটা অপরিচিত ক্যারেট (^) চিহ্ন আছে। এই চিহ্নটা আসলে বোঝায় যে, আমরা একটা ব্লক ডিক্লেয়ার করছি। আর আরেকটা হল, এখানে আমরা শুধুমাত্র প্যারামিটারের ডেটা টাইপ দেখতে পাচ্ছি, নাম নাই। সমস্যা নেই, আমরা চাইলে নামও দিতে পারব, এটা অপশনাল, আমরা চাইলে নাম দিতেও পারি নাও পারি।
কিভাবে ব্লক ডিক্লেয়ার করতে হয় জানা শেষ, এখন ঝটপট একটা উদাহরণ দেখে নিই।
int (^multiply)(int , int)
ডিক্লেয়ার করা শেষ, এবার দেখি কিভাবে ব্লক ডিফাইন করতে হয়। অর্থাৎ ব্লকের ভিতরে কি থাকে।
^(param_type param_name, param_type param_name, ...) { ... return return_type; }
দেখা যাচ্ছে, এটা একটু অন্যরকম। এখানে শুরুতে (^) চিহ্ন ও ব্লকের নাম নেই। এরপর আমরা ডিক্লেয়ার করার সময় শুধু প্যারামিটারের ডেটাটাইপ লিখেছিলাম কিন্তু এখানে আমাদেরকে সেটার সাথে নামও ব্যবহার করতে হবে অবশ্যই। প্যারামিটারগুলো অবশ্যই যেভাবে ডিক্লেয়ার করা হয়েছে সেই একই ক্রমে লিখতে হবে। এরপর আসছে, আমাদের ব্লক কি কাজ করবে সেটার কোড, এটা একবারেই আমাদের চেনা পরিচিত সি ফাংশনের মত। নিচের উদাহরণটা দেখলে আরও ভালো বোঝা যাবে।
^(int a , int b) { return a*b ; }
তাহলে সবমিলিয়ে ব্যাপারটা দাড়াচ্ছে এরকম।
ব্লক লেখা তো শেষ, এবার কিভাবে আমাদের লেখা ব্লকটা ব্যবহার করে দুইটা সংখ্যা গুণ করা যায় একটু দেখা যাক। খুব সহজেই আমরা সেটা করতে পারি।
এখন , ব্লকের দরকারটা কি আসলে ? আমরা তো এই কাজটা সাধারণভাবেই করতে পারতাম। দরকার আসলে অনেকগুলো। ব্লক অবজেক্টিভ সি কোডকে খুব বেশি পরিমাণ সিমপ্লিফাই করে। যেমন ধরা যাক, আমাদের একটা কাজ করতে হবে। এই কাজটা আবার আরেকটা কাজ শেষ না হওয়া পর্যন্ত করা যাবেনা। কাজেই , আমাদের কোন একটা কলব্যাক ফাংশন লাগবে যেটা ঐ কাজটা শেষ হলে আমাদেরকে জানাবে। সাধারণভাবে আমাদেরকে অন্য কোথাও এই কলব্যাক ফাংশন লিখতে হত এবং অনেক কোড বেশি লেখার দরকার হত। ব্লক এই ব্যাপারটাকে অনেক সিম্পল করে দেয়, কোডের পরিমাণ অনেকটা কমিয়ে দেয় এবং ব্লক ব্যবহার করলে আমাদের সেই কলব্যাকের কোডটাও আমরা একসাথে রাখতে পারি।
অ্যাপল দাবি করে ব্লক কোডকে অনেক ফাস্ট করে। সহজ কথায়, ব্লক হল অবজেকটিভ সি কোডের ভবিষ্যৎ। ধীরে ধীরে আগের কোডগুলোকে এখন ব্লক বেইজড করে ফেলা হচ্ছে। এটা আমরা যখন ওপেন সোর্স লাইব্রেরি ব্যবহার করব আমাদের এই কোর্সে , সেটার উদাহরণ হাতে কলমে দেখা যাবে।
আজকে এ পর্যন্তই। কোন প্রশ্ন থাকলে অবশ্যই নিচের কমেন্ট সেকশনে লিখুন। আমি সাধ্যমত উত্তর দেয়ার চেষ্টা করব। সাথে থাকার জন্য অসংখ্য ধন্যবাদ 🙂