Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Fé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 abstraite VehicleState qui définit le comportement des véhicules dans différents états. Incluez une méthode abstraite String getStatus() et bool canRent(). Créez ensuite trois états concrets :
    • AvailableState - retourne Available et autorise la location
    • RentedState - retourne Rented et n'autorise pas la location
    • MaintenanceState - retourne In Maintenance et n'autorise pas la location
  • vehicle.dart : Créez une classe abstraite Vehicle avec un id final (String), un model final (String), un _dailyRate privé (double) avec un getter, et un _state privé (VehicleState) initialisé à AvailableState. Incluez :
    • Un getter status qui retourne le statut de l'état
    • bool isAvailable() - vérifie si l'état actuel autorise la location
    • void 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
    Surchargez toString() pour retourner [Type] model (id) - status où Type est le type d'exécution (runtime type).
  • vehicles.dart : Créez trois types de véhicules étendant Vehicle :
    • Car - le coût de location standard est le tarif journalier multiplié par le nombre de jours. Exigences : Valid driver's license
    • Motorcycle - 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 classe VehicleFactory avec une méthode statique Vehicle create(String type, String id, String model, double dailyRate) qui retourne le véhicule approprié en fonction du type (car, motorcycle, ou truck). Pour les types inconnus, créez par défaut une Car.
  • customer.dart : Créez une classe Customer avec 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 location
    • getRentalCount() - retourne le nombre de locations
    • bool isEligible() - retourne true si le client a moins de 3 locations actives
    Surchargez toString() pour retourner Customer: name (id) - X rentals.
  • rental_service.dart : Créez une classe RentalService utilisant les génériques avec une List<Vehicle> pour la flotte et une List<Customer> pour les clients. Incluez :
    • addVehicle(Vehicle vehicle) - ajoute à la flotte, affiche Added: vehicle.toString()
    • registerCustomer(Customer customer) - enregistre le client
    • rentVehicle(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, affiche customerId 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, ou Vehicle not available
    • returnVehicle(String vehicleId) - définit l'état du véhicule sur Available, affiche vehicleId returned
    • sendToMaintenance(String vehicleId) - définit l'état du véhicule sur Maintenance, affiche vehicleId sent to maintenance
    • getAvailableVehicles() - retourne une liste des véhicules disponibles
  • main.dart : Démontrez votre service de location. Créez un RentalService et 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
    Enregistrez un client (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 forme Available vehicles: X. Rendez la voiture. Affichez le nombre final de véhicules disponibles.

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: 2

Essayez 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