# đ§ 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.