এই আর্টিকেলে রুবিতে ক্লাস ও মডিউল অটোলোডিং ব্যাখ্যা করা হয়েছে। রেইলস ৬ এর অংশ নতুন "Zeitwerk" জেম সহ।
একটি প্রশ্ন দিয়ে শুরু করি…
বহু সোর্স কোড ফাইলকে একসাথে কীভাবে जोড়ব?
আমরা সেগুলো require করি।
একটি ফাইল require করলে রুবি সেটি পড়ে এবং ভিতরের কোড রান করে। কিন্তু যদি আমাদের রিকোয়ার্ড ফাইলগুলোর একটি তালিকা থাকে তবে আমরা সম্ভবত উন সব লোড করার দরকার নেই।
কমপক্ষে তো অ 당장 নয়…
শুধু যখন দরকার তখন ফাইলগুলো লোড করা যাতে অ্যাপ্লিকেশন দ্রুত শুরু হয়, সেটি কীভাবে সম্ভব?
সেটাই হলো অটোলোডিং আসার জায়গা!
অটোলোডিং কীভাবে ব্যবহার করবেন
রুবিতে বিল্ট-ইন অটোলোডিং ফিচার রয়েছে।
এটি কন্সট্যান্টের ওপর ভিত্তি করে।
যখন প্রথমবার Coconut এর মত একটি কন্সট্যান্ট পাওয়া যায়, রুবি তার সংশ্লিষ্ট ফাইল লোড করার চেষ্টা করে।
কিন্তু প্রথমে:
আপনাকে এই কন্সট্যান্টকে এর ফাইল নেমের সাথে রেজিস্টার করতে হবে।
এভাবে:
autoload :Coconut, "lib/coconut.rb"
এখন রুবি জানে কোথায় খুঁজবেন যখনই আপনি Coconut ক্লাস বা মডিউল ব্যবহার করতে চান।
কিন্তু আরেকটা জিনিস আরও ভালো হতো?
কল্পনা করুন আপনাকে ম্যানুয়ালি কন্সট্যান্ট রেজিস্টার করতে হতো না এবং রুবি সব কোথায় আছে সেটি জানত।
ভালো…
রেইলস ঠিক এটি করে, কিন্তু রেইলস ৬ এর আগে এটা এই autoload মেকানিজম ব্যবহার করত না।
রেইলস ৬ এর আগে রেইলসে অটোলোডিং
আমি পুরোপুরি বুঝি না কীভাবে কাজ করে, কিন্তু রেইলস autoload এর বদলে const_missing ব্যবহার করে স্বয়ংক্রিয়ভাবে ফাইল খুঁজে বের করে এবং আপনার প্রজেক্টে লোড করে।
এটি কেন উপকারী?
কারণ এর মানে আপনাকে আপনার রেইলস প্রজেক্টে require ব্যবহার করতে হয় না।
কনভেনশন ওভার কনফিগারেশন…
সবকিছু স্বয়ংক্রিয়ভাবে হয়, যদি আপনি নিয়মগুলো মেনে চলেন।
নियमগুলো হলো:
- আপনার ফাইল সেখানে রাখুন যেখানে এটি খুঁজে পাওয়া যায় (যেমন
ActiveSupport::Dependencies.autoload_pathsদিয়ে ডিফাইন করা) - প্রতি ফাইলে একটি ক্লাস / মডিউল ডিফাইন করুন
- ফাইলটিকে ক্লাসের নাম অনুযায়ী নাম দিন, আন্ডারস্কোর ব্যবহার করে (
UsersController=>users_controller)
তারপর…
যখনই আপনার কোড এই ক্লাস নামগুলো রেফারেন্স করে, রেইলস জানবে সেগুলো কোথায় পাওয়া যাবে।
খুব সহায়ক।
রেইলস ৬ এর পরে রেইলসে অটোলোডিং
রেইলস ৬ একটি নতুন কন্সট্যান্ট অটোলোডিং মেকানিজম পরিচয় করিয়েছে।
এটির নাম Zeitwerk।
এটি "classic" রেইলস অটোলোডিং থেকে কীভাবে আলাদা?
পুরনো রেইলস ভার্সনগুলো ব্যবহার করা const_missing অ্যাপ্রোচে ইনফরমেশন কম থাকে - যেমন মডিউল নেস্টিং - ফলস্বরূপ অনেক লিমিটেশন থাকে।
Zeitwerk রুবির autoload ব্যবহার করে।
এই নতুন ইমপ্লিমেন্টেশন সাদৃশ্য ফাইল-নেমিং কনভেনশন ফলো করে।
বস্তুত:
Zeitwerk ফাইল নেম থেকে ক্লাস নাম অনুমান করে, users_controller => UsersController।
যা আগেরটা থেকে সম্পূর্ণ বিপরীত।
বতে, আপনি এখনও autoload_paths ব্যবহার করতে পারেন, কিন্তু আপনি শুধু বেস প্যাথ যোগ করতে চাবেন, যেমন "/lib", "/lib/**" এর বদলে।
কেন?
নেমস্পেস এবং নেস্টিং এর সাথে এটি কীভাবে কাজ করে সেটির পদ্ধতিটি এই।
- আপনার অটোলোডে
"lib"থাকলে, এবং আপনি"Fruit::Orange"ডিফাইন করতে চান, তবে ফাইল নেম হতে হবে"lib/fruit/orange.rb"। - কিন্তু আপনার অটোলোডে
"lib/fruit"থাকলে, তবে আপনাকে অন্য একটি ফোল্ডার ব্যবহার করতে হবে, তাই আপনার ফাইল নেম হবে"lib/fruit/fruit/orange.rb"একই ক্লাসের জন্য।
সবচেয়ে ভালো অংশ?
এই নতুন ফাংশনালিটি রেইলসের সাথে গ্লুড নয়, তাই আপনি আপনার নন-রেইলস প্রজেক্টেও এটি ব্যবহার করতে পারেন!
সারসংক্ষেপ
আপনি রুবিতে মডিউল অটোলোডিং সম্পর্কে শিখেছেন, সেটি কী এবং কীভাবে কাজ করে সেটি ঠিক করে!
এই নতুন বোঝাপড়ার সাথে, আপনি আপনার রুবি প্রজেক্টগুলো সবচেয়ে কার্যকরভাবে স্ট্রাকচার করতে পারবেন।
এখন আপনার পালা, আপনার এডিটর খুলুন এবং কিছু মজা করুন।
পড়ার জন্য ধন্যবাদ! 🙂