Menu
Coddy logo textTech

Servizio di noleggio veicoli

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 110 di 110.

challenge icon

Sfida

Facile

Congratulazioni per aver raggiunto la sfida finale del corso di OOP! Creiamo un Servizio di noleggio veicoli completo che riunisce tutto ciò che hai imparato: classi astratte, ereditarietà, incapsulamento, il pattern State, il pattern Factory e i generics.

Il tuo servizio di noleggio gestirà diversi tipi di veicoli, ne terrà traccia dello stato di disponibilità, gestirà i noleggi e manterrà i dati dei clienti. Organizzerai tutto in sette file:

  • vehicle_state.dart: crea una classe astratta VehicleState che definisce il comportamento dei veicoli nei diversi stati. Includi un metodo astratto String getStatus() e bool canRent(). Poi crea tre stati concreti:
    • AvailableState - restituisce Available e consente il noleggio
    • RentedState - restituisce Rented e non consente il noleggio
    • MaintenanceState - restituisce In Maintenance e non consente il noleggio
  • vehicle.dart: crea una classe astratta Vehicle con un id final (String), un model final (String), un _dailyRate privato (double) con un getter e uno _state privato (VehicleState) inizializzato a AvailableState. Includi:
    • Un getter status che restituisce lo stato del veicolo
    • bool isAvailable() - verifica se lo stato attuale consente il noleggio
    • void setState(VehicleState state) - modifica lo stato del veicolo
    • Un metodo astratto double calculateRentalCost(int days)
    • Un metodo astratto String getRequirements() - restituisce eventuali requisiti speciali
    Ridefinisci toString() in modo che restituisca [Type] model (id) - status, dove Type è il tipo a runtime.
  • vehicles.dart: crea tre tipi di veicoli che estendono Vehicle:
    • Car - il costo standard del noleggio è la tariffa giornaliera moltiplicata per il numero di giorni. Requisiti: Valid driver's license
    • Motorcycle - il costo del noleggio è la tariffa giornaliera moltiplicata per il numero di giorni, con uno sconto del 10%. Requisiti: Motorcycle license, Age 21+
    • Truck - il costo del noleggio è la tariffa giornaliera moltiplicata per il numero di giorni, più una tariffa fissa di $50. Requisiti: Commercial license, Deposit required
  • vehicle_factory.dart: crea una classe VehicleFactory con un metodo statico Vehicle create(String type, String id, String model, double dailyRate) che restituisce il veicolo appropriato in base al tipo (car, motorcycle o truck). Per i tipi sconosciuti, crea per impostazione predefinita un Car.
  • customer.dart: crea una classe Customer con un id (String), un name (String) e un elenco privato di registrazioni di noleggio (elenco di String). Includi:
    • addRental(String vehicleInfo) - aggiunge una registrazione di noleggio
    • getRentalCount() - restituisce il numero di noleggi
    • bool isEligible() - restituisce true se il cliente ha meno di 3 noleggi attivi
    Ridefinisci toString() in modo che restituisca Customer: name (id) - X rentals.
  • rental_service.dart: crea una classe RentalService usando i generics, con una List<Vehicle> per il parco veicoli e una List<Customer> per i clienti. Includi:
    • addVehicle(Vehicle vehicle) - aggiunge un veicolo al parco e stampa Added: vehicle.toString()
    • registerCustomer(Customer customer) - aggiunge un cliente
    • rentVehicle(String customerId, String vehicleId, int days) - se il cliente esiste, ha i requisiti e il veicolo è disponibile: cambia lo stato del veicolo in Rented, aggiunge il noleggio al cliente e stampa customerId rented vehicleId for X days. Cost: $Y (Y formattato con 2 decimali). Altrimenti stampa il messaggio appropriato: Customer not found, Customer not eligible, Vehicle not found oppure Vehicle not available
    • returnVehicle(String vehicleId) - imposta lo stato del veicolo su Available e stampa vehicleId returned
    • sendToMaintenance(String vehicleId) - imposta lo stato del veicolo su Maintenance e stampa vehicleId sent to maintenance
    • getAvailableVehicles() - restituisce un elenco di veicoli disponibili
  • main.dart: mostra il funzionamento del servizio di noleggio. Crea un RentalService e usa la factory per aggiungere tre veicoli:
    • Un'auto: V001, Toyota Camry, $45 al giorno
    • Una motocicletta: V002, Honda CBR, $35 al giorno
    • Un camion: V003, Ford F-150, $75 al giorno
    Registra un cliente (C001, Alice Johnson) e stampa i dati del cliente. Stampa i requisiti del camion. Noleggia l'auto ad Alice per 3 giorni. Prova a noleggiare di nuovo l'auto (dovrebbe non riuscire). Invia la motocicletta in manutenzione. Stampa quanti veicoli sono disponibili nel formato Available vehicles: X. Restituisci l'auto. Stampa il conteggio finale dei veicoli disponibili.

Risultato atteso:

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

Provalo tu

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

void main() {
  // TODO: Crea un'istanza di RentalService
  
  // TODO: Usa VehicleFactory per creare e aggiungere tre veicoli:
  // - Auto: V001, Toyota Camry, $45/giorno
  // - Motocicletta: V002, Honda CBR, $35/giorno
  // - Camion: V003, Ford F-150, $75/giorno
  
  // TODO: Registra un cliente (C001, Alice Johnson)
  
  // TODO: Stampa il cliente
  
  // TODO: Stampa i requisiti del camion (trova il camion e chiama getRequirements())
  
  // TODO: Noleggia l'auto (V001) ad Alice (C001) per 3 giorni
  
  // TODO: Prova a noleggiare di nuovo l'auto (l'operazione dovrebbe fallire: non è disponibile)
  
  // TODO: Manda la motocicletta (V002) in manutenzione
  
  // TODO: Stampa il numero di veicoli disponibili nel formato 'Available vehicles: X'
  
  // TODO: Restituisci l'auto (V001)
  
  // TODO: Stampa il numero finale di veicoli disponibili
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online