خدمة تأجير المركبات
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 65 من 65.
التحدي
متوسطأنشئ خدمة لتأجير المركبات: مركبات من نوعين، وعقود تأجير، ووكالة تدير كليهما. الأسعار بالدولار الصحيح (int).
Vehicle في vehicle.gd:
- يستقبل المُنشئ
vinوmakeوmodelوdaily_rate؛ وتبدأ قيمةavailableبـtrue. start_rental() -> bool: يعيدfalseعندما لا تكون المركبة متاحة؛ وإلا يجعلها غير متاحة ويعيدtrue.end_rental()يجعلها متاحة مجددًا.- تعيد
_to_string()القيمةMAKE MODEL (VIN: VIN) - Available، أو- Rentedفي النهاية.
يمتد كل من Car في car.gd وMotorcycle في motorcycle.gd من Vehicle. يستقبل المُنشئ في كل منهما قيم المركبة الأربع، بالإضافة إلى seats للسيارة أو engine_size للدراجة النارية. تعتمد دالة _to_string() فيهما على نص الفئة الأب: Car: + نص المركبة + - 5 seats، وMotorcycle: + نص المركبة + - 600cc.
Rental في rental.gd:
- يستقبل المُنشئ
rental_idوكائنvehicleوcustomer_nameوdays؛ وتبدأ قيمةis_activeبـtrue. calculate_cost() -> int: السعر اليومي مضروبًا في عدد الأيام.end_rental() -> bool: يعيدfalseإذا كان عقد التأجير قد انتهى بالفعل؛ وإلا ينهيه، وينهي تأجير المركبة، ويعيدtrue._to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active، أو- Completed.
RentalAgency في rental_agency.gd:
- يستقبل المُنشئ
agency_name. يحتويvehiclesعلى قاموس يربط VIN بالمركبة، وrentalsعلى قاموس يربط معرّف عقد التأجير بالعقد، وتبدأ قيمةnext_rental_idبـ1. - تخزّن
add_vehicle(vehicle)المركبة باستخدام VIN الخاص بها كمفتاح. rent_vehicle(vin, customer_name, days) -> String: يعيد""إذا كان VIN غير معروف، أو كان عدد الأيام أقل من1، أو لم تكن المركبة متاحة. وإلا يبدأ تأجير المركبة، وينشئ عقدRentalبمعرّفR1أوR2... (لا يزداد العداد إلا عند نجاح التأجير)، ويخزّنه ثم يعيد المعرّف.return_vehicle(rental_id) -> bool: يعيدfalseإذا كان المعرّف غير معروف؛ وإلا يعيد القيمة التي تعيدها دالةend_rental()الخاصة بعقد التأجير.available_vehicles() -> Array[Vehicle]: يعيد المركبات المتاحة بترتيب إضافتها.total_revenue() -> int: مجموع تكاليف جميع عقود التأجير، النشطة منها والمنتهية.
يخزّن عقد التأجير مركبته، لكن المركبة لا تخزّن عقد تأجيرها، لذا لا يشير أي كائنين إلى بعضهما. في حالة الإدخال هذه:
Speedy Rentals
car C1|Toyota|Camry|50|5
moto M1|Honda|CBR|40|600
rent C1|Ana|3
rent C1|Ben|2
available
kind M1
rentals
revenueيكون الناتج:
Rented C1 as R1: $150
Cannot rent C1
Available at Speedy Rentals:
- Motorcycle: Honda CBR (VIN: M1) - Available - 600cc
M1: Vehicle true, Car false, Motorcycle true
Rental R1: Toyota Camry for Ana, 3 days, $150 - Active
Revenue: $150ضع شيفرتك في vehicle.gd وcar.gd وmotorcycle.gd وrental.gd وrental_agency.gd. يحتوي main.gd على شيفرة الإدخال/الإخراج المقدمة، ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# شفرة الإدخال والإخراج المقدَّمة: اتركها كما هي
var agency := RentalAgency.new(OS.read_string_from_stdin())
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"vehicle":
agency.add_vehicle(Vehicle.new(f[0], f[1], f[2], int(f[3])))
"car":
agency.add_vehicle(Car.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
"moto":
agency.add_vehicle(Motorcycle.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
"rent":
var rental_id: String = agency.rent_vehicle(f[0], f[1], int(f[2]))
if rental_id == "":
print("Cannot rent ", f[0])
else:
var rental: Rental = agency.rentals[rental_id]
print("Rented %s as %s: $%d" % [f[0], rental_id, rental.calculate_cost()])
"return":
print("Return ", f[0], ": ", agency.return_vehicle(f[0]))
"available":
print("Available at ", agency.agency_name, ":")
for vehicle in agency.available_vehicles():
print("- ", vehicle)
"fleet":
for vin in agency.vehicles:
print(agency.vehicles[vin])
"kind":
var vehicle: Vehicle = agency.vehicles[f[0]]
print("%s: Vehicle %s, Car %s, Motorcycle %s" % [f[0], vehicle is Vehicle, vehicle is Car, vehicle is Motorcycle])
"rentals":
for rental_id in agency.rentals:
print(agency.rentals[rental_id])
"revenue":
print("Revenue: $", agency.total_revenue())
line = OS.read_string_from_stdin()
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت