diff --git a/Correction/ReadMe.md b/Correction/ReadMe.md index 2057a2e..d732a06 100644 --- a/Correction/ReadMe.md +++ b/Correction/ReadMe.md @@ -1,6 +1,259 @@ -# Exemple final de ce Ă  quoi on pourrait arriver +# 🧠 Architecture & Bonnes Pratiques – MiniJeuxFinal + +Le projet **MiniJeuxFinal** a Ă©tĂ© conçu comme un support pĂ©dagogique et technique visant Ă  appliquer des **bonnes pratiques de conception logicielle** en C#.
+L’objectif principal est d’obtenir un code **maintenable**, **testable** et **facilement extensible**, mĂȘme pour un projet de petite taille. + + +## 🎯 Objectifs de conception + +* Ajouter de **nouveaux jeux** sans modifier l’existant +* SĂ©parer clairement : + * le **cƓur mĂ©tier** + * l’**interface utilisateur** + * les **dĂ©pendances techniques** +* Favoriser la **testabilitĂ©** +* Éviter le couplage fort et le code rigide + + +## đŸ§© Architecture Hexagonale (Ports & Adapters) + +Le projet applique une **architecture hexagonale** (aussi appelĂ©e *Ports & Adapters*). + +Cette architecture vise Ă  **isoler le cƓur mĂ©tier** de toute dĂ©pendance externe (UI, console, hasard, etc.). + + +### 🧠 CƓur mĂ©tier (Domaine) + +Le domaine est situĂ© dans le dossier : + +``` +Games/ +``` + +Il contient : + +* les rĂšgles du jeu +* les interactions entre joueurs +* les actions possibles + +👉 Le domaine **ne dĂ©pend d’aucune implĂ©mentation technique**. + + +### 🔌 Ports (Interfaces) + +Les **ports** sont dĂ©finis sous forme d’interfaces et reprĂ©sentent les contrats du domaine. + +**Ports mĂ©tier :** +* `IGame` +* `IPlayer` +* `IAction` +* `IActionPpc` + +**Ports techniques :** + +* `IConsole` + +👉 Le domaine exprime **ce dont il a besoin**, sans connaĂźtre comment c’est fait. + + +### 🔧 Adapters (ImplĂ©mentations) + +Les **adapters** sont les implĂ©mentations concrĂštes des ports. + +**Adapters entrants (Driving Adapters) :** + +* `GameRunnerConsole` + + * Pilote le jeu depuis l’UI console + * Traduit les actions utilisateur vers le domaine + +**Adapters sortants (Driven Adapters) :** + +* `ConsoleService` +* `InputActionFactory` +* `RandomActionFactory` + + +### 🧭 Flux des dĂ©pendances + +✔ Les dĂ©pendances vont toujours **vers le domaine**
+❌ Le domaine ne dĂ©pend jamais des adapters + +``` +UI / Infrastructure → Interfaces → Domaine +``` + + +## đŸ§© Bonnes pratiques et patterns appliquĂ©s + + +### 1. Single Responsibility Principle (SRP) + +**Application :** + +* Chaque classe a une responsabilitĂ© unique : + * logique mĂ©tier + * affichage + * crĂ©ation d’objets + * accĂšs Ă  la console + +**Pourquoi :** + +* Code plus lisible +* Maintenance facilitĂ©e +* Changements localisĂ©s + + +### 2. Programmation orientĂ©e interfaces + +**Application :** + +* Interfaces gĂ©nĂ©riques (`IGame`, `IPlayer`, `IAction`) +* Interfaces spĂ©cialisĂ©es par jeu (`IActionPpc`) +* Abstractions techniques (`IConsole`) + +**Pourquoi :** + +* Faible couplage +* Remplacement facile des implĂ©mentations +* Meilleure extensibilitĂ© + + +### 3. Dependency Inversion Principle (DIP) + +**Application :** + +* Le domaine dĂ©pend uniquement d’abstractions +* Les implĂ©mentations concrĂštes sont injectĂ©es via des factories + +**Pourquoi :** + +* IndĂ©pendance technologique +* TestabilitĂ© accrue +* Code plus robuste + + +### 4. Factory Pattern + +**Application :** + +* `PierrePapierCiseauxGameFactory` pour crĂ©er un jeu complet +* Factories d’actions (`InputActionFactory`, `RandomActionFactory`) + +**Pourquoi :** + +* Centralisation de la crĂ©ation d’objets +* Suppression de la logique d’instanciation du mĂ©tier +* Facilite l’évolution + + +### 5. Strategy Pattern + +**Application :** + +* Chaque action (Pierre, Papier, Ciseaux) est une stratĂ©gie distincte +* Les joueurs utilisent des comportements interchangeables + +**Pourquoi :** + +* Suppression des `switch` complexes +* Ajout de nouvelles actions sans modification du code existant +* Code plus propre et extensible + + +### 6. Open / Closed Principle (OCP) + +**Application :** + +* Extension par ajout de classes +* Aucun code existant modifiĂ© pour ajouter : + + * un nouveau jeu + * une nouvelle action + +**Pourquoi :** + +* RĂ©duction des risques de rĂ©gression +* Code stable sur le long terme + + +### 7. Clean Architecture (approche simplifiĂ©e) + +**Application :** + +* Le domaine ne dĂ©pend ni : + + * de l’UI + * de la console + * du hasard + +**Pourquoi :** + +* Domaine rĂ©utilisable +* Structure claire +* ComplĂ©ment naturel de l’architecture hexagonale + + +### 8. TestabilitĂ© par design + +**Application :** + +* Interfaces partout +* DĂ©pendances abstraites +* Console simulable + +**Pourquoi :** + +* Tests unitaires sans UI +* ScĂ©narios dĂ©terministes +* Meilleure fiabilitĂ© du code + + +## 🏁 Conclusion + +MĂȘme Ă  l’échelle d’un mini-jeu console, cette architecture permet : + +* un **code modulaire** +* une **Ă©volution sans rĂ©gression** +* une application concrĂšte des principes **SOLID** +* une implĂ©mentation claire de l’**architecture hexagonale** + +👉 *MiniJeuxFinal* constitue une **base saine, extensible et pĂ©dagogique** en C#. + +--- + +# 📚 Annexe – DĂ©finitions + +### Architecture Hexagonale (Ports & Adapters) + +Architecture visant Ă  isoler le cƓur mĂ©tier des dĂ©tails techniques via des interfaces appelĂ©es ports, implĂ©mentĂ©es par des adapters. + +### Single Responsibility Principle (SRP) + +Une classe ne doit avoir qu’une seule raison de changer. + +### Dependency Inversion Principle (DIP) + +Les modules de haut niveau ne doivent pas dĂ©pendre des modules de bas niveau, mais d’abstractions. + +### Open / Closed Principle (OCP) + +Une entitĂ© logicielle doit ĂȘtre ouverte Ă  l’extension mais fermĂ©e Ă  la modification. + +### Factory Pattern + +Pattern de crĂ©ation qui dĂ©lĂšgue l’instanciation d’objets Ă  une classe dĂ©diĂ©e. + +### Strategy Pattern + +Pattern comportemental qui encapsule des comportements interchangeables derriĂšre une interface. + +### Clean Architecture + +Approche architecturale sĂ©parant le domaine mĂ©tier des dĂ©tails techniques. + +--- -Cette solution est un aperçu des bonnes pratiques mises en place. ``` MiniJeuxFinal/