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

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

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

আপনি শিখবেন কীভাবে delegate মেথড, Forwardable মডিউল এবং SimpleDelegator ক্লাস ব্যবহার করবেন।

আমাদের কেন ডেলিগেশন দরকার?

অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং-এ, ক্লাসগুলো একসাথে কাজ করার দুটি উপায় আছে।

তোইলো:

  • ইনহেরিটেন্স
  • কম্পোজিশন

ইনহেরিটেন্সে, আপনি ক্লাস হায়ারার্কি তৈরি করেন, যেখানে একটি পেরেন্ট ক্লাস মেথড, কনস্ট্যান্ট এবং ইনস্ট্যান্স ভেরিয়েবল ডেফিনিশন যেকোনো ক্লাসের সাথে শেয়ার করে যা সেটি থেকে ইনহেরিট করে।

উদাহরণস্বরূপ:

রুবিতে, প্রতিটি অবজেক্ট ডিফল্টভাবে Object ক্লাস থেকে ইনহেরিট করে।

সেজন্য আপনাকে puts, class এবং object_id এর মত মেথড অ্যাক্সেস मिलে।

কম্পোজিশনে একটি ক্লাস অন্য ক্লাস থেকে অবজেক্ট তৈরি করে (বা দেওয়া হয়)… তারপর সেটি এই অবজেক্টগুলো ব্যবহার করে কাজ তাদের तरफ ডেলিগেট করে।

উদাহরণস্বরূপ:

একটি কম্পিউটার অনেক পার্ট (অবজেক্ট) দিয়ে বানানো হয় এবং প্রতিটি পার্ট একটা জিনিস ভালোভাবে জানে।

আপনি যদি স্ক্রিনে কিছু রেন্ডার করতে চান তবে কম্পিউটার গ্রাফিক্স কার্ডকে বলবে কী দেখাতে হবে, কিন্তু কীভাবে করবে সেটি না।

এইটিই কম্পোজিশন!

কিন্তু আপনি যদি কম্পিউটার হন এবং আপনি গ্রাফিক্স কার্ডের মেথডগুলোর অ্যাক্সেস দিতে চান?

আপনাকে তাদের মধ্যে একটি种 “ব্রিজ” বানাতে হবে।

আসুন দেখি কীভাবে করা যায়।

রুবি মেথড ডেলিগেশন – উদাহরণ

আমাদের দুটি ক্লাস আছে:

  • Computer
  • Memory

নিচের কোড দেওয়া আছে:

 class Computer def initialize @memory = Memory.new end end class Memory def initialize @data = [] end def write(data) @data << data end def read(index) @data[index] end end computer = Computer.new 

আমরা মেমরি অ্যাক্সেস করতে চাই শুধু Computer দিয়ে।

এটি অনেক কারণের জন্য হতে পারে:

  • আপনার কাছে শুধু ১টি মেমরি ইউনিট আছে, মানে আপনি শুধু ১টি মেমরি অবজেক্ট চান। একটিতে অ্যাক্সেস সেন্ট্রালাইজ করে আপনি এটিও অর্জন করতে পারেন।
  • আপনি কে মেমরি অ্যাক্সেস করতে পারে (বিভিন্ন অ্যাপ্লিকেশন) এবং মেমরির কোন পার্টস ব্যবহার করতে পারে সেটি কন্ট্রোল করতে চান।
  • আপনি সিকিউরিটি বা ডিবাগিং এর জন্য প্রতিটি মেমরি অ্যাক্সেস লগ করতে চান।

এখন, আপনি যদি এটি করার চেষ্টা করেন:

 computer.write("rubyguides") 

এটি NoMethodError দিয়ে ফেইল করবে কারণ Computer-এ কোনো write মেথড নেই।

 undefined method `write' for # (NoMethodError) 

Computer ক্লাসটি নही জানে আপনি write দিয়ে কী বোঝাচ্ছেন।

যদি না…

আপনি একটি write মেথড তৈরি করেন!

এখানে কীভাবে:

 class Computer def initialize @memory = Memory.new end def write(data) @memory.write(data) end def read(index) @memory.read(index) end end 

আমরা রিকোয়েস্টগুলো @memory অবজেক্টের দিকে পাস করছি।

এইটিই মেথড ডেলিগেশন।

নোট: এটি এই মেথডগুলো আপনার পাবলিক ইন্টারফেসের অংশ করে তোলে (সেগুলো সবার জন্য উপলব্ধ হয়) এবং আপনি সবসময় সেটি চাইবেন না।

মেথড ডেলিগেশনের জন্য কি কোনো শর্টকাট নেই?

হ্যাঁ!

আসুন দেখি…

Forwardable মডিউল কীভাবে ব্যবহার করবেন

এখন:

আপনি রুবি সাথে आनेवाले Forwardable মডিউল ব্যবহার করতে পারেন ডেলিগেটর মেথড ডিফাইন করতে।

এটি এভাবে কাজ করে:

 require 'forwardable' class Computer extend Forwardable def_delegators :@memory, :read, :write def initialize @memory = Memory.new end end 

এটি আপনাকে আমরা আগে তৈরি করেছিলাম সেসব মেথড সরাতে দেয় এবং একই কাজ করবে।

Forwardable মেথড আর্গুমেন্টস (ব্লক সহ!) হ্যান্ডেল করে আপনার জন্য, তাই আপনাকে সেটি নিয়ে চিন্তা করতে হয় না।

খুব নাইস, সেটা না? 🙂

রেলস Delegate মেথড কীভাবে ব্যবহার করবেন

আপনি যদি রেলস ব্যবহার করেন, বা ActiveSupport gem একলা, তবে আপনার delegate মেথডের অ্যাক্সেস আছে।

এটি এভাবে কাজ করে:

 class Computer delegate :read, :write, to: :@memory def initialize @memory = Memory.new end end 

delegate মেথড একটি prefix আর্গুমেন্ট নেয়, যা আপনাকে মেথড নামের সাথে একটি প্রিফিক্স অ্যাপেন্ড করতে দেয়।

উদাহরণ:

 class Computer delegate :read, :write, prefix: "memory", to: :@memory def initialize @memory = Memory.new end end 

ফলাফলে দুটি মেথড:

  • memory_read
  • memory_write

SimpleDelegator দিয়ে সবকিছু ডেলিগেট করা

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

কিন্তু আপনি যদি একটি অবজেক্ট র‍্যাপ করে এর সব মেথড এক্সপোজ করতে চান…

আপনি SimpleDelegator ক্লাস ব্যবহার করতে পারেন!

এখানে কীভাবে:

 require 'delegate' class CoolArray < SimpleDelegator end cool = CoolArray.new([]) cool << "ruby" cool << "gems" p cool 

এখন CoolArray আপনি new-এ পাস করা অবজেক্টের মত behave করে।

এটি কেন উপকারী?

আপনি এই অবজেক্টে নতুন মেথড যোগ করতে পারেন, অরিজিনাল ক্লাস পরিবর্তন ছাড়া।

ভিডিও টিউটোরিয়াল

সারসংক্ষেপ

আপনি রুবিতে অবজেক্ট কম্পোজিশন এবং বিভিন্ন টেকনিক দিয়ে মেথড ডেলিগেট করা শিখেছেন!

আপনি যদি এই আর্টিকেলটি উপভোগ করেন তবে আপনার রুবি বন্ধুদের সাথে শেয়ার করুন।

পড়ার জন্য ধন্যবাদ 🙂


  1. রুবি মেথড ব্যাখ্যা: কাস্টম ফাংশন সহজে তৈরি করুন

  2. রুবি মাস্টারিং: মেথড এলিয়াস তৈরি করার জন্য Alias কিওয়ার্ড ব্যবহার

  3. Ruby-এ TracePoint দিয়ে মেথড ট্রেস করা: একটি ব্যবহারিক গাইড

  4. রুবি অ্যারে 습득: প্র্যাক্টিক্যাল উদাহরণ এবং অপরিহার্য মেথডগুলো