التركيب
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 55 من 61.
تعتمد العديد من اللغات كائنية التوجه بشكل كبير على الوراثة لمشاركة الوظائف بين الأنواع. تتبع Rust نهجًا مختلفًا: التركيب. بدلًا من وراثة السلوك من نوع أب، تبني أنواعًا معقدة من خلال تضمين أنواع أخرى كحقول.
تخيّل نمذجة سيارة. بدلًا من إنشاء فئة أساسية Vehicle والوراثة منها، تقوم بتركيب Car من مكوّنات أصغر وأكثر تركيزًا:
struct Engine {
horsepower: u32,
}
struct Wheels {
count: u8,
diameter: f32,
}
struct Car {
engine: Engine,
wheels: Wheels,
brand: String,
}
لا يرث Car من Engine أو Wheels. بل يمتلكها. تُسمّى علاقة «has-a» هذه بالتركيب. يمكنك الوصول إلى المكوّنات الداخلية من خلال حقولها واستدعاء أساليبها مباشرةً:
impl Engine {
fn start(&self) {
println!("Engine with {} HP started!", self.horsepower);
}
}
impl Car {
fn start(&self) {
self.engine.start(); // تفويض إلى المكون الداخلي
}
}
يحافظ هذا النمط على تركيز كل بنية على مسؤولية واحدة. هل تحتاج إلى تغيير طريقة عمل المحركات؟ عدّل بنية Engine فقط. هل تريد إعادة استخدام Wheels لدراجة نارية؟ ما عليك سوى تضمينها في بنية جديدة. يمنحك التركيب مرونة من دون الاقتران الوثيق الذي غالبًا ما ينشئه التوريث.
التحدي
سهللنبنِ نظام كمبيوتر باستخدام التركيب! بدلًا من إنشاء بنية struct واحدة ضخمة، ستُركّب Computer من مكوّنات أصغر ومركّزة: CPU وMemory. سيعرف كل مكوّن كيفية وصف نفسه، وسيفوّض Computer المهمة إلى أجزائه.
ستُنظّم الكود عبر ثلاثة ملفات:
cpu.rs: عرّف بنيةCPUعامةpublicتحتوي على حقلين عامينpublic:cores(u32) لعدد الأنوية، وspeed_ghz(f32) لسرعة الساعة. أضفspecsmethod تُعيد String يصف CPU بالتنسيق{cores}-core @ {speed_ghz}GHz.memory.rs: عرّف بنيةMemoryعامةpublicتحتوي على حقل عامpublicهوsize_gb(u32) لحجم الذاكرة. أضفspecsmethod تُعيد String بالتنسيق{size_gb}GB RAM.main.rs: استورد كلتا الوحدتين وأنشئ بنيةComputerعامةpublichas حقلcpuمن النوعCPUوحقلmemoryمن النوعMemory. Implementsystem_infomethod على Computer بحيث تفوّض المهمة إلى مكوّناته وتطبع مواصفات النظام الكاملة. استخدم المدخلات المُعطاة لبناء Computer وعرض معلوماته.
ينبغي أن تطبع system_info method:
System: {cpu_specs} | {memory_specs}على سبيل المثال، عند استخدام المدخلات 8 و3.5 و16:
System: 8-core @ 3.5GHz | 16GB RAMوعند استخدام المدخلات 4 و2.8 و32:
System: 4-core @ 2.8GHz | 32GB RAMستتلقى ثلاثة مدخلات: أنوية CPU (parse كـ u32)، وسرعة CPU (parse كـ f32)، وحجم الذاكرة (parse كـ u32).
جرّب بنفسك
mod cpu;
mod memory;
use cpu::CPU;
use memory::Memory;
// TODO: عرّف هيكل Computer عام بحقلين عامين:
// - cpu: CPU
// - memory: Memory
// TODO: نفّذ method باسم system_info على Computer بحيث:
// - تفوّض إلى cpu.specs() و memory.specs()
// - تطبع: System: {cpu_specs} | {memory_specs}
fn main() {
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let cores: u32 = input.trim().parse().expect("Invalid number");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let speed_ghz: f32 = input.trim().parse().expect("Invalid number");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let size_gb: u32 = input.trim().parse().expect("Invalid number");
// TODO: أنشئ مثيلات CPU و Memory باستخدام المدخلات المحللة
// TODO: أنشئ مثيل Computer مع الـ CPU و الـ Memory
// TODO: استدعِ system_info() على الـ computer لطباعة النتيجة
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت