উইকিপিডিয়ার মতে, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) হল "অবজেক্ট" এর ধারণার উপর ভিত্তি করে একটি প্রোগ্রামিং প্যারাডাইম, যাতে ডেটা এবং কোড থাকতে পারে:ফিল্ড আকারে ডেটা (প্রায়শই অ্যাট্রিবিউট বা বৈশিষ্ট্য হিসাবে পরিচিত) এবং কোড আকারে পদ্ধতির (প্রায়শই পদ্ধতি হিসাবে পরিচিত)।
রুবি একটি বিশুদ্ধ বস্তু-ভিত্তিক ভাষা, যার মানে রুবি ভাষায়, সবকিছুই একটি বস্তু। এই বস্তুগুলি, সেগুলি স্ট্রিং, সংখ্যা, শ্রেণী, মডিউল ইত্যাদি যাই হোক না কেন, The অবজেক্ট মডেল নামে একটি সিস্টেমে কাজ করে .
রুবি object_id
নামে একটি পদ্ধতি অফার করে , যা সমস্ত বস্তুর জন্য উপলব্ধ। এই শনাক্তকারী একটি পূর্ণসংখ্যা প্রদান করে এবং কোন দুটি বস্তুর জন্য একই হয় না। আসুন আমাদের হাত নোংরা করতে irb-এ যাই; আপনি irb
টাইপ করে এটি করতে পারেন আপনার টার্মিনালে।
উপরে দেখা গেছে, স্ট্রিং, পূর্ণসংখ্যা, অ্যারে, ক্লাস এবং এমনকি পদ্ধতিগুলি হল সমস্ত বস্তু, কারণ তাদের একটি অবজেক্ট আইডি রয়েছে।
এই নিবন্ধে, আমরা নিম্নলিখিত ধারণাগুলি বিস্তারিতভাবে কভার করব:
- ক্লাস এবং দৃষ্টান্ত
- উত্তরাধিকার
- সর্বজনীন, ব্যক্তিগত, এবং সুরক্ষিত পদ্ধতি
- মিক্সিনস
- মডিউল
- বস্তু অনুক্রম
ক্লাস এবং দৃষ্টান্ত
রুবিতে, ক্লাসগুলি হল যেখানে একটি বস্তুর বৈশিষ্ট্য এবং মনোভাব (ক্রিয়া) সংজ্ঞায়িত করা হয়। যদি একটি বস্তু বৃত্তাকার হয় (একটি বৈশিষ্ট্য) এবং কথা বলতে সক্ষম হওয়া উচিত (একটি ক্রিয়া), আমরা এটি যে শ্রেণির অন্তর্গত তা থেকে বলতে পারি কারণ এই বৈশিষ্ট্যগুলি এবং ক্রিয়াগুলিকে পদ্ধতি বলে কিছু হিসাবে সংজ্ঞায়িত করা হয় সেই ক্লাসে। একটি ক্লাসের অন্তর্গত একটি বস্তুকে উদাহরণ বলা হয় সেই ক্লাসের এবং .new
ব্যবহার করে তৈরি করা হয়েছে (তাত্ক্ষণিক) . চলুন শুরু করা যাক Human
নামে একটি ক্লাস তৈরি করে . আমি মনে করি আমরা সবাই মানুষ, তাই এটি মজাদার হওয়া উচিত।
class Human
def initialize(name)
@name = name
end
end
শুরু করা পদ্ধতিটি একটি ক্লাসের একটি নতুন উদাহরণ তৈরি করার প্রয়োজনীয়তা চিহ্নিত করে। উপরের ক্ষেত্রে, আমরা দেখতে পাচ্ছি যে একটি নতুন মানুষ তৈরি করতে, একটি নাম প্রয়োজন। তাই, Human.new(name)
কমান্ড ব্যবহার করে মানুষের একটি নতুন উদাহরণ তৈরি করা যেতে পারে , যেখানে নাম আপনি যা চয়ন করুন. আমাদের ক্ষেত্রে, আসুন 'হেনরি' ব্যবহার করি। আমাদের irb পরিবেশে এটি পরীক্ষা করার জন্য, আমাদের যা করতে হবে তা হল load './path_to_filename'
কমান্ডটি ব্যবহার করে ফাইলটি লোড করুন। এবং যখনই পরিবর্তন করা হয় তখন ফাইল পুনরায় কার্যকর করার জন্য কমান্ড পুনরায় ব্যবহার করুন। আমার ক্ষেত্রে, এটি load './Human.rb'
কারণ irb উল্লিখিত ফাইল ধারণকারী ফোল্ডারে খোলা হয়। irb ছাড়া কোড চালানোর জন্য, আমাদের একটি puts
যোগ করতে হবে প্রতিটি কমান্ডের আগে বিবৃতি যাতে ফলাফল দৃশ্যমান হয়।
যখন আমরা একটি নাম ছাড়া একটি নতুন মানুষ তৈরি করার চেষ্টা করি, তখন আমরা একটি আর্গুমেন্ট ত্রুটি পাই কারণ একটি নাম প্রয়োজন৷ যাইহোক, যখন আমরা এটি সঠিকভাবে করি, তখন আমরা দেখতে পাই যে হেনরি নামের মানবটি তৈরি হয়েছে এবং এটি Human
শ্রেণীর অন্তর্গত। . হেনরি তাই Human
শ্রেণীর একটি উদাহরণ .
@name
@
এর কারণে ভেরিয়েবলকে ইনস্ট্যান্স ভেরিয়েবল বলা হয় চিহ্ন দিয়ে এটি শুরু হয়, যার অর্থ হল এই ভেরিয়েবলটি ক্লাসের মধ্যে অন্য কোনও পদ্ধতির দ্বারা উল্লেখ করা যেতে পারে, যতক্ষণ না প্রশ্নে ক্লাসের উদাহরণ বিদ্যমান থাকে। এখানে, আমরা এটি তৈরি করেছি এবং এটিকে সেই নামের সমান সেট করেছি যা দিয়ে বস্তুটি শুরু করা হয়েছিল।
আসুন এই শ্রেণীর অন্তর্গত যেকোন বস্তুর বৈশিষ্ট্য এবং ক্রিয়া সংজ্ঞায়িত করা যাক। যেহেতু তৈরি করা বস্তুগুলিকে ক্লাসের দৃষ্টান্ত বলা হয়, তাই যে পদ্ধতিগুলি তাদের আচরণকে সংজ্ঞায়িত করে সেগুলিকে ইনস্ট্যান্স পদ্ধতি বলা হয় . মানুষের একটি নাম এবং শরীরের নির্দিষ্ট অঙ্গ রয়েছে এবং তারা নির্দিষ্ট ক্রিয়া সম্পাদন করতে পারে, তাই আসুন তাদের সংজ্ঞায়িত করি।
def name
@name
end
def no_of_legs
2
end
def no_of_hands
2
end
def speak
'blablabla'
end
আমরা এমন পদ্ধতি যুক্ত করেছি যা সৃষ্ট মানুষের নাম পুনরুদ্ধার করে, একজন মানুষের পা এবং হাতের সংখ্যা নির্ধারণ করে এবং মানুষকে কথা বলার ক্ষমতা দেয়। আমরা instance.method_name
ব্যবহার করে ক্লাস ইনস্ট্যান্সে এই পদ্ধতিগুলিকে কল করতে পারি , নীচে দেখানো হিসাবে।
যদি আমরা আমাদের মন পরিবর্তন করি এবং সিদ্ধান্ত নিই যে আমরা আমাদের ক্লাসের উদাহরণ হেনরির নাম পরিবর্তন করতে চাই। রুবির একটি অন্তর্নির্মিত পদ্ধতি রয়েছে যার সাহায্যে আমরা এটি করতে পারি তবে এটি ম্যানুয়ালিও করা যেতে পারে। ম্যানুয়ালি, আমরা আমাদের নামের পদ্ধতিকে শুধুমাত্র একটি গেটার পদ্ধতি থেকে পরিবর্তন করতে পারি যা নামটিকে একটি সেটার পদ্ধতিতে পরিণত করে যেটি একটি প্রদান করা হলে এটিকে একটি মান নির্ধারণ করে।
def name=(new_name)
@name = new_name
end
রুবির বিল্ট-ইন attr_accessor
ব্যবহার করে পদ্ধতি, আমরা আমাদের নামের পদ্ধতিটি বাতিল করে দিতে পারি এবং attr_accessor :name
লাইন দিয়ে প্রতিস্থাপন করতে পারি :
class Human
attr_accessor :name
def initialize(name)
@name = name
end
# rest of the code
end
বেছে নেওয়া পদ্ধতি যাই হোক না কেন, দিনের শেষে এটাই পাওয়া যায়।
এখন পর্যন্ত তৈরি করা সমস্ত পদ্ধতিকে বলা হয় instance methods
কারণ তাদের ক্লাসের যেকোন উদাহরণে ডাকা যেতে পারে কিন্তু ক্লাসে নয়। class method
নামেও কিছু আছে , যা ক্লাসে কল করা যেতে পারে এবং এর উদাহরণে নয়। self.
দিয়ে পদ্ধতির নামের উপসর্গ দিয়ে ক্লাস পদ্ধতির নামকরণ করা হয় . এখানে একটি উদাহরণ:
# within the Human class
def self.introduction
"I am a human, not an alien!"
end
আমরা উপরে দেখতে পাচ্ছি, ক্লাস পদ্ধতিটি শুধুমাত্র ক্লাসের জন্য উপলব্ধ এবং এর উদাহরণ নয়। উপরন্তু, যেমন ইনস্ট্যান্স ভেরিয়েবল বিদ্যমান, তেমনি আমাদের ক্লাস ভেরিয়েবল আছে, যেগুলো দুটি @
দিয়ে প্রিফিক্স করা আছে। প্রতীক একটি উদাহরণ নীচে দেখানো হয়েছে৷
class Human
attr_accessor :name
@@no_cars_bought = 0 #class variable
def initialize(name)
@name = name
end
def self.no_cars_bought
@@no_cars_bought
end
def buy_car
@@no_of_cars_bought += 1
"#{@name} just purchased a car"
end
end
এই উদাহরণে, আমরা একটি buy_car
যোগ করেছি প্রতিটি মানুষকে একটি গাড়ি কিনতে সক্ষম করার পদ্ধতি। আমরা @@no_of_cars_bought
নামে একটি ক্লাস ভেরিয়েবলও তৈরি করেছি যা প্রতিবার একটি গাড়ি কেনার সময় 1 দ্বারা বৃদ্ধি পায়। অবশেষে, আমরা no_cars_bought
নামে একটি ক্লাস পদ্ধতি তৈরি করেছি যে গাড়ির সংখ্যা কেনা হয়েছে। দেখা যাক কিভাবে এটি কাজ করে:
এখন পর্যন্ত সংজ্ঞায়িত সমস্ত পদ্ধতি পাবলিক নামে পরিচিত পদ্ধতি কারণ তারা ক্লাসের বাইরে অ্যাক্সেসযোগ্য। আমরা ব্যক্তিগত নামক পদ্ধতিগুলিকেও সংজ্ঞায়িত করতে পারি পদ্ধতি, যা শুধুমাত্র একটি ক্লাসের মধ্যে অ্যাক্সেস করা যেতে পারে। আসুন একটি উদাহরণ চেষ্টা করি।
# at the bottom of the Human class
def say_account_number
"My account number is #{account_number}"
end
private
def account_number
"1234567890"
end
এটি নিম্নলিখিত ফল দেয়:
যখন আমরা henry.account_number
কল করি , আমরা একটি "NoMethodError" পাই কারণ account_number
একটি ব্যক্তিগত পদ্ধতি যা শুধুমাত্র ক্লাসের মধ্যে থেকে অ্যাক্সেস করা যেতে পারে। say_account_number
এর মাধ্যমে অ্যাক্সেস করা হলে পদ্ধতিটি যেমন আমরা করেছি, সেখানে কোনও ত্রুটি নেই, কারণ এই পদ্ধতিটি ব্যক্তিগত পদ্ধতির মতো একই শ্রেণীর মধ্যে বিদ্যমান। এটা মনে রাখা গুরুত্বপূর্ণ যে private
এর পরে প্রতিটি উদাহরণ পদ্ধতি কীওয়ার্ড একটি ব্যক্তিগত পদ্ধতিতে পরিণত হয়; তাই, সমস্ত পাবলিক পদ্ধতির পরে ব্যক্তিগত পদ্ধতিগুলিকে ক্লাসের নীচে সংজ্ঞায়িত করা উচিত।
আপনি কি কখনও সুরক্ষিত শুনেছেন৷ পদ্ধতি? হ্যাঁ ঠিক! এগুলিও বিদ্যমান, কিন্তু আমরা উত্তরাধিকার ধারণাটি বোঝার পরে সেগুলি সম্পর্কে কথা বলব৷ .
উত্তরাধিকার
এখন যেহেতু আমরা ক্লাস এবং দৃষ্টান্ত সম্পর্কে জানি, আসুন উত্তরাধিকার সম্পর্কে কথা বলা যাক . উত্তরাধিকারের ধারণাটি সঠিকভাবে বোঝার জন্য, আসুন একটি নতুন ক্লাস তৈরি করি যার নাম Mammal
যেহেতু মানুষ স্তন্যপায়ী। আমি বিজ্ঞান ক্লাসে একটি নির্দিষ্ট বাক্যাংশ স্মরণ করি:"সকল মানুষই স্তন্যপায়ী, কিন্তু সমস্ত স্তন্যপায়ী মানুষ নয়"। আমি আরও স্মরণ করি যে স্তন্যপায়ী প্রাণীর কিছু বৈশিষ্ট্যের মধ্যে রয়েছে চুল বা পশমের উপস্থিতি এবং একটি জটিল মস্তিষ্ক। আসুন এই তথ্যটি Mammal
-এ রাখি ক্লাস।
class Mammal
def has_hair?
"Most certainly, Yes"
end
def has_complex_brain?
"Well, as a mammal, what do you expect?"
end
end
আপনি কি আমার বিজ্ঞান ক্লাস বাক্যাংশ মনে আছে? যদি তাই হয়, এটা গুরুত্বপূর্ণ যে আমরা একটি সম্পর্ক তৈরি করি যা এই বিবৃতিটিকে বৈধ করে। তাই আমরা কি কাজ করতে পারি? আমরা মানব শ্রেণীকে Mammal
এর বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে প্রাপ্ত করার অনুমতি দিই < Mammal
যোগ করে শ্রেণী এর শ্রেণী সংজ্ঞাতে।
class Human < Mammal
# all other code
end
যে শ্রেণী অন্যের বৈশিষ্ট্য উত্তরাধিকার সূত্রে প্রাপ্ত হয় তাকে সাবক্লাস বলে , এবং এটি যে শ্রেণী থেকে উত্তরাধিকারসূত্রে প্রাপ্ত হয় তাকে বলা হয় সুপারক্লাস . আমাদের ক্ষেত্রে, Human
সাবক্লাস এবং Mammal
সুপারক্লাস হয়। এই মুহুর্তে এটি লক্ষ্য করা গুরুত্বপূর্ণ যে আপনি যদি একটি ফাইলে সমস্ত ক্লাস সংজ্ঞায়িত করেন যেমন আমরা এখন করছি, Mammal
Human
এর আগে ক্লাসের সংজ্ঞা আসা উচিত আপনার ফাইলে ক্লাস, যেহেতু আমরা একটি পরিবর্তনশীলকে সংজ্ঞায়িত করার আগে উল্লেখ করতে চাই না। এখন দেখা যাক মানুষের কী বাড়তি বৈশিষ্ট্য রয়েছে৷
উপরে দেখানো হিসাবে, মানুষের এখন Mammal
-এ সংজ্ঞায়িত সমস্ত বৈশিষ্ট্যের অ্যাক্সেস আছে ক্লাস যদি আমরা উত্তরাধিকার মুছে ফেলি (অর্থাৎ, আমরা < Mammal
মুছে ফেলি কোডের সেই লাইন থেকে) এবং henry.class.superclass
কমান্ডটি চালান , আমরা আমাদের প্রতিক্রিয়া হিসাবে "অবজেক্ট" পাই। এটি আমাদের বলে যে প্রতিটি ক্লাস যখন অন্য ক্লাস থেকে সরাসরি উত্তরাধিকারী হয় না তখন তার সুপারক্লাস "বস্তু" হিসাবে থাকে, যা এই সত্যটিকে আরও শক্তিশালী করে যে রুবিতে এমনকি ক্লাসগুলিও অবজেক্ট।
এখন যেহেতু আমরা সুপারক্লাসগুলি কি তা জানি, এই হল সঠিক সময় কীওয়ার্ড সুপার সম্পর্কে কথা বলার। . একটি সুপারক্লাসে ইতিমধ্যে বিদ্যমান পদ্ধতিগুলির পুনঃব্যবহার এবং পরিবর্তন সক্ষম করতে রুবি এই কীওয়ার্ডটি প্রদান করে। আমাদের Mammal
-এ সুপারক্লাস, মনে রাখবেন যে আমাদের has_hair?
নামে একটি পদ্ধতি আছে; যখনই সেই পদ্ধতিটি বলা হয় তখন আমরা যদি মানুষের জন্য নির্দিষ্ট কিছু অতিরিক্ত তথ্য যোগ করতে চাই? এখানেই সুপার কীওয়ার্ডের ব্যবহার আসে। আমাদের Human
-এ ক্লাস, আমরা একই নামের একটি পদ্ধতি সংজ্ঞায়িত করি, has_hair?
.
def has_hair?
super + ", but humans can be bald at times"
end
যখন সুপার কীওয়ার্ডটি বলা হয়, রুবি সুপারক্লাসে সেই পদ্ধতির নামটি সন্ধান করে এবং তার ফলাফল প্রদান করে। উপরের পদ্ধতিতে, আমরা সুপারক্লাসের ফলাফলে কিছু অতিরিক্ত তথ্য যোগ করেছি' has_hair?
পদ্ধতি।
রুবি শুধুমাত্র একক শ্রেণীর উত্তরাধিকার সমর্থন করে, যার মানে হল যে আপনি শুধুমাত্র একটি শ্রেণীর থেকে শ্রেণী বৈশিষ্ট্য উত্তরাধিকারসূত্রে পেতে পারেন। আমি নিশ্চিত যে আপনি ভাবছেন যে আপনি যদি আপনার ক্লাসে একটি নির্দিষ্ট শ্রেণীর জন্য নির্দিষ্ট নয় এমন একাধিক বৈশিষ্ট্য যুক্ত করতে চান তবে কী হবে। রুবি মিক্সিন আকারে এর জন্য একটি বিধানও করে , কিন্তু আমরা তাদের সম্পর্কে কথা বলার আগে, আসুন সুরক্ষিত পদ্ধতি সম্পর্কে কথা বলি .
সুরক্ষিত পদ্ধতি
সুরক্ষিত পদ্ধতিগুলি ব্যক্তিগত পদ্ধতির মতো কাজ করে যাতে সেগুলি একটি শ্রেণি এবং এর উপশ্রেণীর মধ্যে বলা যায়। চলুন Mammal
এর মধ্যে একটি সুরক্ষিত পদ্ধতি তৈরি করি ক্লাস।
#at the bottom of the Mammal class
def body_status
body
end
protected
def body
"This body is protected"
end
উপরে দেখানো হিসাবে, আমরা body
অ্যাক্সেস করতে পারি না পদ্ধতি কারণ এটি সুরক্ষিত। যাইহোক, আমরা body_status
থেকে এটি অ্যাক্সেস করতে পারি পদ্ধতি, যা Mammal
এর ভিতরের আরেকটি পদ্ধতি ক্লাস আমরা ক্লাসের সাবক্লাস থেকে সুরক্ষিত পদ্ধতিগুলি অ্যাক্সেস করতে পারি যেখানে এটি সংজ্ঞায়িত করা হয়েছে। আসুন এটি Human
এর মধ্যে চেষ্টা করি ক্লাস।
# within the Human class
def check_body_status
"Just a human checking that " + body.downcase
end
উপরে দেখানো হিসাবে, শরীরের পদ্ধতি Human
-এর মধ্যে সংজ্ঞায়িত করা হোক না কেন ক্লাস এবং সুরক্ষিত, Human
ক্লাস এটি অ্যাক্সেস করতে পারে কারণ এটি Mammal
এর একটি সাবক্লাস ক্লাস এই সাবক্লাস অ্যাক্সেস ব্যক্তিগত পদ্ধতিতেও সম্ভব; যাইহোক, এটি এই পদ্ধতিগুলির মধ্যে কি পার্থক্য বিদ্যমান তা নিয়ে প্রশ্ন তোলে।
receiver.protected_method
-এর মতো সুস্পষ্ট রিসিভার ব্যবহার করে সুরক্ষিত পদ্ধতি বলা যেতে পারে , যতক্ষণ প্রশ্ন করা রিসিভার কীওয়ার্ড self.
অথবা self.
-এর মতো একই ক্লাসে . যাইহোক, ব্যক্তিগত পদ্ধতিগুলিকে শুধুমাত্র স্পষ্ট রিসিভার ব্যবহার করে কল করা যেতে পারে যখন স্পষ্ট রিসিভার self.
হয় body.downcase
প্রতিস্থাপন করে আমাদের কোড সম্পাদনা করা যাক self.body.downcase
সহ check_body_status
-এ পদ্ধতি এবং self.
অন্তর্ভুক্ত করার জন্য আমাদের ব্যক্তিগত পদ্ধতি কল পরিবর্তন করুন .
def check_body_status
"Just a human checking that " + self.body.downcase
# body method is protected
end
def say_account_number
"My account number is #{self.account_number}"
# account_number method is private
end
P.S.:Ruby 2.7 এর আগে , self.
ব্যবহার করে কিছু তথ্য পেতে একটি ব্যক্তিগত পদ্ধতিতে কল করার সময় অসম্ভব ছিল।
চলুন এগিয়ে যাই এবং self.
শব্দটি প্রতিস্থাপন করি self.
এর মতো একই ক্লাসের একটি বস্তুর সাথে . আমাদের ক্ষেত্রে, self.
হল Henry
, যারা পদ্ধতিগুলিকে কল করছে, এবং Henry
Human
এর একটি উদাহরণ ক্লাস, যা Mammal
থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাস।
def check_body_status
non_self = Human.new('NotSelf') #same class as self
puts "Just #{non_self.name} checking that " + non_self.body.downcase
# Mammal.new is also in the same class as self
"Just a human checking that " + Mammal.new.body.downcase
end
def say_account_number
non_self = Human.new('NotSelf')
"My account number is #{non_self.account_number}"
end
উপরে দেখানো হিসাবে, self.
প্রতিস্থাপন করা সম্ভব self.
এর মত একই শ্রেণীর একটি বস্তুর সাথে সুরক্ষিত পদ্ধতিতে , কিন্তু ব্যক্তিগত পদ্ধতিতে এটি অসম্ভব।
মিক্সিন
Mixins হল একটি মডিউল-এ সংজ্ঞায়িত কোডের একটি সেট , যা, যখন কোন শ্রেণীর অন্তর্ভুক্ত বা প্রসারিত হয়, তখন সেই শ্রেণীতে অতিরিক্ত ক্ষমতা প্রদান করে। একটি ক্লাসে বেশ কিছু মডিউল যোগ করা যেতে পারে, কারণ ক্লাসের উত্তরাধিকারে যা পাওয়া যায় তার বিপরীতে এর কোনো সীমা নেই। এই তথ্যের আলোকে, চলুন Movement
নামে একটি মডিউল তৈরি করি মানব শ্রেণীতে চলাচলের ক্ষমতা যোগ করতে।
module Movement
def hop
"I can hop"
end
def swim
"Ermmmm, I most likely can if I choose"
end
end
পরবর্তী ধাপে এই মডিউলটিকে আমাদের Human
-এ অন্তর্ভুক্ত করা হবে ক্লাস এটি include <module_name>
বাক্যাংশ যোগ করে করা হয় প্রশ্ন করা ক্লাসের কাছে। আমাদের ক্ষেত্রে, এটি include Movement
যোগ করতে হবে মানব শ্রেণীতে, যেমনটি নীচে দেখানো হয়েছে।
class Human < Mammal
include Movement
# rest of the code
end
আসুন এই কোডটি পরীক্ষা করি:
উপরে দেখানো হিসাবে, মডিউলের মাধ্যমে ক্লাসে মিশ্রিত পদ্ধতিগুলি শুধুমাত্র ক্লাসের উদাহরণের জন্য উপলব্ধ এবং ক্লাসের জন্য নয়। আমরা যদি মডিউলের পদ্ধতিগুলি ক্লাসের জন্য উপলব্ধ করতে চাই এবং উদাহরণটি না করে তবে কী হবে? এটি করার জন্য, আমরা "অন্তর্ভুক্ত" শব্দটিকে "বর্ধিত" দিয়ে প্রতিস্থাপন করি, যেমন extend Movement
.
.extend
শব্দটি ক্লাস ইনস্ট্যান্সেও ব্যবহার করা যেতে পারে তবে খুব ভিন্ন পদ্ধতিতে। চলুন Parent
নামে আরেকটি মডিউল তৈরি করি .
module Parent
def has_kids?
"most definitely"
end
end
উপরে যেমন দেখানো হয়েছে, .extend(Parent)
ব্যবহার করে বাবা ভেরিয়েবলের উপর has_kids?
তৈরি করে এটি উপলব্ধ পদ্ধতি। এটি বিশেষভাবে কার্যকর যখন আমরা মডিউলের পদ্ধতিগুলি প্রতিটি ক্লাসের উদাহরণে মিশ্রিত করতে চাই না। সুতরাং, extend
শুধুমাত্র সেই নির্দিষ্ট ক্ষেত্রে ব্যবহার করা যেতে পারে যেখানে আমরা আগ্রহী।
মডিউল
মডিউল হল ক্লাস, পদ্ধতি, ধ্রুবক এবং এমনকি অন্যান্য মডিউলগুলির জন্য আবাসন। মিক্সিন হিসাবে ব্যবহার করা ছাড়াও, যেমনটি আগে দেখা গেছে, মডিউলগুলির অন্যান্য ব্যবহার রয়েছে। নামগুলিকে সংঘর্ষে আটকাতে তারা আপনার কোড সংগঠিত করার একটি দুর্দান্ত উপায়, কারণ তারা নেমস্পেসিং নামে একটি সুবিধা অফার করে .রুবিতে, প্রতিটি শ্রেণী একটি মডিউল, কিন্তু কোন মডিউল একটি শ্রেণী নয়, কারণ মডিউলগুলিকে ইনস্ট্যান্ট করা যায় না বা এর থেকে উত্তরাধিকারসূত্রে পাওয়া যায় না৷ নেমস্পেসিং বোঝার জন্য, আসুন একটি ধ্রুবক, একটি শ্রেণি, একটি পদ্ধতি এবং অন্য একটি মডিউল সহ একটি মডিউল তৈরি করি৷
module Male
AGE = "Above 0"
class Adult
def initialize
puts "I am an adult male"
end
end
def self.hungry
puts "There's no such thing as male food, I just eat."
end
module Grown
def self.age
puts "18 and above"
end
end
end
আপনি হয়তো লক্ষ্য করেছেন যে উপরের মডিউলগুলির মধ্যে সংজ্ঞায়িত এবং কল করা পদ্ধতিগুলি self.
এর সাথে উপসর্গযুক্ত। . এর কারণ হল মডিউলগুলিকে ইনস্ট্যান্টিয়েট করা যায় না, এবং self.
ছাড়া তাদের মধ্যে সংজ্ঞায়িত যে কোনও পদ্ধতি। উপসর্গ শুধুমাত্র একটি মিক্সিন হিসাবে উপলব্ধ হবে, যেমনটি আমরা আগে দেখেছিলাম যখন আমরা mixins
নিয়ে আলোচনা করেছি . একটি মডিউলে একটি পদ্ধতি কল করার জন্য, আমাদের অবশ্যই self.method_name
ব্যবহার করে পদ্ধতির নামে এটি সনাক্ত করতে হবে . মনে রাখবেন যে আমরা self.
ও ব্যবহার করেছি ক্লাস পদ্ধতিতে কীওয়ার্ড; একই নীতি এখানে প্রযোজ্য।
উপরে দেখানো হিসাবে, একটি মডিউলের মধ্যে সংজ্ঞায়িত ক্লাস, মডিউল বা ধ্রুবকগুলিতে পৌঁছানোর জন্য, আমরা module_name::target_name
ব্যবহার করি . নেমস্পেসিং ধারণাটি সঠিকভাবে বোঝার জন্য, আমরা Adult
নামে একটি ক্লাস সম্বলিত আরেকটি মডিউল তৈরি করব , এবং তারপর আমরা দেখব কিভাবে উভয় শ্রেণীকে আলাদা করা হয়।
module Female
class Adult
def initialize
puts "I am an adult female"
end
end
def self.hungry
puts "Maybe there's such a thing as female food, I'm not sure. I just need to eat"
end
end
উপরে দেখানো হিসাবে, আমাদের "প্রাপ্তবয়স্ক" নাম বহনকারী দুটি শ্রেণী রয়েছে। তাদের নিজস্ব মডিউলের মধ্যে মোড়ানোর মাধ্যমে, আমরা প্রতিবার সঠিক প্রাপ্তবয়স্ক শ্রেণী সম্পর্কে কোনও বিভ্রান্তি ছাড়াই এই নামগুলি ব্যবহার করতে সক্ষম হয়েছি। উপরন্তু, আমাদের কোড আরও পঠনযোগ্য এবং আরও সংগঠিত, এবং আমরা উদ্বেগের নকশা নীতির বিচ্ছেদ বাস্তবায়ন করি, কারণ আমরা বিভিন্ন কোড ব্লককে তাদের ফাংশনের উপর ভিত্তি করে বিভিন্ন বিভাগে আলাদা করি।
বস্তু অনুক্রম
ক্লাস, দৃষ্টান্ত, মডিউল এবং উত্তরাধিকারের ধারণা বোঝা আশ্চর্যজনক, কিন্তু রুবিতে বস্তুর শ্রেণিবিন্যাস না বুঝে এই ক্ষেত্রের জ্ঞান অসম্পূর্ণ। এটি সেই ক্রমকে নির্দেশ করে যেখানে রুবিতে একটি পদ্ধতি অনুসন্ধান করা হয়। এই শ্রেণিবিন্যাস বুঝতে আমাদের সাহায্য করার জন্য কয়েকটি পদ্ধতি বিদ্যমান; তাদের মধ্যে একজন হল ancestors
পদ্ধতি এই পদ্ধতিটি ক্লাস ইনস্ট্যান্সের জন্য উপলব্ধ নয় তবে ক্লাসে নিজেদের এবং তাদের পূর্বপুরুষদের জন্য কল করা যেতে পারে। একটি উদাহরণ নীচে দেখানো হয়েছে৷
Human.ancestors
এর ফলাফল থেকে , আমরা দেখতে পাচ্ছি যে এই পদ্ধতিটি প্রশ্নে থাকা ক্লাসটি, এর সরাসরি অন্তর্ভুক্ত মডিউল, এর প্যারেন্ট ক্লাস, এবং প্যারেন্টস ক্লাসের সরাসরি অন্তর্ভুক্ত মডিউলগুলি ফেরত দেয়; এই লুপটি Basic Object
এ না যাওয়া পর্যন্ত চলতে থাকে , যা সকল বস্তুর মূল।
একটি ক্লাস সম্পর্কে আরও তথ্য পাওয়ার আরেকটি উপলব্ধ পদ্ধতি হল পদ্ধতি হল included_modules
.
উপরে দেখানো হিসাবে, মানব শ্রেণীতে দুটি মডিউল অন্তর্ভুক্ত রয়েছে:একটি যা আমরা সরাসরি include Movement
ব্যবহার করে অন্তর্ভুক্ত করেছি। এবং যা অবজেক্ট ক্লাসের অন্তর্ভুক্ত। এর মানে হল যে প্রতিটি শ্রেণী তার পূর্বপুরুষ ক্লাস থেকে শ্রেণী বৈশিষ্ট্যগুলিকে উত্তরাধিকার সূত্রে পায়, এবং তাদের অন্তর্ভুক্ত প্রতিটি মডিউল এতে অন্তর্ভুক্ত হয়৷ এই তথ্যের উপর ভিত্তি করে, আমরা রুবিতে মেথড লুকআপ পাথ এবং কোন ক্লাসগুলির অগ্রাধিকার রয়েছে তা নিশ্চিত করার জন্য একটি সাধারণ অনুশীলন করব৷ এই পথে অন্যদের উপরে। আমরা একই নামের কিন্তু ভিন্ন আউটপুট স্ট্রিং দিয়ে পদ্ধতি সংজ্ঞায়িত করব এবং সেগুলিকে Human
-এ রাখব ক্লাস, Movement
মডিউল, এবং Mammal
ক্লাস।
# in the mammal class
def find_path
"Found me in the Mammal class path"
end
# in the Movement module
def find_path
"Found me in the Movement module path"
end
# in the Human class
def find_path
"Found me in the Human class path"
end
এখন এই ব্যায়াম করা যাক।
উপরে যেমন দেখানো হয়েছে, আমরা যখন .ancestors
কল করি তখন পূর্বপুরুষদের যে ক্রম অনুসারে সাজানো হয় on a class হল সেই পথটি অনুসরণ করা যখন সেই ক্লাসের একটি উদাহরণে বলা একটি পদ্ধতির সন্ধান করা হয়। Human
জন্য আমরা যে ক্লাস ইনস্ট্যান্স তৈরি করেছি, রুবি প্রথমে ক্লাসেই মেথডের জন্য অনুসন্ধান করে; যদি পাওয়া না যায়, এটি সরাসরি অন্তর্ভুক্ত মডিউলগুলিতে চলে যায়; যদি খুঁজে না পাওয়া যায়, এটি সুপারক্লাসে চলে যায় এবং চক্রটি চলতে থাকে যতক্ষণ না এটি BasicObject
এ পৌঁছায় . যদি পদ্ধতিটি এখনও সেখানে পাওয়া না যায়, একটি "NoMethodError" ফেরত দেওয়া হয়। .ancestors
ব্যবহার করে পদ্ধতি, আমরা একটি বস্তুর জন্য সন্ধানের পথ সনাক্ত করতে পারি এবং এটির পদ্ধতিগুলি যেকোন সময়ে নির্গত হয়৷
রুবি methods
নামে একটি পদ্ধতিও অফার করে , যার মাধ্যমে আমরা যেকোনো বস্তুর জন্য উপলব্ধ সমস্ত পদ্ধতি সনাক্ত করতে পারি। আমরা এমনকি বিয়োগও করতে পারি তা দেখানোর জন্য যে কোনটি এর পিতামাতার থেকে এসেছে এবং কোনটি এটির কাছে অদ্ভুত। একটি উদাহরণ নীচে দেখানো হয়েছে৷
উপরে দেখানো হিসাবে, পরিবর্তনশীল হেনরি এটি উপলব্ধ পদ্ধতি অনেক আছে. যাইহোক, যখন আমরা অবজেক্টে উপলব্ধ থেকে তাদের বিয়োগ করি শ্রেণীতে, আমরা দেখতে পাই যে আমরা কেবলমাত্র আমাদের ফাইলে নির্দিষ্টভাবে সংজ্ঞায়িত করে রেখেছি এবং অন্য সমস্ত পদ্ধতি উত্তরাধিকারসূত্রে প্রাপ্ত। এটি প্রতিটি বস্তু, তার শ্রেণী এবং তার পূর্বপুরুষদের জন্য একই। Human.methods এর সাথে জড়িত বেশ কয়েকটি সংমিশ্রণ চেষ্টা করে আপনার হাত নোংরা করতে নির্দ্বিধায় , স্তন্যপায়ী। পদ্ধতি , Module.methods , এবং পূর্বে সংজ্ঞায়িত প্রতিটি অন্যান্য শ্রেণী বা মডিউল; আপনি দেখতে পাবেন যে এটি আপনাকে রুবি অবজেক্ট মডেলের একটি শক্তিশালী উপলব্ধি দেয়।