Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التركيب

جزء من قسم البرمجة كائنية التوجه في رحلة 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 لدراجة نارية؟ ما عليك سوى تضمينها في بنية جديدة. يمنحك التركيب مرونة من دون الاقتران الوثيق الذي غالبًا ما ينشئه التوريث.

challenge icon

التحدي

سهل

لنبنِ نظام كمبيوتر باستخدام التركيب! بدلًا من إنشاء بنية struct واحدة ضخمة، ستُركّب Computer من مكوّنات أصغر ومركّزة: CPU وMemory. سيعرف كل مكوّن كيفية وصف نفسه، وسيفوّض Computer المهمة إلى أجزائه.

ستُنظّم الكود عبر ثلاثة ملفات:

  • cpu.rs: عرّف بنية CPU عامة public تحتوي على حقلين عامين public: cores (u32) لعدد الأنوية، وspeed_ghz (f32) لسرعة الساعة. أضف specs method تُعيد String يصف CPU بالتنسيق {cores}-core @ {speed_ghz}GHz.
  • memory.rs: عرّف بنية Memory عامة public تحتوي على حقل عام public هو size_gb (u32) لحجم الذاكرة. أضف specs method تُعيد String بالتنسيق {size_gb}GB RAM.
  • main.rs: استورد كلتا الوحدتين وأنشئ بنية Computer عامة public has حقل cpu من النوع CPU وحقل memory من النوع Memory. Implement system_info method على 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 لطباعة النتيجة
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Rust عبر الإنترنت