POO Avancée & Architecture Logicielle avec C#

⚙️ Module 5

Généricité & Programmation Fonctionnelle avec LINQ

Objectif: écrire des composants réutilisables et des traitements de données lisibles sans négliger la performance.

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 la généricité avancée, les contraintes de types et les pipelines LINQ.
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#

Pipeline de pensée LINQ

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#

Généricité utile, pas décorative

  • Une abstraction générique doit exprimer une famille de comportements stable.
  • Les contraintes where documentent ce que l'algorithme exige réellement.
  • Les génériques réduisent les duplications entre ressources, véhicules, salles, comptes.
public interface IRepository<TAggregate>
    where TAggregate : class, IAggregateRoot
{
    Task<TAggregate?> GetByIdAsync(Guid id, CancellationToken ct);
    Task AddAsync(TAggregate aggregate, CancellationToken ct);
}
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#

Contraintes de types

public static T CreateDefault<T>() where T : class, new()
{
    return new T();
}
  • class, struct, notnull, new() et interfaces spécialisent le contrat.
  • Une contrainte bien choisie supprime des vérifications dynamiques inutiles.
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#

LINQ: fluent vs query syntax

var overdue = reservations
    .Where(r => r.End < now)
    .GroupBy(r => r.ResourceId)
    .Select(group => new { ResourceId = group.Key, Count = group.Count() });
  • La syntaxe fluide domine en C# moderne.
  • La query syntax reste utile pour certains join complexes.
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#

IEnumerable vs IQueryable

  • IEnumerable: exécution en mémoire, itération paresseuse possible.
  • IQueryable: expression traduite vers une source distante, souvent SQL.
  • Le danger: croire qu'un pipeline LINQ se comporte pareil côté base et côté mémoire.
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#

Opérateurs avancés à maîtriser

  • SelectMany pour aplatir une relation 1-n.
  • GroupBy pour agréger.
  • Join pour exprimer une corrélation explicite.
  • ToDictionary et ToLookup pour accélérer les lectures ultérieures.
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#

Exemple métier

var allocations = resources
    .Join(reservations,
        resource => resource.Id,
        reservation => reservation.ResourceId,
        (resource, reservation) => new { resource.Name, reservation.Start, reservation.End })
    .OrderBy(x => x.Start)
    .ToList();
  • Lisible, compact, facilement testable.
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#

Règle de performance

  • Mesurer avant d'optimiser.
  • Matérialiser (ToList, ToArray) au bon moment.
  • Garder en tête le coût caché des requêtes traduites.
POO Avancée & Architecture Logicielle avec C# - V0.0.2 - 11/03/2026 23:58 - Réda BOUREBABA r.bourebaba@ynov.com