মডিউলগুলোকে বিভিন্ন ফাইলে আলাদা করা (Separating Modules into Different Files)

এখন পর্যন্ত, এই চ্যাপ্টারের সমস্ত উদাহরণে একটি ফাইলের মধ্যে একাধিক মডিউল সংজ্ঞায়িত করা হয়েছে। যখন মডিউলগুলো বড় হয়ে যায়, তখন আপনি কোড নেভিগেট করা সহজ করার জন্য সেগুলোর সংজ্ঞাগুলো একটি পৃথক ফাইলে সরিয়ে নিতে চাইতে পারেন।

উদাহরণস্বরূপ, আসুন Listing 7-17-এর কোড থেকে শুরু করি যেখানে একাধিক রেস্তোরাঁ মডিউল ছিল। আমরা সমস্ত মডিউলকে ক্রেট রুট ফাইলে সংজ্ঞায়িত করার পরিবর্তে মডিউলগুলোকে ফাইলে এক্সট্র্যাক্ট করব। এই ক্ষেত্রে, ক্রেট রুট ফাইলটি হল src/lib.rs, কিন্তু এই পদ্ধতিটি বাইনারি ক্রেটগুলোর সাথেও কাজ করে যাদের ক্রেট রুট ফাইল src/main.rs

প্রথমে আমরা front_of_house মডিউলটিকে তার নিজস্ব ফাইলে এক্সট্র্যাক্ট করব। front_of_house মডিউলের কোঁকড়া ধনুর্বন্ধনীর ভিতরের কোডটি সরিয়ে ফেলুন, শুধুমাত্র mod front_of_house; ঘোষণাটি রেখে দিন, যাতে src/lib.rs-এ Listing 7-21-এ দেখানো কোড থাকে। মনে রাখবেন যে এটি কম্পাইল হবে না যতক্ষণ না আমরা Listing 7-22-এ src/front_of_house.rs ফাইল তৈরি করি।

mod front_of_house;

pub use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
}

এরপর, কোঁকড়া ধনুর্বন্ধনীর মধ্যে থাকা কোডটি src/front_of_house.rs নামে একটি নতুন ফাইলে রাখুন, যেমনটি Listing 7-22-এ দেখানো হয়েছে। কম্পাইলার জানে যে এই ফাইলটিতে খুঁজতে হবে কারণ এটি ক্রেট রুটে front_of_house নামের মডিউল ঘোষণার সম্মুখীন হয়েছে।

pub mod hosting {
    pub fn add_to_waitlist() {}
}

লক্ষ্য করুন যে আপনাকে আপনার মডিউল ট্রিতে একটি mod ঘোষণা ব্যবহার করে শুধুমাত্র একবার একটি ফাইল লোড করতে হবে। কম্পাইলার যখন জানে যে ফাইলটি প্রোজেক্টের অংশ (এবং আপনি যেখানে mod স্টেটমেন্ট রেখেছেন তার কারণে মডিউল ট্রিতে কোডটি কোথায় রয়েছে তা জানে), তখন আপনার প্রোজেক্টের অন্যান্য ফাইলগুলোর লোড করা ফাইলের কোডটিকে রেফার করা উচিত যেখানে এটি ঘোষণা করা হয়েছিল, যেমনটি “মডিউল ট্রিতে একটি আইটেমকে রেফার করার জন্য পাথ” বিভাগে আলোচনা করা হয়েছে। অন্য কথায়, mod একটি "অন্তর্ভুক্ত (include)" অপারেশন নয় যা আপনি হয়তো অন্য প্রোগ্রামিং ভাষাগুলোতে দেখেছেন।

এরপর, আমরা hosting মডিউলটিকে তার নিজস্ব ফাইলে এক্সট্র্যাক্ট করব। প্রক্রিয়াটি একটু ভিন্ন কারণ hosting হল রুট মডিউলের চাইল্ড মডিউল নয়, front_of_house-এর চাইল্ড মডিউল। আমরা hosting-এর জন্য ফাইলটিকে একটি নতুন ডিরেক্টরিতে রাখব যার নাম মডিউল ট্রিতে এর পূর্বপুরুষদের নামে হবে, এই ক্ষেত্রে src/front_of_house

hosting সরানো শুরু করতে, আমরা src/front_of_house.rs পরিবর্তন করে শুধুমাত্র hosting মডিউলের ঘোষণা রাখি:

pub mod hosting;

তারপর আমরা একটি src/front_of_house ডিরেক্টরি এবং hosting মডিউলে তৈরি করা সংজ্ঞাগুলো ধারণ করার জন্য একটি hosting.rs ফাইল তৈরি করি:

pub fn add_to_waitlist() {}

যদি আমরা পরিবর্তে hosting.rs কে src ডিরেক্টরিতে রাখতাম, তাহলে কম্পাইলার আশা করত যে hosting.rs কোডটি ক্রেট রুটে ঘোষিত একটি hosting মডিউলে রয়েছে, front_of_house মডিউলের চাইল্ড হিসাবে ঘোষিত নয়। কোন মডিউলের কোডের জন্য কোন ফাইলগুলো পরীক্ষা করতে হবে সে সম্পর্কে কম্পাইলারের নিয়মগুলোর অর্থ হল ডিরেক্টরি এবং ফাইলগুলো মডিউল ট্রির সাথে আরও ঘনিষ্ঠভাবে মেলে।

বিকল্প ফাইলের পাথ (Alternate File Paths)

ఇప్పటి পর্যন্ত আমরা Rust কম্পাইলার ব্যবহার করে এমন সবচেয়ে ইডিওমেটিক ফাইলের পাথগুলো কভার করেছি, কিন্তু Rust একটি পুরানো স্টাইলের ফাইল পাথও সমর্থন করে। ক্রেট রুটে ঘোষিত front_of_house নামক একটি মডিউলের জন্য, কম্পাইলার মডিউলের কোড খুঁজবে:

  • src/front_of_house.rs-এ (যা আমরা কভার করেছি)
  • src/front_of_house/mod.rs-এ (পুরানো স্টাইল, এখনও সমর্থিত পাথ)

front_of_house-এর একটি সাবমডিউল hosting নামক মডিউলের জন্য, কম্পাইলার মডিউলের কোড খুঁজবে:

  • src/front_of_house/hosting.rs-এ (যা আমরা কভার করেছি)
  • src/front_of_house/hosting/mod.rs-এ (পুরানো স্টাইল, এখনও সমর্থিত পাথ)

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

mod.rs নামে ফাইলগুলো ব্যবহার করা স্টাইলের প্রধান অসুবিধা হল আপনার প্রোজেক্টে mod.rs নামে অনেকগুলো ফাইল থাকতে পারে, যা আপনার এডিটরে একসাথে খোলা থাকলে বিভ্রান্তিকর হতে পারে।

আমরা প্রতিটি মডিউলের কোডকে একটি পৃথক ফাইলে সরিয়ে নিয়েছি এবং মডিউল ট্রি একই রয়েছে। eat_at_restaurant-এর ফাংশন কলগুলো কোনো পরিবর্তন ছাড়াই কাজ করবে, যদিও সংজ্ঞাগুলো ভিন্ন ফাইলে রয়েছে। এই কৌশলটি আপনাকে মডিউলগুলোর আকার বাড়ার সাথে সাথে সেগুলোকে নতুন ফাইলে সরিয়ে নিতে দেয়।

লক্ষ্য করুন যে src/lib.rs-এ pub use crate::front_of_house::hosting স্টেটমেন্টটিও পরিবর্তিত হয়নি, use-এরও ক্রেটের অংশ হিসাবে কোন ফাইলগুলো কম্পাইল করা হয় তার উপর কোনো প্রভাব নেই। mod কীওয়ার্ড মডিউলগুলো ঘোষণা করে এবং Rust সেই মডিউলের নামের সাথে একই নামের একটি ফাইলে সেই মডিউলে যাওয়া কোডের জন্য সন্ধান করে।

সারসংক্ষেপ (Summary)

Rust আপনাকে একটি প্যাকেজকে একাধিক ক্রেট এবং একটি ক্রেটকে মডিউলে বিভক্ত করতে দেয় যাতে আপনি একটি মডিউলে সংজ্ঞায়িত আইটেমগুলোকে অন্য মডিউল থেকে রেফার করতে পারেন। আপনি অ্যাবসোলিউট বা রিলেটিভ পাথ নির্দিষ্ট করে এটি করতে পারেন। এই পাথগুলো একটি use স্টেটমেন্ট দিয়ে স্কোপে আনা যেতে পারে যাতে আপনি সেই স্কোপে আইটেমটির একাধিক ব্যবহারের জন্য একটি সংক্ষিপ্ত পাথ ব্যবহার করতে পারেন। মডিউল কোড ডিফল্টরূপে প্রাইভেট, কিন্তু আপনি pub কীওয়ার্ড যোগ করে সংজ্ঞাগুলোকে পাবলিক করতে পারেন।

পরবর্তী চ্যাপ্টারে, আমরা স্ট্যান্ডার্ড লাইব্রেরির কিছু কালেকশন ডেটা স্ট্রাকচার দেখব যা আপনি আপনার সুসংগঠিত কোডে ব্যবহার করতে পারেন।