Genie logiciel igl235
Thème :
Junior
2 vues ·5/6 leçons

📚 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 :

  1. Identifiez les classes principales nécessaires
  2. Pour chaque classe, définissez :
    • Les attributs avec leur type et visibilitĂ©
    • Les mĂ©thodes principales
    • Les relations avec les autres classes
  3. Dessinez le diagramme de classes UML complet
  4. Identifiez les opportunités d’héritage et justifiez vos choix
  5. Proposez une interface INotable pour standardiser le système de notation

Exercice 2 : Règles Métier et Encapsulation (1h30)

Problématiques à résoudre :

  1. 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
  2. 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
  3. Gestion du statut :

    • Un trajet peut ĂŞtre : PlanifiĂ©, EnCours, TerminĂ©, AnnulĂ©
    • DĂ©finir les transitions possibles entre Ă©tats

Questions :

  1. Pour chaque règle métier, déterminez où placer la logique (dans quelle classe)
  2. Écrivez les signatures des méthodes de validation
  3. Proposez une implémentation du pattern State pour la gestion des statuts de trajet
  4. 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)

  1. Corrigez les violations d’encapsulation
  2. Créez des propriétés avec validation appropriée
  3. Assurez-vous que l’ISBN respecte le format ISBN-13
  4. 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 :

  1. Une classe GestionnaireEmail pour les notifications
  2. Une classe Logger pour les logs
  3. Une classe CalculateurPenalites pour les pénalités
  4. Une classe ValidateurQuota pour vérifier les quotas

Partie 3 : Open/Closed Principle (45 min)

Implémentez un système extensible pour différents types de livres :

  1. Livre standard (14 jours d’emprunt)
  2. Livre best-seller (7 jours)
  3. 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)

  1. Créez des interfaces INotificationService, ILogger, IPenaliteCalculator
  2. Refactorez le code pour dépendre des abstractions
  3. 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 :

  1. Implémentez le pattern Singleton classique
  2. Quels sont les problèmes potentiels de cette implémentation ?
  3. Proposez une version thread-safe (Lazy Initialization)
  4. 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 :

  1. Créez une interface IMethodePaiement avec les opérations communes
  2. Implémentez les classes concrètes pour chaque méthode
  3. Créez une Factory qui instancie la bonne méthode selon le type
  4. 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 :

  1. Concevez le diagramme UML du pattern Observer pour ce scénario
  2. Définissez l’interface IObserver et la classe Subject
  3. Implémentez la logique de notification
  4. Comment gérer le cas où un observateur prend trop de temps à traiter ?
  5. 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 :

  1. Créez les repositories pour chaque entité
  2. Utilisez ADO.NET avec des commandes paramétrées (protection injection SQL)
  3. Implémentez la gestion des transactions pour les opérations complexes
  4. 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 :

  1. Gérer les patients (CRUD)
  2. Gérer les médecins (CRUD)
  3. Prendre un rendez-vous
  4. Consulter l’agenda d’un médecin
  5. 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 :

  1. Listez toutes les erreurs possibles
  2. Pour chaque erreur, proposez une exception appropriée (custom ou built-in)
  3. OĂą placer les blocs try-catch ?
  4. Comment garantir l’atomicité de l’opération ?
  5. 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)
    • VolCompletException
    • DatesInvalidesException
    • PassagerMineurException
    • PaiementRefuseException
    • DocumentsManquantsException

Pour chaque exception :

  1. Définissez les propriétés pertinentes
  2. Implémentez les constructeurs appropriés
  3. Créez des messages d’erreur clairs et actionnables
  4. 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 :

  1. Erreurs de validation (400 Bad Request)
  2. Ressource introuvable (404 Not Found)
  3. Erreurs d’authentification (401 Unauthorized)
  4. Erreurs serveur (500 Internal Server Error)
  5. Timeout de connexion DB
  6. Service externe indisponible

Livrables :

  1. Middleware de gestion d’erreurs global
  2. Mapping des exceptions vers codes HTTP
  3. Format standardisé des réponses d’erreur
  4. Stratégie de logging multi-niveaux (Debug, Info, Warning, Error, Critical)
  5. 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

  1. 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
  2. Documentation Technique (20%)

    • Diagramme de classes complet
    • SchĂ©ma de base de donnĂ©es
    • Documentation des choix d’architecture
    • Guide d’installation et configuration
  3. 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

  1. Lire entièrement l’énoncé avant de commencer
  2. Dessiner des schémas (UML, diagrammes de flux)
  3. Commencer simple puis raffiner progressivement
  4. Tester régulièrement chaque fonctionnalité
  5. 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.