ডেলিগেটস, ইভেন্টস এবং ল্যামবডাস (Delegates, Events & Lambdas)
ডেলিগেট কী? (What Is a Delegate?)
সাধারণত, ভেরিয়েবলগুলো (variables) নিজেদের ভেতরে ডেটা (data) — যেমন সংখ্যা, স্ট্রিং (strings) বা অবজেক্ট (objects) ধরে রাখে। কিন্তু কেমন হতো যদি আপনি একটি ভেরিয়েবলের ভেতরে কোনো মেথডকে (method) সংরক্ষণ করতে পারতেন? মূলত একটি ডেলিগেট (delegate) ঠিক এই কাজটিই করে থাকে।
একটি ডেলিগেটকে একটি টিভির রিমোট কন্ট্রোলের (TV remote control) মতো ভাবতে পারেন। রিমোটটি জানে না যে তাকে কোন টিভির দিকে তাক করানো হয়েছে — সে শুধু এটুকু জানে যে, "আমি যদি বোতাম চাপি, তবে কিছু একটা ঠিকই ঘটবে।" আপনি চাইলে রিমোটটিকে বিভিন্ন টিভির (অর্থাৎ বিভিন্ন মেথডের) দিকে তাক করতে পারেন এবং বোতাম চাপলেই ওই মুহূর্তে রিমোটের সাথে যেটি সংযোগ করা আছে, সেটি চালু হয়ে যাবে।
এটি খুবই শক্তিশালী একটি জিনিস, কারণ এর ফলে আপনি অনেক নমনীয় বা ফ্লেক্সিবল (flexible) কোড লিখতে পারবেন। কোন মেথডটিকে কল করতে হবে তা আগে থেকেই হার্ড-কোড (hard-code) করে না লিখে, আপনি এখন প্যারামিটার হিসেবে পুরো মেথডটিকেই পাঠিয়ে দিতে পারবেন। এর ফলে যাকে কল করা হবে, সে নিজেই ঠিক করবে যে এরপর আসলে কী ঘটবে।
ডেলিগেটস — ভেরিয়েবলের রূপ নেওয়া মেথডস (Delegates — Methods as Variables)
Action<T> এবং Func<T,TResult> — সি শার্পের বিল্ট-ইন ডেলিগেট (Action<T> and Func<T,TResult> — Built-in Delegates)
নিজের মতো করে ডেলিগেট তৈরি করাটা অনেক সময় বেশ বিরক্তিকর মনে হতে পারে। তাই সি শার্পে (C#) আগে থেকেই তৈরি করা দুটি জেনেরিক ডেলিগেট (generic delegates) দেওয়া আছে, যা প্রায় সব ধরনের কাজেই ব্যবহার করা যায়:
Action<T>— এটি এমন একটি মেথড, যা প্যারামিটার গ্রহণ করে ঠিকই, কিন্তু এর বদলে কোনো কিছুই (void) রিটার্ন করে না।Action<string>একটি স্ট্রিং গ্রহণ করে, কিন্তু এটি শুধু void রিটার্ন করে।Func<T, TResult>— এটি এমন একটি মেথড, যা প্যারামিটার গ্রহণ করে এবং এর বদলে একটি ভ্যালু (value) রিটার্ন করে। এখানকার সবচেয়ে শেষের টাইপটি (type) সব সময়ই মেথডটির রিটার্ন টাইপ হিসেবে ধরা হয়।Func<int, int, int>মূলত দুটি int গ্রহণ করে এবং একটি int রিটার্ন করে।
এখন আর আপনাকে নিজের মতো করে কোনো ডেলিগেট টাইপ লিখতে হবে না বললেই চলে — কারণ Action এবং Func দিয়েই এখন ৯৯% কাজ করে ফেলা যায়।
Action, Func এবং ল্যামবডা এক্সপ্রেশন (Action, Func & Lambda Expressions)
ইভেন্টস বা ইভেন্ট — দ্য নোটিফিকেশন সিস্টেম (Events — The Notification System)
একটি ইভেন্ট (event) হলো নিউজলেটার সাবস্ক্রিপশনের (newsletter subscription) মতো। ধরা যাক, একজন প্রকাশক বা পাবলিশার (publisher, যেমন- একটি বাটন বা Button) বলছে, "আমার একটি Click বা ক্লিক ইভেন্ট আছে।" এখন যেকোনো সংখ্যক সাবস্ক্রাইবার বা গ্রাহক (subscribers) চাইলে += ব্যবহার করে ওই ইভেন্টে সাইন আপ করতে পারে। এরপর যখনই ইভেন্টটি ঘটবে বা ট্রিগার হবে, তখনই সব গ্রাহককে নোটিফিকেশন (notification) পাঠিয়ে তা জানিয়ে দেওয়া হবে।
ইভেন্টগুলো মূলত পেছনের দিক দিয়ে ডেলিগেট (delegates) হিসেবেই কাজ করে, কিন্তু এটি একটি নতুন নিয়ম বা বাধ্যবাধকতাও যোগ করে: গ্রাহকরা (subscribers) কেবল += দিয়ে যুক্ত হতে (subscribe) বা -= দিয়ে বাদ পড়তে (unsubscribe) পারবে। তারা চাইলে নিজেরা ইভেন্টটিকে ফায়ার (fire) করতে বা চালু করতে পারবে না, এমনকি অন্য গ্রাহকদের জায়গাও নিতে পারবে না। এর ফলে জিনিসগুলো অনেক নিরাপদ থাকে।
ইভেন্ট বা ইভেন্টস হলো ইউআই প্রোগ্রামিং (UI programming, যেমন- বাটনে ক্লিক করা, ফর্ম সাবমিট করা) এবং অন্যান্য অনেক ডিজাইনের (যেমন- observer pattern, pub/sub) একদম মেরুদণ্ড (backbone)।