Servizio di noleggio veicoli
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 65 di 65.
Sfida
MedioCrea un servizio di noleggio veicoli: veicoli di due tipi, noleggi e l’agenzia che gestisce entrambi. I prezzi sono espressi in dollari interi (int).
Vehicle in vehicle.gd:
- Il costruttore accetta
vin,make,modeledaily_rate;availableinizia con il valoretrue. start_rental() -> bool: restituiscefalsequando il veicolo non è disponibile; altrimenti lo segna come non disponibile e restituiscetrue.end_rental()lo rende nuovamente disponibile._to_string()restituisceMAKE MODEL (VIN: VIN) - Available, oppure termina con- Rented.
Car in car.gd e Motorcycle in motorcycle.gd estendono Vehicle. I loro costruttori accettano i quattro valori del veicolo più seats (auto) oppure engine_size (motocicletta). Il loro _to_string() si basa sul testo della classe genitore: Car: + testo del veicolo + - 5 seats, e Motorcycle: + testo del veicolo + - 600cc.
Rental in rental.gd:
- Il costruttore accetta
rental_id, l’oggettovehicle,customer_nameedays;is_activeinizia con il valoretrue. calculate_cost() -> int: la tariffa giornaliera moltiplicata per il numero di giorni.end_rental() -> bool: restituiscefalseper un noleggio già terminato; altrimenti lo termina, termina il noleggio del veicolo e restituiscetrue._to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Active, oppure- Completed.
RentalAgency in rental_agency.gd:
- Il costruttore accetta
agency_name.vehiclesè un dizionario che associa il VIN al veicolo,rentalsè un dizionario che associa l’id del noleggio al noleggio enext_rental_idinizia da1. add_vehicle(vehicle)memorizza un veicolo usando il suo VIN come chiave.rent_vehicle(vin, customer_name, days) -> String: restituisce""se il VIN è sconosciuto, se il noleggio dura meno di1giorno o se il veicolo non è disponibile. Altrimenti avvia il noleggio del veicolo, crea unRentalcon l’idR1,R2... (il contatore aumenta solo in caso di noleggio riuscito), lo memorizza e restituisce l’id.return_vehicle(rental_id) -> bool: restituiscefalseper un id sconosciuto; altrimenti restituisce il valore restituito daend_rental()del noleggio.available_vehicles() -> Array[Vehicle]: i veicoli disponibili, nell’ordine in cui sono stati aggiunti.total_revenue() -> int: la somma dei costi di tutti i noleggi, attivi o completati.
Un noleggio memorizza il proprio veicolo, ma un veicolo non memorizza il proprio noleggio, quindi nessuna coppia di oggetti punta l’uno all’altro. Con questo input:
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
revenuel’output è:
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: $150Il tuo codice va inserito in vehicle.gd, car.gd, motorcycle.gd, rental.gd e rental_agency.gd. main.gd contiene il codice fornito per l’input/output e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
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()
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern Strategy12Sfide finali
Piattaforma di e-learningSistema bancarioSviluppo di un personaggio di giocoServizio di noleggio veicoliEsercitati da solo: Compilatore GDScript online