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

خدمة تأجير المركبات

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 110 من 110.

challenge icon

التحدي

سهل

تهانينا على وصولك إلى التحدي النهائي في دورة البرمجة كائنية التوجه (OOP)! لنقم ببناء خدمة تأجير مركبات (Vehicle Rental Service) شاملة تجمع كل ما تعلمته - الفئات المجردة (abstract classes)، الوراثة (inheritance)، التغليف (encapsulation)، نمط الحالة (State pattern)، نمط المصنع (Factory pattern)، والأنواع العامة (generics).

ستقوم خدمة التأجير الخاصة بك بإدارة أنواع مختلفة من المركبات، وتتبع حالات توفرها، ومعالجة عمليات التأجير، والاحتفاظ بسجلات العملاء. ستقوم بتنظيم ذلك عبر سبعة ملفات:

  • vehicle_state.dart: أنشئ فئة مجردة باسم VehicleState تحدد كيف تتصرف المركبات في حالات مختلفة. قم بتضمين تابع مجرد String getStatus() و bool canRent(). ثم أنشئ ثلاث حالات ملموسة (concrete states):
    • AvailableState - تعيد Available وتسمح بالتأجير.
    • RentedState - تعيد Rented ولا تسمح بالتأجير.
    • MaintenanceState - تعيد In Maintenance ولا تسمح بالتأجير.
  • vehicle.dart: أنشئ فئة مجردة باسم Vehicle تحتوي على معرف final id (String)، وطراز final model (String)، ومعدل يومي خاص _dailyRate (double) مع تابع جلب (getter)، وحالة خاصة _state (VehicleState) يتم تهيئتها بـ AvailableState. قم بتضمين:
    • تابع جلب status يعيد حالة الحالة الحالية.
    • bool isAvailable() - يتحقق مما إذا كانت الحالة الحالية تسمح بالتأجير.
    • void setState(VehicleState state) - يغير حالة المركبة.
    • تابع مجرد double calculateRentalCost(int days).
    • تابع مجرد String getRequirements() - يعيد أي متطلبات خاصة.
    قم بإعادة كتابة (Override) لـ toString() لتعيد [Type] model (id) - status حيث Type هو نوع وقت التشغيل (runtime type).
  • vehicles.dart: أنشئ ثلاثة أنواع من المركبات ترث من Vehicle:
    • Car - تكلفة التأجير القياسية هي المعدل اليومي مضروباً في عدد الأيام. المتطلبات: Valid driver's license
    • Motorcycle - تكلفة التأجير هي المعدل اليومي مضروباً في عدد الأيام مع خصم 10%. المتطلبات: Motorcycle license, Age 21+
    • Truck - تكلفة التأجير هي المعدل اليومي مضروباً في عدد الأيام بالإضافة إلى رسوم ثابتة قدرها 50 دولاراً. المتطلبات: Commercial license, Deposit required
  • vehicle_factory.dart: أنشئ فئة VehicleFactory مع تابع ثابت Vehicle create(String type, String id, String model, double dailyRate) يعيد المركبة المناسبة بناءً على النوع (car، motorcycle، أو truck). بالنسبة للأنواع غير المعروفة، اجعل الافتراضي هو إنشاء Car.
  • customer.dart: أنشئ فئة Customer تحتوي على id (String)، واسم name (String)، وقائمة خاصة من سجلات التأجير (قائمة من Strings). قم بتضمين:
    • addRental(String vehicleInfo) - يضيف سجل تأجير.
    • getRentalCount() - يعيد عدد عمليات التأجير.
    • bool isEligible() - يعيد true إذا كان لدى العميل أقل من 3 عمليات تأجير نشطة.
    قم بإعادة كتابة toString() لتعيد Customer: name (id) - X rentals.
  • rental_service.dart: أنشئ فئة RentalService باستخدام الأنواع العامة (generics) مع List<Vehicle> للأسطول و List<Customer> للعملاء. قم بتضمين:
    • addVehicle(Vehicle vehicle) - يضيف للمسطول، ويطبع Added: vehicle.toString()
    • registerCustomer(Customer customer) - يسجل العميل.
    • rentVehicle(String customerId, String vehicleId, int days) - إذا كان العميل موجوداً، ومؤهلاً، وكانت المركبة متاحة: يغير حالة المركبة إلى Rented، ويضيف التأجير للعميل، ويطبع customerId rented vehicleId for X days. Cost: $Y (Y منسقة إلى منزلتين عشريتين). خلاف ذلك، اطبع الرسالة المناسبة: Customer not found، Customer not eligible، Vehicle not found، أو Vehicle not available
    • returnVehicle(String vehicleId) - يضبط حالة المركبة إلى Available، ويطبع vehicleId returned
    • sendToMaintenance(String vehicleId) - يضبط حالة المركبة إلى Maintenance، ويطبع vehicleId sent to maintenance
    • getAvailableVehicles() - يعيد قائمة بالمركبات المتاحة.
  • main.dart: استعرض خدمة التأجير الخاصة بك. أنشئ RentalService واستخدم المصنع (factory) لإضافة ثلاث مركبات:
    • سيارة: V001، Toyota Camry، $45/اليوم
    • دراجة نارية: V002، Honda CBR، $35/اليوم
    • شاحنة: V003، Ford F-150، $75/اليوم
    قم بتسجيل عميل (C001، Alice Johnson) واطبع بيانات العميل. اطبع متطلبات الشاحنة. قم بتأجير السيارة لـ Alice لمدة 3 أيام. حاول تأجير السيارة مرة أخرى (يجب أن يفشل). أرسل الدراجة النارية للصيانة. اطبع عدد المركبات المتاحة بتنسيق Available vehicles: X. قم بإعادة السيارة. اطبع العدد النهائي للمركبات المتاحة.

المخرجات المتوقعة:

Added: [Car] Toyota Camry (V001) - Available
Added: [Motorcycle] Honda CBR (V002) - Available
Added: [Truck] Ford F-150 (V003) - Available
Customer: Alice Johnson (C001) - 0 rentals
Commercial license, Deposit required
C001 rented V001 for 3 days. Cost: $135.00
Vehicle not available
V002 sent to maintenance
Available vehicles: 1
V001 returned
Available vehicles: 2

جرّب بنفسك

import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';

void main() {
  // TODO: إنشاء مثيل (instance) من RentalService
  
  // TODO: استخدام VehicleFactory لإنشاء وإضافة ثلاث مركبات:
  // - Car: V001, Toyota Camry, $45/day
  // - Motorcycle: V002, Honda CBR, $35/day
  // - Truck: V003, Ford F-150, $75/day
  
  // TODO: تسجيل عميل (C001, Alice Johnson)
  
  // TODO: طباعة بيانات العميل
  
  // TODO: طباعة متطلبات الشاحنة (ابحث عن الشاحنة واستدعِ getRequirements())
  
  // TODO: تأجير السيارة (V001) لـ Alice (C001) لمدة 3 أيام
  
  // TODO: محاولة تأجير السيارة مرة أخرى (يجب أن تفشل - غير متاحة)
  
  // TODO: إرسال الدراجة النارية (V002) للصيانة
  
  // TODO: طباعة عدد المركبات المتاحة بصيغة 'Available vehicles: X'
  
  // TODO: إرجاع السيارة (V001)
  
  // TODO: طباعة العدد النهائي للمركبات المتاحة
}

جميع دروس Object Oriented Programming