Service de location de véhicules
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 65 sur 65.
Défi
MoyenConstruisez un service de location de véhicules : des véhicules de deux types, des locations et l’agence qui gère les deux. Les prix sont exprimés en dollars entiers (int).
Vehicle dans vehicle.gd :
- Le constructeur prend
vin,make,modeletdaily_rate;availablevaut initialementtrue. start_rental() -> bool: renvoiefalselorsque le véhicule n’est pas disponible ; sinon, le marque comme indisponible et renvoietrue.end_rental()le rend à nouveau disponible._to_string()renvoieMAKE MODEL (VIN: VIN) - Available, ou- Rentedà la fin.
Car dans car.gd et Motorcycle dans motorcycle.gd étendent Vehicle. Leurs constructeurs prennent les quatre valeurs du véhicule ainsi que seats (voiture) ou engine_size (moto). Leur _to_string() s’appuie sur le texte de la classe parente : Car: + le texte du véhicule + - 5 seats, et Motorcycle: + le texte du véhicule + - 600cc.
Rental dans rental.gd :
- Le constructeur prend
rental_id, l’objetvehicle,customer_nameetdays;is_activevaut initialementtrue. calculate_cost() -> int: le tarif journalier multiplié par le nombre de jours.end_rental() -> bool:falsepour une location déjà terminée ; sinon, la termine, termine la location du véhicule et renvoietrue._to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, ou- Completed.
RentalAgency dans rental_agency.gd :
- Le constructeur prend
agency_name.vehiclesest un dictionnaire associant chaque VIN à un véhicule,rentalsun dictionnaire associant chaque identifiant de location à une location, etnext_rental_idcommence à1. add_vehicle(vehicle)stocke un véhicule sous son VIN.rent_vehicle(vin, customer_name, days) -> String: renvoie""si le VIN est inconnu, si la durée est inférieure à1jour ou si le véhicule n’est pas disponible. Sinon, la location du véhicule commence, une instance deRentalest créée avec l’identifiantR1,R2... (le compteur n’augmente qu’en cas de location réussie), puis stockée, et l’identifiant est renvoyé.return_vehicle(rental_id) -> bool: renvoiefalsesi l’identifiant est inconnu ; sinon, renvoie la valeur renvoyée parend_rental()de la location.available_vehicles() -> Array[Vehicle]: les véhicules disponibles, dans l’ordre où ils ont été ajoutés.total_revenue() -> int: la somme des coûts de toutes les locations, actives ou terminées.
Une location stocke son véhicule, mais un véhicule ne stocke pas sa location : aucun objet ne pointe donc vers l’autre. Pour cette entrée :
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
revenuela sortie est :
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: $150Votre code va dans vehicle.gd, car.gd, motorcycle.gd, rental.gd et rental_agency.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d’entrée/sortie fourni : conservez-le tel quel
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()
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy12Défis finaux
Plateforme d’apprentissage en ligneSystème bancaireDéveloppement d’un personnage de jeuService de location de véhiculesEntraînez-vous par vous-même : Compilateur GDScript en ligne