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

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

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

challenge icon

التحدي

متوسط

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

  • vehicle.py - تنفيذ الفئة الأساسية Vehicle
  • car.py - تنفيذ الفئة الفرعية Car
  • motorcycle.py - تنفيذ الفئة الفرعية Motorcycle
  • rental.py - تنفيذ الفئة Rental
  • rentalagency.py - تنفيذ الفئة RentalAgency

يحتوي كل ملف على تعليقات TODO مفصلة توجهك خلال التنفيذ. اتبع هذه التعليقات للتأكد من أن الكود الخاص بك يلبي جميع المتطلبات.

ورقة مرجعية

يركز هذا التحدي على تنفيذ نظام لتأجير المركبات باستخدام مبادئ البرمجة كائنية التوجه بما في ذلك الوراثة والتغليف. يتكون النظام من فئات متعددة تعمل معاً لنمذجة عمل تجاري كامل للتأجير.

يتضمن التنفيذ إنشاء:

  • فئة Vehicle أساسية تحتوي على خصائص وطرق (methods) مشتركة
  • فئات فرعية Car و Motorcycle ترث من Vehicle
  • فئة Rental لإدارة معاملات التأجير الفردية
  • فئة RentalAgency لتنسيق نظام التأجير بالكامل

جرّب بنفسك

from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from rental import Rental
from rentalagency import RentalAgency

# معالج حالات الاختبار الشاملة
test_case = input()

if test_case == "create_vehicles":
    # اختبار إنشاء المركبات
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    
    print(car)
    print(bike)

elif test_case == "rental_workflow":
    # اختبار سير عمل التأجير
    agency = RentalAgency("Quick Rentals")
    
    # إضافة المركبات
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    agency.add_vehicle(car)
    agency.add_vehicle(bike)
    
    # التحقق من المركبات المتاحة
    print(f"Available before rental: {len(agency.available_vehicles())}")
    
    # استئجار مركبة
    rental_id = agency.rent_vehicle("C123", "John Doe", 3)
    print(f"Rental created: {rental_id}")
    
    # التحقق من المركبات المتاحة بعد التأجير
    print(f"Available after rental: {len(agency.available_vehicles())}")
    
    # إرجاع المركبة
    agency.return_vehicle(rental_id)
    
    # التحقق من المركبات المتاحة بعد الإرجاع
    print(f"Available after return: {len(agency.available_vehicles())}")

elif test_case == "rental_cost":
    # اختبار حساب تكلفة التأجير
    car = Car("C123", "Toyota", "Camry", 50, 5)
    rental = Rental("R1", car, "John Doe", 3)
    print(f"Rental cost for 3 days: ${rental.calculate_cost()}")

elif test_case == "vehicle_methods":
    # اختبار دوال المركبة (Vehicle)
    vehicle = Vehicle("V789", "Generic", "Vehicle", 25)
    print(vehicle)
    print(f"Start rental: {vehicle.start_rental()}")
    print(f"Start rental again: {vehicle.start_rental()}")
    print(f"End rental: {vehicle.end_rental()}")
    print(f"Start rental after end: {vehicle.start_rental()}")

elif test_case == "inheritance_check":
    # اختبار علاقات الوراثة
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    
    print(f"Car is a Vehicle: {isinstance(car, Vehicle)}")
    print(f"Motorcycle is a Vehicle: {isinstance(bike, Vehicle)}")
    print(f"Car is a Motorcycle: {isinstance(car, Motorcycle)}")

elif test_case == "polymorphism":
    # اختبار سلوك تعدد الأشكال (Polymorphism)
    vehicles = [
        Vehicle("V789", "Generic", "Vehicle", 25),
        Car("C123", "Toyota", "Camry", 50, 5),
        Motorcycle("M456", "Honda", "CBR", 35, 600)
    ]
    
    for i, v in enumerate(vehicles):
        print(f"Vehicle {i+1}: {v}")

elif test_case == "rental_edge_cases":
    # اختبار الحالات الاستثنائية للتأجير
    agency = RentalAgency("Edge Rentals")
    
    # محاولة استئجار مركبة غير موجودة
    print(f"Rent non-existent: {agency.rent_vehicle('X999', 'John Doe', 3)}")
    
    # إضافة سيارة واستئجارها
    car = Car("C123", "Toyota", "Camry", 50, 5)
    agency.add_vehicle(car)
    rental_id = agency.rent_vehicle("C123", "John Doe", 3)
    print(f"Valid rental: {rental_id}")
    
    # محاولة استئجار نفس السيارة مرة أخرى
    print(f"Rent unavailable car: {agency.rent_vehicle('C123', 'Jane Smith', 2)}")
    
    # محاولة إرجاع تأجير غير موجود
    print(f"Return non-existent rental: {agency.return_vehicle('R999')}")
    
    # إرجاع التأجير الصحيح
    print(f"Return valid rental: {agency.return_vehicle(rental_id)}")
    
    # محاولة إرجاع نفس التأجير مرة أخرى
    print(f"Return completed rental: {agency.return_vehicle(rental_id)}")

elif test_case == "agency_operations":
    # اختبار عمليات الوكالة الشاملة
    agency = RentalAgency("Full Service Rentals")
    
    # إضافة 5 مركبات
    vehicles = [
        Car("C1", "Toyota", "Camry", 50, 5),
        Car("C2", "Honda", "Accord", 55, 5),
        Car("C3", "Ford", "Focus", 45, 5),
        Motorcycle("M1", "Honda", "CBR", 35, 600),
        Motorcycle("M2", "Yamaha", "R1", 40, 1000)
    ]
    
    for v in vehicles:
        agency.add_vehicle(v)
    
    print(f"Available vehicles: {len(agency.available_vehicles())}")
    
    # استئجار 3 مركبات
    rental_ids = [
        agency.rent_vehicle("C1", "Customer 1", 3),
        agency.rent_vehicle("C2", "Customer 2", 5),
        agency.rent_vehicle("M1", "Customer 3", 2)
    ]
    
    print(f"Available after rentals: {len(agency.available_vehicles())}")
    
    # إرجاع مركبتين
    agency.return_vehicle(rental_ids[0])
    agency.return_vehicle(rental_ids[1])
    
    print(f"Available after returns: {len(agency.available_vehicles())}")
    
    # طباعة المركبات المتاحة
    print("Available vehicles:")
    for v in agency.available_vehicles():
        print(f"  {v}")

elif test_case == "stress_test":
    # اختبار الضغط مع العديد من المركبات
    agency = RentalAgency("Stress Test Rentals")
    
    # إضافة 100 مركبة
    for i in range(100):
        if i % 2 == 0:
            vehicle = Car(f"C{i}", "Make{i}", f"Model{i}", 50, 5)
        else:
            vehicle = Motorcycle(f"M{i}", "Make{i}", f"Model{i}", 35, 600)
        agency.add_vehicle(vehicle)
    
    # استئجار 50 مركبة
    rental_ids = []
    for i in range(50):
        vin = f"C{i*2}" if i % 2 == 0 else f"M{i*2-1}"
        rental_id = agency.rent_vehicle(vin, f"Customer{i}", 3)
        rental_ids.append(rental_id)
    
    print(f"Available after 50 rentals: {len(agency.available_vehicles())}")
    
    # إرجاع جميع التأجيرات
    for rental_id in rental_ids:
        agency.return_vehicle(rental_id)
    
    print(f"Available after all returns: {len(agency.available_vehicles())}")

elif test_case == "invalid_inputs":
    # اختبار المدخلات غير الصالحة
    car = Car("C123", "Toyota", "Camry", -50, 5)
    print(f"Car with negative rate: {car}")
    
    bike = Motorcycle("M456", "Honda", "CBR", 35, 0)
    print(f"Motorcycle with zero engine: {bike}")
    
    rental_zero = Rental("R1", car, "John Doe", 0)
    print(f"Rental with zero days cost: ${rental_zero.calculate_cost()}")
    
    rental_neg = Rental("R2", car, "Jane Smith", -3)
    print(f"Rental with negative days cost: ${rental_neg.calculate_cost()}")

جميع دروس Object Oriented Programming