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 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 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 - renvoie Available et autorise la location
    • RentedState - renvoie Rented et n’autorise pas la location
    • MaintenanceState - renvoie In Maintenance et n’autorise pas la location
  • vehicle.dart : créez une classe abstraite Vehicle avec un identifiant final (String), un modèle final (String), un _dailyRate privé (double) avec un getter, et un _state privé (VehicleState) initialisé à AvailableState. Incluez :
    • Un getter status qui renvoie l’état du véhicule
    • bool isAvailable() - vérifie si l’état actuel autorise la location
    • void 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
    Surchargez toString() pour renvoyer [Type] model (id) - status, où Type correspond au type d’exécution.
  • vehicles.dart : créez trois types de véhicules qui étendent Vehicle :
    • Car - le coût standard de location correspond au tarif journalier multiplié par le nombre de jours. Exigences : Valid driver's license
    • Motorcycle - 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 classe VehicleFactory avec une méthode statique Vehicle create(String type, String id, String model, double dailyRate) qui renvoie le véhicule approprié selon le type (car, motorcycle ou truck). Pour les types inconnus, créez par défaut une voiture Car.
  • customer.dart : créez une classe Customer avec un identifiant (String), un nom (String) et une liste privée de locations (liste de Strings). Incluez :
    • addRental(String vehicleInfo) - ajoute une location
    • getRentalCount() - renvoie le nombre de locations
    • bool isEligible() - renvoie true si le client a moins de 3 locations actives
    Surchargez toString() pour renvoyer Customer: name (id) - X rentals.
  • rental_service.dart : créez une classe RentalService utilisant les génériques, avec un List<Vehicle> pour le parc et un List<Customer> pour les clients. Incluez :
    • addVehicle(Vehicle vehicle) - ajoute le véhicule au parc et affiche Added: vehicle.toString()
    • registerCustomer(Customer customer) - ajoute le client
    • rentVehicle(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 affiche customerId 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 found ou Vehicle not available
    • returnVehicle(String vehicleId) - définit l’état du véhicule sur Available et affiche vehicleId returned
    • sendToMaintenance(String vehicleId) - définit l’état du véhicule sur Maintenance et affiche vehicleId sent to maintenance
    • getAvailableVehicles() - renvoie une liste des véhicules disponibles
  • main.dart : démontrez le fonctionnement de 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 (ce qui doit échouer). Envoyez la moto en maintenance. Affichez le nombre de véhicules disponibles sous la forme Available vehicles: X. Retournez 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

Entraînez-vous par vous-même : Compilateur Dart en ligne