📚 Travaux Dirigés et Pratiques - Programmation Orientée Objets C#
TD 1 : Modélisation POO et Diagrammes UML (3h)
Contexte
Vous êtes consultant pour une entreprise de covoiturage qui souhaite moderniser son système de gestion. Votre mission est de concevoir l’architecture logicielle en appliquant les principes de la POO.
Exercice 1 : Analyse et Conception (1h30)
Scénario : Système de covoiturage “ShareRide”
Le système doit gérer :
- Des Utilisateurs (Conducteurs et Passagers)
- Des Véhicules avec leurs caractéristiques (marque, modèle, nombre de places, consommation)
- Des Trajets avec point de départ, destination, date/heure, prix par place
- Des Réservations effectuées par les passagers
- Un système de Notation (les utilisateurs peuvent noter les trajets)
Questions :
- Identifiez les classes principales nécessaires
- Pour chaque classe, définissez :
- Les attributs avec leur type et visibilité
- Les méthodes principales
- Les relations avec les autres classes
- Dessinez le diagramme de classes UML complet
- Identifiez les opportunités d’héritage et justifiez vos choix
- Proposez une interface
INotablepour standardiser le système de notation
Exercice 2 : Règles Métier et Encapsulation (1h30)
Problématiques à résoudre :
-
Validation des réservations :
- Un passager ne peut pas réserver plus de places qu’il n’y en a de disponibles
- Un conducteur ne peut pas réserver son propre trajet
- Une réservation ne peut pas être faite moins de 2h avant le départ
-
Calcul des prix :
- Prix de base par kilomètre
- Majoration de 20% pour les trajets de nuit (22h-6h)
- Réduction de 10% si le passager a une note moyenne > 4.5/5
-
Gestion du statut :
- Un trajet peut être : Planifié, EnCours, Terminé, Annulé
- Définir les transitions possibles entre états
Questions :
- Pour chaque règle métier, déterminez où placer la logique (dans quelle classe)
- Écrivez les signatures des méthodes de validation
- Proposez une implémentation du pattern State pour la gestion des statuts de trajet
- Identifiez les données qui doivent être encapsulées et proposez des propriétés appropriées
TP 1 : Refactoring et Principes SOLID (3h)
Contexte
Vous héritez d’un code legacy d’une application de gestion de bibliothèque. Le code fonctionne mais viole plusieurs principes SOLID et bonnes pratiques.
Code de Départ (fourni - à améliorer)
using System;
using System.Collections.Generic;
// CODE À REFACTORER
public class Livre
{
public string Titre;
public string Auteur;
public string ISBN;
public bool EstEmprunte;
public DateTime? DateEmprunt;
public string EmprunteurNom;
public void Emprunter(string nom)
{
if (!EstEmprunte)
{
EstEmprunte = true;
DateEmprunt = DateTime.Now;
EmprunteurNom = nom;
// Envoyer email
Console.WriteLine($"Email envoyé à {nom}");
// Logger dans fichier
Console.WriteLine($"LOG: Livre {Titre} emprunté");
// Calculer pénalité si retard
// Vérifier quota utilisateur
}
}
}
Tâches à Réaliser
Partie 1 : Encapsulation (45 min)
- Corrigez les violations d’encapsulation
- Créez des propriétés avec validation appropriée
- Assurez-vous que l’ISBN respecte le format ISBN-13
- Empêchez la modification directe du statut d’emprunt
Partie 2 : Single Responsibility Principle (45 min)
Le code actuel viole le SRP. Refactorez en créant :
- Une classe
GestionnaireEmailpour les notifications - Une classe
Loggerpour les logs - Une classe
CalculateurPenalitespour les pénalités - Une classe
ValidateurQuotapour vérifier les quotas
Partie 3 : Open/Closed Principle (45 min)
Implémentez un système extensible pour différents types de livres :
- Livre standard (14 jours d’emprunt)
- Livre best-seller (7 jours)
- Livre de référence (non empruntable, consultation sur place uniquement)
Utilisez l’héritage ou le polymorphisme pour éviter les modifications du code existant lors de l’ajout de nouveaux types.
Partie 4 : Dependency Inversion (45 min)
- Créez des interfaces
INotificationService,ILogger,IPenaliteCalculator - Refactorez le code pour dépendre des abstractions
- Démontrez comment on peut facilement remplacer l’implémentation email par SMS
Livrables :
- Code refactoré complet
- Document expliquant les violations identifiées et les corrections apportées
- Diagramme UML de la solution finale
TD 2 : Patterns de Conception et Architecture (3h)
Exercice 1 : Pattern Singleton (45 min)
Contexte : Configuration d’application
Vous devez créer une classe ConfigurationManager qui :
- Charge les paramètres depuis un fichier
- Est accessible globalement dans l’application
- Ne doit avoir qu’une seule instance
- Thread-safe pour les applications multi-threadées
Questions :
- Implémentez le pattern Singleton classique
- Quels sont les problèmes potentiels de cette implémentation ?
- Proposez une version thread-safe (Lazy Initialization)
- Dans quels scénarios le Singleton est-il approprié ou inapproprié ?
Exercice 2 : Pattern Factory (1h)
Contexte : Système de paiement e-commerce
Le système doit supporter plusieurs méthodes de paiement :
- Carte bancaire (validation numéro, date expiration, CVV)
- PayPal (validation email)
- Virement bancaire (validation IBAN)
- Crypto-monnaie (validation adresse wallet)
Questions :
- Créez une interface
IMethodePaiementavec les opérations communes - Implémentez les classes concrètes pour chaque méthode
- Créez une Factory qui instancie la bonne méthode selon le type
- Démontrez comment ajouter une nouvelle méthode sans modifier le code existant
Exercice 3 : Pattern Observer (1h15)
Contexte : Système de trading boursier
Un système doit notifier différents composants quand le prix d’une action change :
- Interface graphique (mise à jour en temps réel)
- Système d’alertes (envoie SMS si seuil atteint)
- Logger (enregistre l’historique)
- Analyseur technique (calcule moyennes mobiles)
Questions :
- Concevez le diagramme UML du pattern Observer pour ce scénario
- Définissez l’interface
IObserveret la classeSubject - Implémentez la logique de notification
- Comment gérer le cas où un observateur prend trop de temps à traiter ?
- Proposez une solution pour des notifications asynchrones
TP 2 : Application Multi-Tiers avec Base de Données (4h)
Contexte
Développez une application de gestion de cabinet médical respectant l’architecture en couches.
Architecture Requise
Presentation Layer (Console/WPF)
↓
Business Logic Layer
↓
Data Access Layer
↓
Database (MySQL)
Fonctionnalités à Implémenter
Partie 1 : Modèle de Données (1h)
Créez les classes métier :
Patient(Nom, Prénom, DateNaissance, NuméroSécuritéSociale, Téléphone, Email)Medecin(Nom, Prénom, Spécialité, NuméroOrdre)RendezVous(Patient, Medecin, DateHeure, Motif, Durée, Statut)Ordonnance(RendezVous, Médicaments, Posologie, Date)
Contraintes :
- Validation des données (format email, téléphone, numéro sécurité sociale)
- Règles métier (âge minimum, rendez-vous dans le futur, etc.)
- Utilisation appropriée de l’encapsulation
Partie 2 : Couche d’Accès aux Données (1h30)
Implémentez le pattern Repository :
interface IRepository<T>
{
void Ajouter(T entite);
void Modifier(T entite);
void Supprimer(int id);
T ObtenirParId(int id);
List<T> ObtenirTous();
}
Tâches :
- Créez les repositories pour chaque entité
- Utilisez ADO.NET avec des commandes paramétrées (protection injection SQL)
- Implémentez la gestion des transactions pour les opérations complexes
- Gérez correctement les erreurs et exceptions
Partie 3 : Logique Métier (1h)
Créez les services métier :
ServiceRendezVous :
- Vérifier disponibilité du médecin
- Calculer les créneaux disponibles
- Envoyer confirmation par email
- Gérer les annulations avec règles (délai minimum)
ServiceFacturation :
- Calculer le montant (consultation + actes)
- Appliquer remboursement sécurité sociale
- Générer facture
Partie 4 : Interface Utilisateur (30 min)
Application console avec menu :
- Gérer les patients (CRUD)
- Gérer les médecins (CRUD)
- Prendre un rendez-vous
- Consulter l’agenda d’un médecin
- Générer statistiques (patients par mois, rendez-vous par spécialité)
Bonus :
- Implémentation de recherche avancée
- Export des données en CSV
- Système de rappel automatique (patients à contacter)
TD 3 : Gestion des Exceptions et Robustesse (3h)
Exercice 1 : Analyse de Code et Exceptions (1h)
Analysez le code suivant et identifiez tous les problèmes :
public class TransfertBancaire
{
public void Transferer(string compteSource, string compteDestination, decimal montant)
{
var source = ObtenirCompte(compteSource);
var destination = ObtenirCompte(compteDestination);
source.Solde -= montant;
destination.Solde += montant;
SauvegarderCompte(source);
SauvegarderCompte(destination);
}
}
Questions :
- Listez toutes les erreurs possibles
- Pour chaque erreur, proposez une exception appropriée (custom ou built-in)
- OĂą placer les blocs try-catch ?
- Comment garantir l’atomicité de l’opération ?
- Implémentez une version robuste avec :
- Validation des paramètres
- Gestion des erreurs réseau
- Mécanisme de retry
- Logging approprié
Exercice 2 : Hiérarchie d’Exceptions Métier (1h)
Créez une hiérarchie d’exceptions personnalisées pour un système de réservation aérienne :
Exceptions à créer :
ReservationException(classe de base)VolCompletExceptionDatesInvalidesExceptionPassagerMineurExceptionPaiementRefuseExceptionDocumentsManquantsException
Pour chaque exception :
- Définissez les propriétés pertinentes
- Implémentez les constructeurs appropriés
- Créez des messages d’erreur clairs et actionnables
- Ajoutez des informations de contexte utiles pour le debugging
Exercice 3 : Stratégies de Gestion d’Erreurs (1h)
Concevez une stratégie complète de gestion d’erreurs pour une API REST :
Scénarios à gérer :
- Erreurs de validation (400 Bad Request)
- Ressource introuvable (404 Not Found)
- Erreurs d’authentification (401 Unauthorized)
- Erreurs serveur (500 Internal Server Error)
- Timeout de connexion DB
- Service externe indisponible
Livrables :
- Middleware de gestion d’erreurs global
- Mapping des exceptions vers codes HTTP
- Format standardisé des réponses d’erreur
- Stratégie de logging multi-niveaux (Debug, Info, Warning, Error, Critical)
- Mécanisme de circuit breaker pour les services externes
TP 3 : Projet Intégrateur - Application de Gestion d’École (4h)
Description du Projet
Développez une application complète de gestion d’établissement scolaire en appliquant tous les concepts vus.
Fonctionnalités Minimales
Module 1 : Gestion des Utilisateurs
- Étudiants (matricule auto-généré, informations personnelles, classe)
- Enseignants (spécialité, matières enseignées)
- Administrateurs (droits d’accès)
Module 2 : Gestion Pédagogique
- Classes (niveau, section, capacité max)
- Matières (coefficient, horaire hebdomadaire)
- Emplois du temps (contraintes : pas de chevauchement, respect des disponibilités)
Module 3 : Système d’Évaluation
- Saisie des notes (contrĂ´les, examens)
- Calcul automatique des moyennes (pondérées par coefficient)
- Génération de bulletins
- Calcul de classement
Module 4 : Système de Présence
- Enregistrement des absences
- Justification des absences
- Alertes automatiques (seuil d’absences atteint)
- Génération de rapports de présence
Contraintes Techniques
Architecture :
- Modèle en couches strict
- Pattern Repository pour l’accès données
- Services métier avec logique encapsulée
- Factory pour la création d’objets complexes
Base de Données MySQL :
- Schéma normalisé (3NF minimum)
- Contraintes d’intégrité référentielle
- Index sur les champs fréquemment recherchés
- Requêtes optimisées (pas de N+1)
Qualité du Code :
- Respect des principes SOLID
- Nommage cohérent et explicite
- Commentaires sur la logique complexe
- Gestion complète des erreurs
- Validation de toutes les entrées utilisateur
Livrables
-
Code Source Complet (70%)
- Solution Visual Studio organisée
- Séparation en projets (Entities, DataAccess, Business, Presentation)
- Tests unitaires sur la logique métier critique
-
Documentation Technique (20%)
- Diagramme de classes complet
- Schéma de base de données
- Documentation des choix d’architecture
- Guide d’installation et configuration
-
Présentation Orale (10%)
- Démonstration fonctionnelle (10 min)
- Explication d’un choix architectural complexe
- Réponse aux questions techniques
Critères d’Évaluation
- Fonctionnalité (25%) : L’application fait ce qui est demandé
- Architecture (25%) : Respect des patterns et principes
- Qualité du code (20%) : Lisibilité, organisation, nommage
- Robustesse (15%) : Gestion des erreurs, validation
- Base de données (10%) : Conception, optimisation
- Documentation (5%) : Clarté, complétude
📌 Conseils Généraux pour les TD/TP
Méthodologie de Travail
- Lire entièrement l’énoncé avant de commencer
- Dessiner des schémas (UML, diagrammes de flux)
- Commencer simple puis raffiner progressivement
- Tester régulièrement chaque fonctionnalité
- Commenter le code au fur et Ă mesure
Outils Recommandés
- Visual Studio 2022 pour le développement
- Draw.io ou Lucidchart pour les diagrammes UML
- MySQL Workbench pour la gestion de la base de données
- Git pour le versioning (mĂŞme en solo)
Points d’Attention
- ⚠️ Injection SQL : Toujours utiliser des paramètres
- ⚠️ Null Reference : Vérifier les objets avant utilisation
- ⚠️ Memory Leaks : Libérer les ressources (using, Dispose)
- ⚠️ Thread Safety : Attention aux accès concurrents
Bon travail ! 🚀
PrĂŞt Ă passer Ă la suite ?
Vous avez terminé cette leçon sur 📚 Travaux Dirigés et Pratiques - Programmation Orientée Objets C#. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.