শার্প সমাচার (১) : লিংক নিয়ে প্রাথমিক আলোচনা

না, এই লিংক মানে সেই বিখ্যাত (!) link না।

এই লিংক লিংক না, আরও লিংক আছে!

এই লিংকের মানে হচ্ছে LINQ, অর্থাত Language Integrated Query। এটার কাজ হচ্ছে কোন অবজেক্টের একটা আইটারেবল কালেকশন থেকে bool টাইপের এক্সপ্রেশন দিয়ে (কিংবা bool টাইপ রিটার্ন করে এমন ল্যাম্বডা এক্সপ্রেশন দিয়ে) প্রকাশ করা একটা নির্দিষ্ট শর্ত মেনে চলে, এ ধরনের অবজেক্টগুলোকে বের করা, এবং/অথবা অবজেক্টগুলোকে একটা নির্দিষ্ট property দিয়ে sort করা।

এখানে অনেকগুলো কঠিন কঠিন কথা বলে ফেললাম। আইটারেবল কালেকশন, ল্যাম্বডা এক্সপ্রেশন, এসবের আসলে মানে কী?

পুরো জিনিসটাই তো মাথার উপর দিয়ে গেলো!

আচ্ছা, একে একে ব্যাখ্যা করা যাক।

  • আইটারেবল (Iterable) কালেকশন হচ্ছে কিছু অবজেক্টের একটা সমষ্টি যেটাকে enumerate করা যায়, অর্থাৎ যেটার মধ্যে শুরু থেকে শেষ পর্যন্ত প্রতিটি অবজেক্ট সিরিয়াল নাম্বার ধরে ধরে পাওয়া যায়। এর সবচেয়ে ভালো উদাহরণ হতে পারে একটা ইন্টিজারের অ্যারে। এখানে ইন্টিজারের অ্যারে-টা হচ্ছে একটা আইটারেবল অবজেক্ট, যেখানে প্রতিটি মেম্বার অবজেক্টকে, অর্থাৎ ইন্টিজারকে, 0 থেকে শুরু করে (length - 1) পর্যন্ত ধরে ধরে access করা যায়। এ ধরনের টাইপের আরও উদাহরণ অ্যারে, লিংকড-লিস্ট, লিস্ট, স্ট্যাক, কিউ ইত্যাদি। ডটনেটে এ ধরনের টাইপগুলো IEnumerable ইন্টারফেসকে ইমপ্লিমেন্ট করে। এই ইন্টারফেসকে ইমপ্লিমেন্ট করার জন্য যে কাজগুলো করতে হয়, সেগুলোর মাধ্যমেই টাইপগুলো আইটারেবল হয়ে ওঠে।
  • ল্যাম্বডা এক্সপ্রেশন হচ্ছে একটা ফাংশন বা মেথডকে সহজে ও ছোট করে লেখার একটা কায়দা। এর জন্য প্রথমে প্যারামিটারগুলোকে লিখতে হবে, তারপর ল্যাম্বডা এক্সপ্রেশন “=>” দিতে হবে (এটাকে সি-শার্প ল্যাঙ্গুয়েজের জনকের নামানুসারে “হেইলসবার্গ অপারেটর”ও বলা হয়)। এরপর ফাংশনের বডি লিখতে হবে। ছোটখাট ফাংশন হলে সরাসরি কী return করতে হবে বলে দিলেই চলে। আর একটু বড় ডেফিনিশনের জন্য curly braces-এর মধ্যে লিখতে হবে। একটা উদাহরণ দেওয়া যাক:
ওই (a, b) => a + b অংশটুকুই হচ্ছে lambda expression

দেখা যাচ্ছে, ল্যাম্বডা এক্সপ্রেশনকে ডিক্লেয়ার করার জন্য Func<int, int, int> লেখা হয়েছে। প্রথম দুটো int দিয়ে বোঝানো হচ্ছে, ল্যাম্বডা এক্সপ্রেশনটা দুটো int টাইপের আর্গুমেন্ট নেয়। পরেরটা দিয়ে বোঝানো হচ্ছে, এখান থেকে int রিটার্ন দেওয়া হয়।

যাক, এতক্ষণ তো দুটো বিষয় পরিষ্কার হওয়া গেলো। এবার মূল আলোচনায় ফেরা যাক। সেটা হচ্ছে, লিংক দিয়ে কী কী কাজ করা সম্ভব।

১. ডেটা খুঁজে বের করা বা query করা

লিংক দিয়ে একটা আইটারেবল কালেকশনের মধ্যে ডেটা কুয়েরি করা একেবারেই সহজ। সিনট্যাক্সটা হচ্ছে দুই রকম: Query syntax, আর Method syntax।

কুয়েরি সিনট্যাক্স অনেকটা SQL-এর সিনট্যাক্সের মতই:

আর মেথড সিনট্যাক্সে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে হয়:

দেখা যাচ্ছে, মেথড সিনট্যাক্সে কুয়েরির জন্য ল্যাম্বডা এক্সপ্রেশনগুলোকে Func<T, bool> টাইপের এবং সর্টিংয়ের জন্য Func<T, TKey> টাইপের হতে হবে। এখানে T হচ্ছে যে টাইপের ডেটার কালেকশনের মধ্যে খোঁজাখুঁজি করা হচ্ছে, সেই টাইপ। আর TKey হচ্ছে সেই টাইপের যেকোন একটা property।

যাক, তাহলে বিষয়টা পরিষ্কার হয়ে গেলো…

কী বললেন?

বেশ!

ধরা যাক, আপনার স্কুলে শিক্ষার্থীদের তথ্য সংরক্ষণের জন্যে একটা প্রোগ্রাম লিখেছেন। সে প্রোগ্রামের জন্য স্টুডেন্ট ক্লাসের ডেফিনিশন লিখেছেন এভাবে:

আপাতত এনক্যাপসুলেশনের কায়দা দেখে ভড়কে যাওয়ার প্রয়োজন নেই 😋

ক্লাস ফাইভের একশ’ জন শিক্ষার্থীর বিবরণ একটা Student-এর অ্যারেতে রেখেছেন। ধরলাম, অ্যারের নাম class_V। আপনি এখন দেখতে চান, এই শিক্ষার্থীদের মধ্যে কাদের স্কোর ৮০-এর সমান বা বেশি।

আসুন, দেখে নিই লিংক ব্যবহার না করে কাজটা কীভাবে করা যেতে পারে:

ঠিক আছে, তাহলে লুপ চালিয়ে কাজটা করতে হবে। কিন্তু এই কাজটা কি আরও সহজে করা যায় না?

দেখা যাক, লিংক দিয়ে একই কাজ কীভাবে করা যায়:

কুয়েরি সিনট্যাক্স। বেশ ছোট হয়ে এসেছে কোড।
মেথড সিনট্যাক্স। এখানে আরও বেশি অল্প কোড লিখতে হয়েছে, ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে।

দেখা যাচ্ছে, বেশ খানিকটা ছোট হয়ে গেছে। বিশেষ করে মেথড সিনট্যাক্স ব্যবহার করলে পুরো জিনিসটাকে এক লাইনের মধ্যে লিখে ফেলা সম্ভব হচ্ছে।

বলে রাখা প্রয়োজন, লিংক স্টেটমেন্ট সব সময় IEnumerable<T> টাইপ রিটার্ন করে। এ কারণে সেটাকে List<T> টাইপে কনভার্ট করার জন্য .ToList() অংশটুকু যোগ করা হয়েছে (বলা বাহুল্য, আমাদের এই উদাহরণে T হচ্ছে Student টাইপ)। স্টুডেন্টের লিস্টের পরিবর্তে স্টুডেন্টের অ্যারে পেতে চাইলে .ToArray() মেথড যোগ করে দিলেই চলবে।

২. ডেটাকে বিন্যস্ত করা বা sort করা

আমি ব্যক্তিগতভাবে মনে করি, সর্টিংয়ে এসে লিংকের ম্যাজিকটা আরও বেশি চোখে পড়ে। আগের উদাহরণ থেকে কন্টিনিউ করলেই ব্যাপারটা খেয়াল করবেন।

ধরা যাক, পরীক্ষায় ৮০ বা তার বেশি স্কোর পাওয়া শিক্ষার্থীদের এই লিস্টটাকে আপনি স্কোরের অধঃক্রমানুসারে, অর্থাৎ in descending order, সাজিয়ে দেখাতে হবে। তো আপনি খুশি মনে আপনার জানা অ্যালগরিদম ইমপ্লিমেন্ট করতে লেগে গেলেন।

ধরে নিচ্ছি, আপনার পছন্দের সর্টিং অ্যালগরিদম হচ্ছে কুইক সর্ট।

কুইক সর্ট অ্যালগরিদমের একটা রিকার্শন-ভিত্তিক ইমপ্লিমেন্টেশন।

বেশ বড়সড় একটা কোড দেখা যাচ্ছে। এই দুটো মেথড লেখার পর

QuickSort(MoreThanOrEqualTo80, 0, MoreThanOrEqualTo80.Count - 1)

কল করলেই কাজ হবে।

এবার দেখা যাক, লিংক ব্যবহার করে কাজটা কীভাবে করা যেতে পারে:

কুয়েরি সিনট্যাক্স। নট ব্যাড, রাইট?

আর যদি মেথড সিনট্যাক্স ব্যবহার করি?

মেথড সিনট্যাক্স — এক লাইনেই শেষ!

যাক, আশা করি এটুকু আলোচনা থেকে লিংকের খুঁটিনাটি বোঝা না গেলেও অন্তত এটুকু বোঝা গেলো, লিংক দিয়ে অনেক বিশাল বিশাল কাজ অল্প কোড দিয়েই করে ফেলা সম্ভব।

আজকের মতো সি-শার্প বিষয়ক আলোচনা এটুকুই থাক 😊


কৃতজ্ঞতা: কোড স্নিপেটের ছবিগুলো বানিয়েছি carbon.now.sh ওয়েবসাইট থেকে। এই ওয়েবসাইটের সন্ধান পেয়েছি @sashraf94 এর কাছ থেকে। কুইকসর্ট অ্যালগোরিদমের জন্য C# Corner ওয়েবসাইটের সাহায্য নিয়েছি। মিমগুলো Imgflip ওয়েবসাইটে বানানো।