Servizio di noleggio veicoli
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 110 di 110.
Sfida
FacileCongratulazioni 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 astrattaVehicleStateche definisce il comportamento dei veicoli nei diversi stati. Includi un metodo astrattoString getStatus()ebool canRent(). Poi crea tre stati concreti:AvailableState- restituisceAvailablee consente il noleggioRentedState- restituisceRentede non consente il noleggioMaintenanceState- restituisceIn Maintenancee non consente il noleggio
vehicle.dart: crea una classe astrattaVehiclecon un idfinal(String), un modelfinal(String), un_dailyRateprivato (double) con un getter e uno_stateprivato (VehicleState) inizializzato aAvailableState. Includi:- Un getter
statusche restituisce lo stato del veicolo bool isAvailable()- verifica se lo stato attuale consente il noleggiovoid setState(VehicleState state)- modifica lo stato del veicolo- Un metodo astratto
double calculateRentalCost(int days) - Un metodo astratto
String getRequirements()- restituisce eventuali requisiti speciali
toString()in modo che restituisca[Type] model (id) - status, dove Type è il tipo a runtime.- Un getter
vehicles.dart: crea tre tipi di veicoli che estendonoVehicle:Car- il costo standard del noleggio è la tariffa giornaliera moltiplicata per il numero di giorni. Requisiti:Valid driver's licenseMotorcycle- 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 classeVehicleFactorycon un metodo staticoVehicle create(String type, String id, String model, double dailyRate)che restituisce il veicolo appropriato in base al tipo (car,motorcycleotruck). Per i tipi sconosciuti, crea per impostazione predefinita un Car.customer.dart: crea una classeCustomercon 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 noleggiogetRentalCount()- restituisce il numero di noleggibool isEligible()- restituisce true se il cliente ha meno di 3 noleggi attivi
toString()in modo che restituiscaCustomer: name (id) - X rentals.rental_service.dart: crea una classeRentalServiceusando i generics, con unaList<Vehicle>per il parco veicoli e unaList<Customer>per i clienti. Includi:addVehicle(Vehicle vehicle)- aggiunge un veicolo al parco e stampaAdded: vehicle.toString()registerCustomer(Customer customer)- aggiunge un clienterentVehicle(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 stampacustomerId 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 foundoppureVehicle not availablereturnVehicle(String vehicleId)- imposta lo stato del veicolo su Available e stampavehicleId returnedsendToMaintenance(String vehicleId)- imposta lo stato del veicolo su Maintenance e stampavehicleId sent to maintenancegetAvailableVehicles()- restituisce un elenco di veicoli disponibili
main.dart: mostra il funzionamento del servizio di noleggio. Crea unRentalServicee 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
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 formatoAvailable vehicles: X. Restituisci l'auto. Stampa il conteggio finale dei veicoli disponibili.- Un'auto:
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: 2Provalo 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
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy17Sfide finali
Piattaforma di e-learningSistema bancarioSistema di personaggi di giocoServizio di noleggio veicoli3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online