# 🧠 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 ``` MiniJeuxFinal/ │ ├── MiniJeuxFinal.csproj # Fichier projet C# .NET 9 │ ├── Program.cs # Point d'entrĂ©e de l'application │ ├── GameFactory/ │ └── PierrePapierCiseauxGameFactory.cs # CrĂ©ation du jeu │ ├── Games/ │ ├── IGame.cs # Interface gĂ©nĂ©rale d'un jeu │ ├── IAction.cs # Interface gĂ©nĂ©rale d'une action │ ├── IPlayer.cs # Interface gĂ©nĂ©rale d'un joueur │ │ │ ├── PierrePapierCiseaux/ # ImplĂ©mentation spĂ©cifique du jeu PPC │ │ ├── PierrePapierCiseauxGame.cs # Classe principale du jeu PPC │ │ │ │ │ ├── Actions/ # Actions spĂ©cifiques au PPC │ │ │ ├── IActionPpc.cs # Interface spĂ©cialisĂ©e (hĂ©rite de IAction) │ │ │ ├── StoneAction.cs # Pierre │ │ │ ├── PaperAction.cs # Papier │ │ │ └── ScissorsAction.cs # Ciseaux │ │ │ │ │ ├── Factories/ # Factories pour crĂ©er les actions PPC │ │ │ ├── IActionPpcFactory.cs # Interface des factories PPC │ │ │ ├── InputActionFactory.cs # Factory pour l'entrĂ©e utilisateur │ │ │ └── RandomActionFactory.cs# Factory alĂ©atoire (IA) │ │ │ │ │ └── Players/ │ │ └── PlayerPpc.cs # Joueur spĂ©cialisĂ© pour le PPC │ │ │ └── Trash/ # Anciennes versions ou brouillons │ ├── Pendu.cs │ └── Ppc.cs │ ├── Ui/ │ └── GameRunnerConsole.cs # Orchestrateur UI Console (affichage) │ ├── Wrappers/ # Abstractions des dĂ©pendances externes │ ├── IConsole.cs # Interface pour la console │ └── ConsoleService.cs # ImplĂ©mentation rĂ©elle de IConsole ``` ## đŸ§© 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** > *Ps:*
> On a donc utilisé un canon pour écraser une mouche, mais au moins, on sait comment fonctionne le canon!
> Et oui, c'est excessif pour un jeu en console. Non, on ne regrette rien. L'apprentissage n'a pas de prix (mais a beaucoup de classes). --- # 📚 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.