Menu
Coddy logo textTech

Service de location de véhicules

Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 70 sur 70.

challenge icon

Défi

Facile

Construisons un service de location de véhicules qui réunit l'héritage, les interfaces et le patron de conception Strategy ! Vous allez créer un système où différents types de véhicules peuvent être loués en utilisant des stratégies de tarification flexibles - démontrant ainsi comment la POO permet une logique métier maintenable et extensible.

Vous organiserez votre code sur six fichiers :

  • Vehicle.cs : Créez votre hiérarchie de véhicules dans l'espace de noms Rental.Models. La classe de base Vehicle doit avoir des propriétés en lecture seule LicensePlate et Brand, un DailyRate (decimal), et une propriété IsAvailable avec un setter privé contrôlé par les méthodes MarkAsRented() et MarkAsReturned(). Créez ensuite trois classes dérivées : Car avec une propriété Seats, Motorcycle avec une propriété EngineCC, et Truck avec une propriété CargoCapacity (decimal). Chaque classe dérivée doit appeler le constructeur de base et définir sa propriété unique.
  • IPricingStrategy.cs : Définissez l'interface IPricingStrategy dans l'espace de noms Rental.Pricing avec une seule méthode CalculatePrice(Vehicle vehicle, int days) qui retourne un decimal.
  • PricingStrategies.cs : Implémentez deux stratégies de tarification dans l'espace de noms Rental.Pricing. StandardPricing multiplie simplement le tarif journalier du véhicule par le nombre de jours. WeekendDiscountPricing applique une remise de 10 % (multiplier par 0.9) si la location est de 2 jours ou plus, sinon elle utilise le calcul standard.
  • RentalRecord.cs : Créez une classe Rental dans l'espace de noms Rental.Models pour suivre les locations. Elle doit avoir des propriétés en lecture seule pour CustomerName (string), Vehicle (Vehicle), Days (int), et TotalPrice (decimal), toutes définies via le constructeur.
  • RentalService.cs : Créez une classe RentalService dans l'espace de noms Rental.Services qui gère la flotte et traite les locations. Elle reçoit une IPricingStrategy via son constructeur (injection de dépendance). Implémentez :
    • AddVehicle(Vehicle vehicle) - ajoute un véhicule à la flotte
    • RentVehicle(string customerName, string licensePlate, int days) - retourne un objet Rental si le véhicule existe et est disponible, sinon retourne null. N'oubliez pas de marquer le véhicule comme loué et de calculer le prix en utilisant la stratégie injectée.
    • ReturnVehicle(string licensePlate) - marque le véhicule comme disponible, retourne true en cas de succès
    • GetAvailableVehicles() - retourne une liste de tous les véhicules disponibles
  • Program.cs : Rassemblez le tout en créant des véhicules, en configurant le service avec une stratégie de tarification et en traitant les opérations de location basées sur l'entrée.

Vous recevrez les entrées suivantes :

  • Stratégie de tarification à utiliser (standard ou weekend)
  • Nombre de véhicules à ajouter
  • Pour chaque véhicule : type (car, motorcycle, ou truck), plaque d'immatriculation, marque, tarif journalier et valeur spécifique au type (sièges, cylindrée ou capacité de chargement)
  • Nombre d'opérations à effectuer
  • Pour chaque opération : l'action suivie des données pertinentes

Formats des opérations :

rent
{customerName}
{licensePlate}
{days}

return
{licensePlate}

available

Formats de sortie :

  • Succès de la location : Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}
  • Échec de la location : Rental failed: {licensePlate}
  • Succès du retour : Returned: {licensePlate}
  • Échec du retour : Return failed: {licensePlate}
  • Disponible : Affichez chaque véhicule disponible sous la forme {Type}: {Brand} ({LicensePlate}) - {DailyRate}/day où Type est "Car", "Motorcycle", ou "Truck"

Par exemple, si les entrées sont :

weekend
3
car
ABC-123
Toyota
50
5
motorcycle
XYZ-789
Honda
30
600
truck
TRK-001
Ford
80
2000
5
available
rent
Alice
ABC-123
3
rent
Bob
ABC-123
2
available
return
ABC-123

La sortie devrait être :

Car: Toyota (ABC-123) - 50/day
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Rented: Toyota (ABC-123) to Alice for 3 days - Total: 135
Rental failed: ABC-123
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Returned: ABC-123

Remarquez comment la stratégie de tarification est injectée dans le service - vous pourriez facilement remplacer StandardPricing par WeekendDiscountPricing sans modifier du tout le code de RentalService. C'est toute la puissance du patron Strategy combiné à l'injection de dépendance !

Essayez vous-même

using System;
using System.Collections.Generic;
using Rental.Models;
using Rental.Pricing;
using Rental.Services;

class Program
{
    public static void Main(string[] args)
    {
        // Lire le type de stratégie de tarification
        string strategyType = Console.ReadLine();
        
        // TODO: Créer la stratégie de tarification appropriée en fonction de l'entrée
        // "standard" -> StandardPricing
        // "weekend" -> WeekendDiscountPricing
        IPricingStrategy strategy = null; // TODO: Initialiser en fonction de strategyType
        
        // TODO: Créer RentalService avec la stratégie de tarification
        
        // Lire le nombre de véhicules
        int vehicleCount = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Lire et ajouter chaque véhicule au service
        // Pour chaque véhicule, lire :
        // - type (car, motorcycle, truck)
        // - plaque d'immatriculation
        // - marque
        // - tarif journalier
        // - valeur spécifique au type (seats, engineCC, ou cargo capacity)
        
        // Lire le nombre d'opérations
        int operationCount = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Traiter chaque opération
        // Opérations : rent, return, available
        // 
        // Pour "rent" :
        //   Lire customerName, licensePlate, days
        //   Sortie : "Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}"
        //   Ou : "Rental failed: {licensePlate}"
        //
        // Pour "return" :
        //   Lire licensePlate
        //   Sortie : "Returned: {licensePlate}" ou "Return failed: {licensePlate}"
        //
        // Pour "available" :
        //   Afficher chaque véhicule disponible comme suit :
        //   "{Type}: {Brand} ({LicensePlate}) - {DailyRate}/day"
    }
}

Toutes les leçons de Programmation Orientée Objet