হ্যালো চাইল্ড্রেন এবং প্যারেন্টস, হেম রুবিস্টরা। একটি পূর্ববর্তী আর্টিকেলে, আমরা আনসেস্ট্রি চেইন-এ ডুব দিয়েছিলাম। আজকের পোস্টে, আমরা প্যারেন্টিং এবং ইনহেরিটেন্স-এ গভীরে যাব। আমরা ইনহেরিটেড হুক মেথড এক্সপ্লোর করব এবং ইনহেরিটেন্স প্রিভেন্ট করার লগিকে দেখব।
যখন বাচ্চারা ইনহেরিট করে ১০১: ইনহেরিটেড হুক মেথড
শুরু করি প্যারেন্টহুড কীভাবে ডিক্লেয়ার হয় সেটি দেখতে। রুবি একটি ক্লাসের সাথে ইন্টারঅ্যাক্ট করার সুন্দর পদ্ধতি প্রদান করে যখন এটি অন্য একটি ক্লাসের প্যারেন্ট হিসেবে ডিক্লেয়ার হয়।
class Parent def self.inherited(subclass) puts "#{subclass} inherits from Parent" end end class Child < Parent end এই কোড রান করলে প্রিন্ট হবে "Child inherits from Parent", কারণ Parent.inherited মেথড কল হয় যখন Child ক্লাস Parent-থেকে ইনহেরিট করে। নোট করুন যে এই মেথড সাবক্লাসকে প্যারামিটার হিসেবে নেয়—আমাদের কেসে Child। এই মেকানিজম আপনাকে প্যারেন্ট ক্লাসের সাথে ইন্টারঅ্যাক্ট করতে দেয় একটি সেট বিহেবিয়ার ডিফাইন করতে শুধু তখনই যখন এটি ইনহেরিট হয়। বিহেবিয়ার বলতে এখানে মানে, ইনহেরিটিং বা ইনহেরিটেড ক্লাসে ভেরিয়েবল, মেথড এবং কনস্ট্যান্ট মডিফাই, ডিফাইন বা ডিলিট করা। এখন, parent_name মেথড অন-দ-ফ্লাই ডিফাইন করি: class Parent def self.inherited(subclass) subclass.define_method :parent_name do "Daddy" end end end class Child < Parent end Child.new.parent_name # => "Daddy" এখানে, আমরা Child ক্লাসে একটি মেথড ডিফাইন করি যখন এটি Parent-থেকে ইনহেরিট করে, কিন্তু সেটি সরাসরি Parent ক্লাসে যোগ করা হয়নি। বরং, এটি শুধু তখন ডিফাইন হয় যখন অন্য কোনো ক্লাস Parent-থেকে ইনহেরিট করে। ঠিক আছে, থিওরি কভার করলাম, এখন একটি আরও রিয়েলিস্টিক উদাহরণ দেখি একজন রুবিস্টের জীবনে।
ক্লাস ইনহেরিটেন্স প্রিভেন্ট করা
রুবি অন রেলসে, ডাটাবেস মাইগ্রেশন হ্যান্ডেল হয় ActiveRecord::Migration ক্লাস দিয়ে। চলুন সরাসরি এই ক্লাস থেকে ইনহেরিট করার চেষ্টা করি।
class AddFirstnameToUsers < ActiveRecord::Migration end # => StandardError (Directly inheriting from ActiveRecord::Migration is not supported..) এই এরর রেইজ হয়েছে কারণ রুবি অন রেলস একটি মেকানিজম প্রদান করে যা আমাদের এই ক্লাস থেকে ইনহেরিট করা বাধা দেয়। তাহলে রুবি অন রেলস কেন এই মেকানিজম ইমপ্লিমেন্ট করেছিল? একটি মাইগ্রেশন শক্তিশালীভাবে কাপলড থাকে রুবি অন রেলসের একটি নির্দিষ্ট ভার্সনের সাথে। নিশ্চিতই, এই ক্লাস দ্বারা প্রদান API দুটি ভার্সনের মধ্যে কিছুটা চেঞ্জ হতে পারে। তাই, রুবি অন রেলস আপগ্রেড করার সময় মাইগ্রেশন ব্রেক না হওয়া নিশ্চিত করতে, ফ্রেমওয়ার্ক আপনাকে বাধা দেয় ActiveRecord::Migration ক্লাসের একটি নির্দিষ্ট ভার্সন বেছে নেওয়া। এটি আপনার মাইগ্রেশনের স্মুথ রানিং নিশ্চিত করে। class AddFirstnameToUsers < ActiveRecord::Migration[4.2] end উপরের উদাহরণে, আমাদের মাইগ্রেশন কাপলড রয়েছে ActiveRecord::Migration API-র সাথে যা রুবি অন রেলস ভার্সন ৪.২-এ প্রদান করা হয়েছিল। তাই, এমনকি আমরা আমাদের অ্যাপ্লিকেশনকে ভার্সন ৫.০-এ আপগ্রেড করি, আমাদের মাইগ্রেশন স্মুথলি রান করবে কারণ সেগুলো এখনও রান করবে ActiveRecord::Migration API-এর ভার্সন ৪.২ দিয়ে।
ইনহেরিটেন্স প্রিভেন্ট কীভাবে কাজ করে
এখন যেহেতু আমরা বুঝেছি কেন ইনহেরিটেন্স প্রিভেন্ট করা হয়েছে এখানে, চলুন দেখি কীভাবে এই ActiveRecord::Migration ইনহেরিটেন্স প্রিভেন্ট করে। সকল লজিক ডিফাইন করা আছে ActiveRecord::Migration.inherited মেথডে।
class AddFirstnameToUsers < ActiveRecord::Migration[4.2] end যখন আমাদের AddFirstnameToUsers ক্লাস ActiveRecord::Migration-থেকে ইনহেরিট করে, ActiveRecord::Migration.inherited হুক মেথড কল হয়। module ActiveRecord class Migration def self.inherited(subclass) #:nodoc: super if subclass.superclass == Migration raise StandardError, "Directly inheriting from ActiveRecord::Migration is not supported. " \ "Please specify the Rails release the migration was written for:\n" \ "\n" \ " class #{subclass} < ActiveRecord::Migration[4.2]" end end end end যেমন আমরা দেখছি, এই হুক মেথড চেক করে সাবক্লাস (AddFirstnameToUsers) কি সরাসরি ActiveRecord::Migration-থেকে ইনহেরিট করেছে। যদি হয়, তবে একটি এরর রেইজ করা হয়। এটি ইনহেরিটেন্স কন্ট্রোল করার পারফেক্ট এন্ট্রি পয়েন্ট।
উপসংহার
আজ, আমরা ইনহেরিটেন্স এবং ইনহেরিটেন্স প্রিভেন্ট করার বেসিক কভার করেছি। আমরা ইনহেরিটেড হুক মেথড কভার করেছি এবং দেখেছি কীভাবে এটি খুব হ্যান্ডি হতে পারে ইনহেরিটিং/ইনহেরিটেড ক্লাসের সাথে অন-দ-ফ্লাই ইন্টারঅ্যাক্ট করার জন্য। একটি রিয়েল-ওয়ার্ল্ড সেটিংয়ে, ইনহেরিটেন্স নিয়ে খেলার সময় সতর্ক থাকুন। খুব সতর্ক থাকুন যখন আপনি একটি এক্সিস্টিং মেথড বা ক্লাস রিমুভ বা ওভাররাইড করছেন। এর ফলে কিছু অনিচ্ছাকৃত সাইড ইফেক্ট হতে পারে। বাচ্চারা ড্যাডি কল করতে বন্ধ করে দিতে পারে। Et Voilà, আজকের পোস্ট এখানেই সমাপ্ত!