কম্পিউটার টিউটোরিয়াল

রুবিতে মেথড ডেলিগেশন মস্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

প্রোগ্রামিং-এ ডেলিগেশন বোঝায় একটি প্রোগ্রামের এক অংশ থেকে অন্য অংশে একটি টাস্ক হ্যান্ডওভার করা। এটি অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং-এ একটি অপরিহার্য টেকনিক, যা ক্লিন, মেইনটেইনেবল কোড নিশ্চিত করে এইরকম নিশ্চিত করে যে প্রতিটি অবজেক্ট বা মেথড একটি নির্দিষ্ট টাস্ক বা বিহেভিয়রের জন্য দায়বদ্ধ।

ডেলিগেশন বুঝতে এবং ব্যবহার করা রুবি এবং অন্যান্য অবজেক্ট-অরিয়েন্টেড ল্যাঙ্গুয়েজে দক্ষতা অর্জনের কী। ডেলিগেশন কনসার্নস অবকে সেপারেশন অফ কনসার্নস প্রোমোট করে, আপনার কোডকে আরও মডুলার এবং বুঝতে, টেস্ট ও রিফ্যাক্টর করা সহজ করে তোলে।

এই আর্টিকেলে, আমরা রুবিতে ডেলিগেশন অর্জনের তিনটি পদ্ধতি অন্বেষণ করব: এক্সপ্লিসিট ডেলিগেশন, Forwardable মডিউল, এবং ActiveSupport::Delegate (রেলসের জন্য)।

চলুন শুরু করি!

রুবিতে ডেলিগেশন

শুরু করা যাক এক্সপ্লিসিট ডেলিগেশন দিয়ে—একটি মেথডের ভিতরে অন্য একটি মেথড কল করা। তারপর আমরা বিল্ট-ইন Forwardable মডিউল এক্সপ্লোর করব এবং কীভাবে এটি ডেলিগেশন স্ট্রিমলাইন করতে পারে। শেষে, আমরা ActiveSupport::Delegate কভার করব, একটি রেলস-স্পেসিফিক ডেলিগেশন টুল কিছু হ্যান্ডি ফিচারের সাথে।

এক্সপ্লিসিট ডেলিগেশন (Explicit Delegation)

এটার সবচেয়ে সহজ রূপে, ডেলিগেশন অর্জন করা যায় একটি মেথডকে অন্য একটি মেথডের ভিতরে এক্সপ্লিসিটলি কল করে। এই পদ্ধতিটি প্রায়শই ব্যবহৃত হয় যখন ডেলিগেটেড মেথড একটি আলাদা অবজেক্টের ফ্লো করে অথবা যখন ডেলিগেশন достаточно সিম্পল হয় যাতে আরও অ্যাডভান্সড টেকনিক ব্যবহার করার প্রয়োজন নেই।

রুবিতে এক্সপ্লিসিট ডেলিগেশন ইমপ্লিমেন্ট করা সহজ। চলুন একটি Printer ক্লাস নিই যা একটি HP অবজেক্ট ব্যবহার করে টেক্সট প্রিন্ট করে:


উপরের উদাহরণে, Printer ক্লাসের print মেথড এক্সপ্লিসিটলি ফরম্যাটিং টাস্ককে HP ক্লাসে ডেলিগেট করে এর format মেথড কল করে। এই ডেলিগেশন প্রিন্টিং দায়িত্ব অন্য একটি ক্লাসে আউটসোর্স করে একটি সিম্পল এবং রিডেবল উপায়ে।

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

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

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

রুবির Forwardable মডিউল

Forwardable মডিউল একটি বিল্ট-ইন রুবি লাইব্রেরি যা এক্সপ্লিসিট ডেলিগেশনের চেয়ে আরও স্ট্রিমলাইনড এবং ফ্লেক্সিবল অ্যাপ্রোচ প্রদান করে মেথড ডেলিগেট করার জন্য। Forwardable মডিউল আপনার ক্লাসে ইনক্লুড করলে, আপনাকে def_delegator এবং def_delegators এর মত মেথড অ্যাক্সেস দেয়, যা ডেলিগেশনকে একদম সহজ করে দেয়।

Forwardable মডিউল দিয়ে শুরু করতে, আপনার ক্লাসে এটি ইনক্লুড করুন এবং এক বা একাধিক মেথড ডেলিগেট করতে def_delegator এবং def_delegators মেথড ব্যবহার করুন। চলুন আমাদের Printer উদাহরণটি একটি নতুন Formatter ক্লাসের সাথে রিভিজিট করি এবং Forwardable মডিউল ইমপ্লিমেন্ট করি:


উপরের উদাহরণে, আমরা def_delegator ব্যবহার করেছি Formatter ক্লাস থেকে format মেথড ডেলিগেট করার জন্য। যদি আপনাকে একসাথে একাধিক মেথড ডেলিগেট করতে হয়, তবে আপনি def_delegators ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি Formatter ক্লাসে capitalize এর মত অডিশনাল মেথড থাকে, তবে আপনি সেগুলো এইভাবে ডেলিগেট করতে পারেন:


Forwardable মডিউল ব্যবহার করার সময় কিছু গুরুত্বপূর্ণ পটেনশিয়াল ড্রব্যাক বিবেচনা করতে হবে:

  • প্রথমে, নিশ্চিত করুন যে টার্গেট অবজেক্ট ডেলিগেশন ব্যবহার করার আগে ইনিশিয়ালাইজড হয়েছে। অন্যথায়, আপনি এরর সম্মুখীন হবেন।
  • দ্বিতীয়, ডেলিগেশনের অতি ব্যবহার কোড রিডেবিলিটিতে পটেনশিয়াল কনফিউশন লেয়েতে পারে, কারণ অСудৃশ্য হতে পারে কোন মেথড ক্লাসের এবং কোনগুলো ডেলিগেটেড।
  • শেষে, Forwardable ব্যবহার করলে ডায়রেক্ট মেথড কলের তুলনায় একটি স্লাইট পারফরম্যান্স ওভারহেড হতে পারে। তবে, অধিকাংশ অ্যাপ্লিকেশনে এই ওভারহেড নগণ্য।

Forwardable মডিউল সম্পর্কে আরও গভীর ইনফরমেশনের জন্য, Forwardable ডকুমেন্টেশন দেখুন।

রেলস অ্যাপ্লিকেশনের জন্য ActiveSupport::Delegate

ActiveSupport::Delegate রেলস দ্বারা প্রদান একটি ডেলিগেশন ইউটিলিটি, যা অ্যাসোসিয়েটেড অবজেক্টে মেথড ডেলিগেট করার জন্য একটি কনসাইস সিনট্যাক্স অফার করে। যেহেতু এটি রুবির বিল্ট-ইন Forwardable মডিউলের সাথে সাদৃশ্য রেখেছে, ActiveSupport::Delegate কিছু অ্যাডিশনাল অপশন এবং ফিচার অফার করে যা রেলস অ্যাপ্লিকেশনের জন্য টেইলরড।

ActiveSupport::Delegate ব্যবহার করতে, আপনার ক্লাসে delegate মেথড কল করুন এবং ডেলিগেট করা মেথড(গুলো) স্পেসিফাই করুন টার্গেট অবজেক্টসহ। চলুন Printer এবং Formatter উদাহরণটি রিভিজিট করি এবং ActiveSupport::Delegate ব্যবহার করে ডেলিগেশন ইমপ্লিমেন্ট করি:


ActiveSupport::Delegate কিছু অ্যাডিশনাল অপশন এবং ফিচার অফার করে যা বিভিন্ন সিনেরিওতে উপযোগী হতে পারে। উদাহরণস্বরূপ, আপনি :prefix অপশন ব্যবহার করতে পারেন ডেলিগেটেড মেথডের সামনে একটি প্রিফিক্স প্রিপেন্ড করতে। আপনি যদি একসাথে একাধিক মেথড ডেলিগেট করতে চান, তবে সেগুলো to: অপশনের আগে লিস্ট করুন:


এটি Printer ক্লাসে formatter_format, formatter_bold, এবং formatter_italic মেথড জেনারেট করবে, Formatter ক্লাসের সংশ্লিষ্ট মেথডগুলোর দিকে ডেলিগেট করে।

ActiveSupport::Delegate রিয়েল-ওয়ার্ল্ড রেলস প্রজেক্টে কমনলি ব্যবহার হয় অ্যাসোসিয়েটেড মডেল বা অবজেক্টের মাঝপথে মেথড ডেলিগেট করার জন্য। উদাহরণস্বরূপ, আপনার যদি একটি User মডেল থাকে যেটা একটি organization-এ belongs_to করে, তবে আপনি organization মডেল থেকে name মেথড User মডেলে এইভাবে ডেলিগেট করতে পারেন:


এটি আপনাকে অর্গানাইজেশনের নাম এক্সেস করতে দেয় একটি ইউজার অবজেক্ট দিয়ে: user.organization_name।

উপসংহারে, ActiveSupport::Delegate রেলস অ্যাপ্লিকেশনের জন্য একটি পাওয়ারফুল টুল যা মেথড ডেলিগেশনের জন্য কনসাইস এবং এক্সপ্রেসিভ ডেলিগেশন এনাবল করে। এর অ্যাডিশনাল অপশন এবং ফিচার লিভারেজ করে, আপনি মেইনটেইনেবল এবং ভালো অর্গানাইজড কোড তৈরি করতে পারেন যা অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং-এর সিদ্ধান্তগুলো মেনে রেলস প্রজেক্টের কনটেক্সটে চলে।

ActiveSupport::Delegate এবং সকল উপলব্ধ অপশন সম্পর্কে আরও গভীর ইনফরমেশনের জন্য, রেলস ActiveSupport ডকুমেন্টেশন দেখুন।

ডেলিগেশন টেকনিক্স তুলনা

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

Forwardable মডিউল, যা রুবিতে বিল্ট-ইন, মেথড ডেলিগেট করার একটি আরও স্ট্রিমলাইনড পদ্ধতি অফার করে। def_delegator এবং def_delegators মেথড ব্যবহার করে, আপনি এক বা একাধিক মেথড কনসাইসলি ডেলিগেট করতে পারেন।

ActiveSupport::Delegate, রেলসের ActiveSupport লাইব্রেরির অংশ, মেথড ডেলিগেশন হ্যান্ডেল করার একটি ডিক্লেরেটিভ পদ্ধতি প্রদান করে। একটি ক্লিন সিনট্যাক্স এবং প্রিফিক্সিং-এর মত অ্যাডিশনাল অপশন সহ, এটি একটি এক্সপ্রেসিভ টুল রেলস কনটেক্সটে। এক্সপ্লিসিট ডেলিগেশনের সাথে তুলনায়, ActiveSupport::Delegate আরও এক্সপ্রেসিভ এবং কম ভার্বোজ, বিশেষ করে একাধিক মেথড ডেলিগেট করার সময়। তবে, এটি রেলস রিকোয়ার করে, তাই নন-রেলস রুবি প্রজেক্টের জন্য উপযোগী নয়।

একটি ডেলিগেশন টেকনিক বেছে নেওয়া আপনার স্পেসিফিক নিডস এবং অ্যাপ্লিকেশনের ওপর নির্ভর করে। এক্সপ্লিসিট ডেলিগেশন সিমপ্লিসিটি এবং ক্ল্যারিটি অফার করে, Forwardable মডিউল একটি আরও স্ট্রিমলাইনড অ্যাপ্রোচ প্রদান করে, এবং ActiveSupport::Delegate একটি পাওয়ারফুল, রেলস-স্পেসিফিক সমাধান অফার করে। এই অপশনগুলো বুঝতে আপনাকে আপনার প্রজেক্ট এবং কোডিং স্টাইলের জন্য সেরা টেকনিক বেছে নেওয়া দেয়।

শেষ কথা

এক্সপ্লিসিট ডেলিগেশন থেকে বিল্ট-ইন Forwardable মডিউল বা রেলস-স্পেসিফিক ActiveSupport::Delegate ব্যবহার করা—প্রতিটি টেকনিক তার নিজস্ব বেনিফিট এবং পটেনশিয়াল ড্রব্যাক অফার করে। আপনার কনটেক্সট, আপনার প্রজেক্টের প্রকৃতি, এবং আপনার পারসোনাল কোডিং স্টাইলের ওপর নির্ভর করে আপনি কোন টেকনিক বেছে নেবেন।

এই টেকনিকগুলো বুঝতে আপনার রুবি প্রোগ্রামিং স্কিলস ব্রডেন করে না, বরং আপনাকে আরও মডুলার, রিডেবল, এবং মেইনটেইনেবল কোড লিখতে সক্ষম করে। এই জ্ঞান সহ, আপনি জটিল সমস্যা সমাধান করার জন্য আরও ভালো প্রস্তুত, এলোকোয়েন্ট ডিজাইন সহ।

হ্যাপি ডেলিগেটিং!

P.S. রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होते সাথে পেতে চাইলে আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একটিও পোস্ট মিস করবেন না!

রুবিতে মেথড ডেলিগেশন মস্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

জেফ মরহাউস

আমাদের অতিথি লেখক জেফ মরহাউস একজন সফটওয়্যার ইঞ্জিনিয়ার যিনি কোড লিখেন এবং বাগ ফিক্স করেন পেশেন্টদের তাদের মেডিকেশন পাওয়া নিশ্চিত করতে। এই দিনসে তিনি রুবি অন রেলস দিয়ে ওয়েব অ্যাপ্লিকেশন বানাতে ফোকাসড, কিন্তু অতীতে তিনি Swift, Java, এবং Kotlin ব্যবহার করেছেন iOS এবং Android ডেভেলপমেন্টের জন্য।

জেফ মরহাউসের সকল আর্টিকেল

  1. CSS এবং জাভাস্ক্রিপ্ট দিয়ে ডার্ক/লাইট মোড টগল করা

  2. জেটপ্যাক বনাম ওয়ার্ডফেন্স: আপনার ওয়ার্ডপ্রেস সাইটের জন্য সেরা সিকিউরিটি প্লাগইন বেছে নেওয়া

  3. নোটিফিকেশন ইন্টেন্টে নতুন ইন্টেন্ট বানাতে না যেতে Resume করা

  4. ৩D numpy অ্যারে থেকে Matplotlib-এ ৩D প্লট তৈরি করুন