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

রুবির Private ও Protected মেথড মাস্টারিং: সুরক্ষিত, রক্ষণাবেক্ষণযোগ্য কোডের জন্য

রুবিতে প্রাইভেট মেথড কী?

এটি একটি মেথড টাইপ যা আপনি শুধু সেটি যেখানে ডিফাইন করা হয়েছে সেই ক্লাসের ভিতরে থেকে কল করতে পারেন।

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

একটি রুবি মেথড হতে পারে:

  • private
  • public (ডিফল্ট)
  • protected

ডিফল্টভাবে আপনার সকল মেথড public।

কারোই সেগুলো ব্যবহার করতে পারে!

কিন্তু আপনি এটিকে পরিবর্তন করতে পারেন, একটি মেথডকে private বা protected বানিয়ে।

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

কারণ আপনি এই মেথডগুলোকে সহজে পরিবর্তন করতে পারেন।

কল্পনা করুন আপনি একটি কোড লাইব্রেরি লিখছেন যা অফিসে কয়েকটি ভিন্ন প্রজেক্টে ব্যবহার হবে।

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

এখন:

আপনি একটি নতুন ভার্সন রিলিজ করলেন…

কিন্তু আপনি একটি public মেথডের নাম পরিবর্তন করার সিদ্ধান্ত নিয়েছেন।

এটি এই মেথড ব্যবহারকারী প্রতিটি প্রজেক্টে এরর উৎপন্ন করবে!

এটি মনে রাখুন:

কম পাবলিক মেথড রাখা আপনার ক্লাসের ভিতরে পরিবর্তনের স্বাধীনতা বাড়ায়।

কয়েকটি কোড উদাহরণ দেখি!

রুবিতে Private মেথড বোঝা

আপনি কি কখনো “private method called” এরর মেসেজ দেখেছেন?

এইটি:

 self.puts 123 # NoMethodError: private method `puts' called 

তবে আপনি একটি private মেথড ভুলভাবে ব্যবহার করার চেষ্টা করেছেন।

আপনি একটি প্রাইভেট মেথড শুধু তার নিজের মাধ্যমে ব্যবহার করতে পারেন।

উদাহরণ:

 puts 123 

এটি একই মেথড, কিন্তু আপনাকে এভাবে কল করতে হবে।

প্রাইভেট মেথড সবসময় self-এর কন্টেক্সটে কল করা হয়।

অন্য কথায়…

আপনি প্রাইভেট মেথড শুধু ব্যবহার করতে পারেন:

  • এই ক্লাসের অন্যান্য মেথডের সাথে
  • পেরেন্ট ক্লাস থেকে ইনহেরিট করা মেথড
  • একটি মডিউল থেকে ইনক্লুড করা মেথড

এর মানে আপনি প্রাইভেট মেথড ক্লাসের বাইর থেকে কল করতে পারবেন না যা সেটি ডিফাইন করেছে।

কারণ এটিতে একটি “এক্সপ্লিসিট রিসিভার” লাগবে।

যদি না…

আপনি send এর মত একটি মেথড ব্যবহার করে এই নিয়ম বাইপাস করেন।

 send(:puts, "apple") 

আপনি কীভাবে একটি private মেথড ডিফাইন করেন?

এভাবেই:

 def bacon "private bacon" end private :bacon 

শব্দ private নিজে একটি কিওয়ার্ড নয়, এটি Kernel মডিউলে সংজ্ঞায়িত একটি মেথড।

আপনার প্রাইভেট মেথড কোথায় রাখবেন

একটি ক্লাসের একাধিক প্রাইভেট মেথড থাকা স্বাভাবিক।

আপনি এই মেথডগুলো কোথায় রাখবেন?

এইভাবে করুন:

 class Food def public_method end private def bacon end def orange end def coconut end end 

private-এর পরে প্রতিটি ইনস্ট্যান্স মেথড একটি প্রাইভেট মেথড হয়ে যায়।

আপনি private_class_method :method_name ব্যবহার করতে পারেন আপনি যদি একটি ক্লাস মেথডকে প্রাইভেট ডিফাইন করতে চান

এটি একটি সাধারণ প্যাটার্ন: সব পাবলিক মেথড আগে ডিফাইন করুন, তারপর আপনার private মেথডগুলো একসাথে ক্লাসের শেষে ডিফাইন করুন।

পাবলিক মেথড

Public রুবিতে ডিফল্ট মেথড ভিজিবিলিটি।

এখানে একটি উদাহরণ:

 def orange "Vitamin C" end 

আপনার কাছে একটি অবজেক্ট food আছে যা orange ডিফাইন করে, আপনি এটিকে এভাবে কল করতে পারেন:

 food.orange 

যদি একটি মেথডকে প্রাইভেট বা প্রোটেক্টেড বানানো হয়, আপনি আবার এটিকে পাবলিক করতে পারেন।

এভাবেই:

 public :orange 

Protected মেথড কী?

Protected মেথড কম পাওয়া যায়।

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

আপনি এই উদাহরণটি প্রাইভেট দিয়ে ট্রাই করলে এরর পাবেন:

 class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :name end food = Food.new("chocolate") puts food == food 

আপনি এরর পাবেন কারণ name প্রাইভেট হতো তাই আপনি other.name করতে পারতেন না।

কিন্তু protected-এ এই কোড কাজ করে!

Private বনাম Protected মেথড

পার্থক্যটি হলো, protected মেথডকে private রেখে, কিন্তু এটি আপনাকে সেই মেথডকে একটি অবজেক্টে কল করতে দেয়।

প্রাইভেট-এ আপনি শুধু name করতে পারেন, প্রোটেক্টেড-এ আপনি object.name করতে পারেন।

আপনি কখন প্রোটেক্টেড ব্যবহার করবেন?

শুধু যদি আপনার খুব নির্দিষ্ট কেস থাকে, যেন ইকুয়ালস (==) মেথড।

রুবি ডকুমেন্টেশন প্রাইভেট ব্যবহার করার পরামর্শ দেয় প্রোটেক্টেডের বদলে যতটা সম্ভব।

এবং এই নোটটি আছে:

“A protected method is slow because it can’t use inline cache.”

আমি এইเรื่องে কিউরিয়াস ছিলাম তাই কয়েকটি বেঞ্চমার্ক চালিয়েছিলাম:

 public: 2813891.9 i/s private: 2699273.8 i/s protected: 2572122.0 i/s 

এটাতে ৮.৫% পারফরম্যান্স পার্থক্য।

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

সারসংক্ষেপ

আপনি রুবি মেথড ভিজিবিলিটি, পাবলিক, প্রাইভেট এবং প্রোটেক্টেড মেথড সম্পর্কে শিখেছেন। এইগুলো রুবি কিওয়ার্ড নয়, এগুলো Module ক্লাসে সংজ্ঞায়িত মেথড নিজে।

দয়া করে এই পোস্টটি শেয়ার করুন যাতে আরও মানুষ এই টপিক বুঝতে পারে!

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


  1. রুবি দিয়ে ইন্সারশন সর্টিং দক্ষতা অর্জন: ধাপে ধাপে গাইড

  2. রুবির Gsub মেথডের ৩টি শক্তিশালী ব্যবহার

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

  4. রুবির Freeze মেথড বোঝা: অবজেক্ট মিউটেবিলিটি ব্যাখ্যা