POO Avancée & Architecture Logicielle avec C#

🏗️ Module 2

Anatomie Avancée de la POO en C#

Objectif: utiliser les constructions modernes du langage pour écrire moins de code accidentel.

POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 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 sur les types modernes, l'encapsulation et le polymorphisme pratique.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Ce qui change avec C# moderne

  • Les record réduisent le bruit des DTOs.
  • Les primary constructors rapprochent état et intention.
  • init, required et les modificateurs avancés renforcent les invariants.
  • L'objectif n'est pas le raccourci syntaxique, mais la lisibilité du domaine.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Typologie des constructions modernes

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

DTO immuable avec record

public sealed record ReservationDto(
    Guid Id,
    string ResourceName,
    DateOnly Day,
    string ReservedBy);
  • Égalité par valeur.
  • Construction concise.
  • Bonne base pour API, messaging et tests.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Primary constructors et invariants

public class Money(decimal amount, string currency)
{
    public decimal Amount { get; } = amount >= 0 ? amount : throw new ArgumentOutOfRangeException(nameof(amount));
    public string Currency { get; } = !string.IsNullOrWhiteSpace(currency) ? currency : throw new ArgumentException("Currency required");
}
  • La validation arrive tôt.
  • Les propriétés publiques restent stables.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Encapsulation stricte

  • internal pour protéger l'API interne du package.
  • file pour des helpers confinés au fichier.
  • private protected pour limiter l'héritage aux sous-classes du même assembly.
  • init et propriétés en lecture seule pour garantir un objet valide après construction.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Interfaces vs classes abstraites

  • Une interface décrit un contrat transversal.
  • Une classe abstraite factorise du comportement commun et de l'état partagé.
  • En architecture, on préfère l'interface à la frontière, la classe abstraite à l'intérieur d'une hiérarchie maîtrisée.
public interface IClock
{
    DateTimeOffset UtcNow { get; }
}
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Étendre sans modifier: extension methods

public static class ReservationExtensions
{
    public static bool Overlaps(this Reservation current, Reservation other) =>
        current.ResourceId == other.ResourceId &&
        current.Start < other.End &&
        other.Start < current.End;
}
  • Très utile pour du code métier lisible.
  • À éviter quand cela masque un manque de conception objet.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com
POO Avancée & Architecture Logicielle avec C#

Ligne directrice du module

  • Un bon type empêche des états invalides.
  • L'encapsulation est un outil métier, pas un réflexe académique.
  • La syntaxe moderne sert d'abord la robustesse et les tests.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com