POO Avancée & Architecture Logicielle avec C#

🧩 Module 3

Design Patterns & Principes SOLID

Objectif: passer d'un code seulement correct à un code extensible sans régression permanente.

POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

📝 Changelog — V0.0.1

  • Création du deck SOLID et patterns de conception pour services C# maintenables.
POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

SOLID en une vue d'ensemble

POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Lecture pragmatique de SOLID

  • S: un service, une raison de changer.
  • O: on ajoute du comportement sans casser le noyau.
  • L: une implémentation substituable respecte le contrat attendu.
  • I: petites interfaces ciblées.
  • D: le domaine dépend d'abstractions, pas d'implémentations techniques.
POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Exemple de violation puis correction

public sealed class ReservationService
{
    public void Reserve(...) { }
    public void SendConfirmationEmail(...) { }
    public void ExportAuditCsv(...) { }
}
  • Ici, la logique métier, l'email et l'export sont couplés.
  • La correction consiste à extraire INotificationService et IAuditExporter.
POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Patterns à connaître vraiment

  • Factory pour centraliser la création d'objets cohérents.
  • Builder pour les agrégats complexes ou les tests lisibles.
  • Decorator pour empiler cache, tracing, retry, métriques.
  • Adapter pour intégrer un système externe sans polluer le domaine.
  • Strategy pour remplacer des branches if par des comportements.
  • Observer et événements pour diffuser des changements.
POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Decorator pour logging métier

public sealed class LoggingReservationRepository(IReservationRepository inner, ILogger<LoggingReservationRepository> logger)
    : IReservationRepository
{
    public async Task AddAsync(Reservation reservation, CancellationToken ct)
    {
        logger.LogInformation("Persisting reservation {ReservationId}", reservation.Id);
        await inner.AddAsync(reservation, ct);
    }
}
  • Le service métier ne change pas.
  • Les préoccupations transverses restent composables.
POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Strategy pour varier une politique métier

public interface IPricingStrategy
{
    decimal ComputePrice(Reservation reservation);
}
  • Salle premium, véhicule utilitaire, tarif week-end: même contrat, règles différentes.
POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Critère de choix utile

  • Un pattern n'est valable que s'il réduit un couplage réel.
  • Si la variabilité n'existe pas encore, une abstraction peut être prématurée.
  • SOLID sert à retarder le chaos, pas à multiplier les couches par réflexe.
POO Avancée & Architecture Logicielle avec C# - V0.0.3 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com