Service de location de véhicules
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 110 sur 110.
Défi
FacileFélicitations pour avoir atteint le défi final du cours de POO ! Construisons un Service de Location de Véhicules complet qui rassemble tout ce que vous avez appris : classes abstraites, héritage, encapsulation, le pattern State, le pattern Factory et les génériques.
Votre service de location gérera différents types de véhicules, suivra leurs états de disponibilité, gérera les locations et tiendra à jour les dossiers des clients. Vous organiserez cela sur sept fichiers :
vehicle_state.dart: Créez une classe abstraiteVehicleStatequi définit le comportement des véhicules dans différents états. Incluez une méthode abstraiteString getStatus()etbool canRent(). Créez ensuite trois états concrets :AvailableState- retourneAvailableet autorise la locationRentedState- retourneRentedet n'autorise pas la locationMaintenanceState- retourneIn Maintenanceet n'autorise pas la location
vehicle.dart: Créez une classe abstraiteVehicleavec un idfinal(String), un modelfinal(String), un_dailyRateprivé (double) avec un getter, et un_stateprivé (VehicleState) initialisé àAvailableState. Incluez :- Un getter
statusqui retourne le statut de l'état bool isAvailable()- vérifie si l'état actuel autorise la locationvoid setState(VehicleState state)- change l'état du véhicule- Une méthode abstraite
double calculateRentalCost(int days) - Une méthode abstraite
String getRequirements()- retourne toutes les exigences particulières
toString()pour retourner[Type] model (id) - statusoù Type est le type d'exécution (runtime type).- Un getter
vehicles.dart: Créez trois types de véhicules étendantVehicle:Car- le coût de location standard est le tarif journalier multiplié par le nombre de jours. Exigences :Valid driver's licenseMotorcycle- le coût de location est le tarif journalier multiplié par le nombre de jours avec une remise de 10 %. Exigences :Motorcycle license, Age 21+Truck- le coût de location est le tarif journalier multiplié par le nombre de jours plus des frais fixes de 50 $. Exigences :Commercial license, Deposit required
vehicle_factory.dart: Créez une classeVehicleFactoryavec une méthode statiqueVehicle create(String type, String id, String model, double dailyRate)qui retourne le véhicule approprié en fonction du type (car,motorcycle, outruck). Pour les types inconnus, créez par défaut une Car.customer.dart: Créez une classeCustomeravec un id (String), un name (String), et une liste privée d'enregistrements de location (liste de Strings). Incluez :addRental(String vehicleInfo)- ajoute un enregistrement de locationgetRentalCount()- retourne le nombre de locationsbool isEligible()- retourne true si le client a moins de 3 locations actives
toString()pour retournerCustomer: name (id) - X rentals.rental_service.dart: Créez une classeRentalServiceutilisant les génériques avec uneList<Vehicle>pour la flotte et uneList<Customer>pour les clients. Incluez :addVehicle(Vehicle vehicle)- ajoute à la flotte, afficheAdded: vehicle.toString()registerCustomer(Customer customer)- enregistre le clientrentVehicle(String customerId, String vehicleId, int days)- si le client existe, est éligible, et que le véhicule est disponible : change l'état du véhicule en Rented, ajoute la location au client, affichecustomerId rented vehicleId for X days. Cost: $Y(Y formaté à 2 décimales). Sinon, affichez le message approprié :Customer not found,Customer not eligible,Vehicle not found, ouVehicle not availablereturnVehicle(String vehicleId)- définit l'état du véhicule sur Available, affichevehicleId returnedsendToMaintenance(String vehicleId)- définit l'état du véhicule sur Maintenance, affichevehicleId sent to maintenancegetAvailableVehicles()- retourne une liste des véhicules disponibles
main.dart: Démontrez votre service de location. Créez unRentalServiceet utilisez la factory pour ajouter trois véhicules :- Une voiture :
V001,Toyota Camry, 45 $/jour - Une moto :
V002,Honda CBR, 35 $/jour - Un camion :
V003,Ford F-150, 75 $/jour
C001,Alice Johnson) et affichez le client. Affichez les exigences du camion. Louez la voiture à Alice pour 3 jours. Essayez de louer à nouveau la voiture (cela devrait échouer). Envoyez la moto en maintenance. Affichez combien de véhicules sont disponibles sous la formeAvailable vehicles: X. Rendez la voiture. Affichez le nombre final de véhicules disponibles.- Une voiture :
Sortie attendue :
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: 2Essayez vous-même
import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';
void main() {
// TODO: Créer une instance de RentalService
// TODO: Utiliser VehicleFactory pour créer et ajouter trois véhicules :
// - Car: V001, Toyota Camry, $45/day
// - Motorcycle: V002, Honda CBR, $35/day
// - Truck: V003, Ford F-150, $75/day
// TODO: Enregistrer un client (C001, Alice Johnson)
// TODO: Afficher le client
// TODO: Afficher les exigences du camion (trouver le camion et appeler getRequirements())
// TODO: Louer la voiture (V001) à Alice (C001) pour 3 jours
// TODO: Essayer de louer à nouveau la voiture (devrait échouer - non disponible)
// TODO: Envoyer la moto (V002) en maintenance
// TODO: Afficher le nombre de véhicules disponibles sous la forme 'Available vehicles: X'
// TODO: Retourner la voiture (V001)
// TODO: Afficher le nombre final de véhicules disponibles
}
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie17Défis finaux
Plateforme d'E-LearningSystème bancaireSystème de personnages de jeuService de location de véhicules3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository