প্যাকেজ, ক্রেট এবং মডিউল ব্যবহার করে ক্রমবর্ধমান প্রোজেক্ট পরিচালনা করা (Managing Growing Projects with Packages, Crates, and Modules)

আপনি যখন বড় প্রোগ্রাম লিখবেন, তখন আপনার কোড সংগঠিত করা ক্রমবর্ধমান গুরুত্বপূর্ণ হয়ে উঠবে। সম্পর্কিত কার্যকারিতা গ্রুপ করে এবং স্বতন্ত্র বৈশিষ্ট্যযুক্ত কোড আলাদা করার মাধ্যমে, আপনি স্পষ্ট করবেন যে কোনো নির্দিষ্ট ফিচার ইমপ্লিমেন্ট করে এমন কোড কোথায় পাওয়া যাবে এবং কোনো ফিচারের কাজ পরিবর্তন করতে কোথায় যেতে হবে।

আমরা இதுவரை যে প্রোগ্রামগুলো লিখেছি সেগুলো একটি ফাইলের মধ্যে একটি মডিউলে ছিল। একটি প্রোজেক্ট বাড়ার সাথে সাথে, আপনাকে কোডটিকে একাধিক মডিউল এবং তারপর একাধিক ফাইলে বিভক্ত করে সংগঠিত করা উচিত। একটি প্যাকেজে একাধিক বাইনারি ক্রেট এবং ঐচ্ছিকভাবে একটি লাইব্রেরি ক্রেট থাকতে পারে। একটি প্যাকেজ বাড়ার সাথে সাথে, আপনি অংশগুলোকে আলাদা ক্রেট হিসেবে বের করে নিতে পারেন যা এক্সটার্নাল ডিপেন্ডেন্সি (external dependencies) হয়ে যায়। এই চ্যাপ্টারটি এই সমস্ত কৌশল কভার করে। খুব বড় প্রোজেক্টগুলোর জন্য, যেখানে সম্পর্কযুক্ত প্যাকেজের একটি সেট একসাথে বিকশিত হয়, Cargo ওয়ার্কস্পেস (workspaces) সরবরাহ করে, যা আমরা চ্যাপ্টার 14-এর “কার্গো ওয়ার্কস্পেস”-এ কভার করব।

আমরা ইমপ্লিমেন্টেশনের বিবরণ এনক্যাপসুলেট (encapsulate) করা নিয়েও আলোচনা করব, যা আপনাকে উচ্চ স্তরে কোড পুনরায় ব্যবহার করতে দেয়: একবার আপনি একটি অপারেশন ইমপ্লিমেন্ট করলে, অন্য কোড তার পাবলিক ইন্টারফেসের মাধ্যমে আপনার কোডকে কল করতে পারে, ইমপ্লিমেন্টেশন কীভাবে কাজ করে তা না জেনেই। আপনি যেভাবে কোড লেখেন তা নির্ধারণ করে যে কোন অংশগুলো অন্য কোডের ব্যবহারের জন্য পাবলিক এবং কোন অংশগুলো প্রাইভেট ইমপ্লিমেন্টেশন বিবরণ যা পরিবর্তন করার অধিকার আপনি সংরক্ষণ করেন। এটি আপনার মাথায় রাখতে হবে এমন বিস্তারিত বিবরণের পরিমাণ সীমিত করার আরেকটি উপায়।

একটি সম্পর্কিত ধারণা হল স্কোপ: কোড যে নেস্টেড প্রসঙ্গে লেখা হয় সেখানে "স্কোপের মধ্যে" হিসাবে সংজ্ঞায়িত নামের একটি সেট রয়েছে। কোড পড়ার, লেখার এবং কম্পাইল করার সময়, প্রোগ্রামার এবং কম্পাইলারদের জানা দরকার যে কোনো নির্দিষ্ট স্থানের একটি নির্দিষ্ট নাম একটি ভেরিয়েবল, ফাংশন, স্ট্রাকট, এনাম, মডিউল, কনস্ট্যান্ট বা অন্য কোনো আইটেমকে নির্দেশ করে কিনা এবং সেই আইটেমটির অর্থ কী। আপনি স্কোপ তৈরি করতে পারেন এবং কোন নামগুলো স্কোপের ভিতরে বা বাইরে আছে তা পরিবর্তন করতে পারেন। আপনি একই স্কোপে একই নামের দুটি আইটেম রাখতে পারবেন না; নামের দ্বন্দ্ব সমাধানের জন্য টুল উপলব্ধ রয়েছে।

Rust-এর বেশ কয়েকটি ফিচার রয়েছে যা আপনাকে আপনার কোডের সংগঠন পরিচালনা করতে দেয়, যার মধ্যে কোন বিবরণগুলো উন্মুক্ত, কোন বিবরণগুলো প্রাইভেট এবং আপনার প্রোগ্রামগুলোর প্রতিটি স্কোপে কোন নামগুলো রয়েছে তা সহ। এই ফিচারগুলো, কখনও কখনও সম্মিলিতভাবে মডিউল সিস্টেম (module system) হিসাবে উল্লেখ করা হয়, এর মধ্যে নিম্নলিখিতগুলো অন্তর্ভুক্ত:

  • প্যাকেজ (Packages): একটি Cargo ফিচার যা আপনাকে ক্রেট তৈরি, পরীক্ষা এবং শেয়ার করতে দেয়।
  • ক্রেট (Crates): মডিউলের একটি ট্রি যা একটি লাইব্রেরি বা এক্সিকিউটেবল তৈরি করে।
  • মডিউল (Modules) এবং use: আপনাকে পাথগুলোর সংগঠন, স্কোপ এবং গোপনীয়তা নিয়ন্ত্রণ করতে দেয়।
  • পাথ (Paths): একটি আইটেম, যেমন একটি স্ট্রাকট, ফাংশন বা মডিউলের নামকরণের একটি উপায়।

এই চ্যাপ্টারে, আমরা এই সমস্ত ফিচারগুলো কভার করব, সেগুলো কীভাবে ইন্টারঅ্যাক্ট করে তা নিয়ে আলোচনা করব এবং স্কোপ পরিচালনা করতে সেগুলো কীভাবে ব্যবহার করতে হয় তা ব্যাখ্যা করব। শেষ পর্যন্ত, আপনার মডিউল সিস্টেম সম্পর্কে একটি দৃঢ় বোধ থাকা উচিত এবং একজন পেশাদারের মতো স্কোপ নিয়ে কাজ করতে সক্ষম হওয়া উচিত!