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 d’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, pattern State, pattern Factory et génériques.
Votre service de location gérera différents types de véhicules, suivra leurs états de disponibilité, traitera les locations et conservera les informations des clients. Vous organiserez tout 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- renvoieAvailableet autorise la locationRentedState- renvoieRentedet n’autorise pas la locationMaintenanceState- renvoieIn Maintenanceet n’autorise pas la location
vehicle.dart: créez une classe abstraiteVehicleavec un identifiantfinal(String), un modèlefinal(String), un_dailyRateprivé (double) avec un getter, et un_stateprivé (VehicleState) initialisé àAvailableState. Incluez :- Un getter
statusqui renvoie l’état du véhicule bool isAvailable()- vérifie si l’état actuel autorise la locationvoid setState(VehicleState state)- modifie l’état du véhicule- Une méthode abstraite
double calculateRentalCost(int days) - Une méthode abstraite
String getRequirements()- renvoie les éventuelles exigences particulières
toString()pour renvoyer[Type] model (id) - status, où Type correspond au type d’exécution.- Un getter
vehicles.dart: créez trois types de véhicules qui étendentVehicle:Car- le coût standard de location correspond au tarif journalier multiplié par le nombre de jours. Exigences :Valid driver's licenseMotorcycle- le coût de location correspond au tarif journalier multiplié par le nombre de jours, avec une remise de 10 %. Exigences :Motorcycle license, Age 21+Truck- le coût de location correspond au tarif journalier multiplié par le nombre de jours, auquel s’ajoute un forfait fixe 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 renvoie le véhicule approprié selon le type (car,motorcycleoutruck). Pour les types inconnus, créez par défaut une voiture Car.customer.dart: créez une classeCustomeravec un identifiant (String), un nom (String) et une liste privée de locations (liste de Strings). Incluez :addRental(String vehicleInfo)- ajoute une locationgetRentalCount()- renvoie le nombre de locationsbool isEligible()- renvoie true si le client a moins de 3 locations actives
toString()pour renvoyerCustomer: name (id) - X rentals.rental_service.dart: créez une classeRentalServiceutilisant les génériques, avec unList<Vehicle>pour le parc et unList<Customer>pour les clients. Incluez :addVehicle(Vehicle vehicle)- ajoute le véhicule au parc et afficheAdded: vehicle.toString()registerCustomer(Customer customer)- ajoute le clientrentVehicle(String customerId, String vehicleId, int days)- si le client existe, est éligible et que le véhicule est disponible : fait passer l’état du véhicule à Rented, ajoute la location au client et affichecustomerId rented vehicleId for X days. Cost: $Y(Y étant formaté avec 2 décimales). Sinon, affiche le message approprié :Customer not found,Customer not eligible,Vehicle not foundouVehicle not availablereturnVehicle(String vehicleId)- définit l’état du véhicule sur Available et affichevehicleId returnedsendToMaintenance(String vehicleId)- définit l’état du véhicule sur Maintenance et affichevehicleId sent to maintenancegetAvailableVehicles()- renvoie une liste des véhicules disponibles
main.dart: démontrez le fonctionnement de 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 (ce qui doit échouer). Envoyez la moto en maintenance. Affichez le nombre de véhicules disponibles sous la formeAvailable vehicles: X. Retournez 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
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy17Défis finaux
Plateforme d’apprentissage en ligneSystème bancaireSystème de personnages de jeuService de location de véhicules3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne