Skip to content

Commit fd04533

Browse files
committed
Styling
1 parent e5976c0 commit fd04533

33 files changed

Lines changed: 612 additions & 346 deletions

docs/cours/design-patterns/1-intro.md

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,22 @@
22

33
En génie logiciel, un **design pattern** (ou patron de conception) est une solution générale, éprouvée et réutilisable à un problème récurrent dans la conception de logiciels orientés objet.
44

5-
> **Info :**
6-
> Un design pattern n'est pas un code prêt à l'emploi, mais une sorte de « recette » ou de modèle de solution, applicable dans de nombreux contextes. Il décrit :
7-
> - le problème à résoudre,
8-
> - la solution générique,
9-
> - les conséquences de son utilisation.
5+
::: info
6+
Un design pattern n'est pas un code prêt à l'emploi, mais une sorte de « recette » ou de modèle de solution, applicable dans de nombreux contextes. Il décrit :
7+
- le problème à résoudre,
8+
- la solution générique,
9+
- les conséquences de son utilisation.
10+
:::
1011

1112
## Pourquoi utiliser les design patterns ?
1213
- **Réutilisabilité** : On évite de réinventer la roue.
1314
- **Lisibilité** : Les développeurs comprennent plus vite le rôle d'une structure connue.
1415
- **Robustesse** : Les patterns sont éprouvés et testés.
1516
- **Communication** : Ils fournissent un vocabulaire commun entre développeurs.
1617

17-
> **À retenir :**
18-
> Les design patterns facilitent la maintenance, la compréhension et l'évolution des logiciels.
18+
::: tip
19+
À retenir : Les design patterns facilitent la maintenance, la compréhension et l'évolution des logiciels.
20+
:::
1921

2022
## Origine
2123
Les design patterns ont été popularisés par le livre "Design Patterns: Elements of Reusable Object-Oriented Software" (1994) par Erich Gamma, Richard Helm, Ralph Johnson et John Vlissides (le "Gang of Four" ou GoF).
@@ -28,8 +30,9 @@ Un pattern est généralement décrit par :
2830
- **Conséquences**
2931
- **Exemple d'implémentation**
3032

31-
> **Info :**
32-
> Apprenez à reconnaître les patterns dans le code existant, cela vous aidera à mieux comprendre et à améliorer des projets complexes.
33+
::: info
34+
Apprenez à reconnaître les patterns dans le code existant, cela vous aidera à mieux comprendre et à améliorer des projets complexes.
35+
:::
3336

3437
## Exemples de design patterns célèbres
3538
- Singleton

docs/cours/design-patterns/2-categories.md

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,46 @@
22

33
Les design patterns sont classés en trois grandes familles, chacune répondant à des besoins spécifiques dans la conception logicielle.
44

5-
> **Info :**
6-
> Comprendre à quelle famille appartient un pattern aide à choisir la bonne solution selon le problème rencontré.
5+
::: info
6+
Comprendre à quelle famille appartient un pattern aide à choisir la bonne solution selon le problème rencontré.
7+
:::
78

89
## 1. Patterns de création (Creational Patterns)
910
Ils concernent la manière de créer des objets, en masquant la logique de création et en rendant le système indépendant de la façon dont ses objets sont créés, composés et représentés.
1011

1112
**Exemples :**
12-
- **Singleton** : Garantit une seule instance d'une classe.
13-
- **Factory Method** : Délègue la création d'objets à des sous-classes.
14-
- **Abstract Factory** : Crée des familles d'objets liés.
15-
- **Builder** : Construit des objets complexes étape par étape.
16-
- **Prototype** : Clone des objets existants.
13+
- [**Singleton**](3-creational.md#singleton) : Garantit une seule instance d'une classe.
14+
- [**Factory Method**](3-creational.md#factory-method) : Délègue la création d'objets à des sous-classes.
15+
- [**Abstract Factory**](3-creational.md#abstract-factory) : Crée des familles d'objets liés.
16+
- [**Builder**](3-creational.md#builder) : Construit des objets complexes étape par étape.
17+
- [**Prototype**](3-creational.md#prototype) : Clone des objets existants.
1718

1819
## 2. Patterns structurels (Structural Patterns)
1920
Ils concernent la composition des classes et des objets, facilitant la conception de structures flexibles et efficaces.
2021

2122
**Exemples :**
22-
- **Adapter** : Rend compatibles des interfaces différentes.
23-
- **Bridge** : Sépare abstraction et implémentation.
24-
- **Composite** : Structure des objets en arbre.
25-
- **Decorator** : Ajoute dynamiquement des fonctionnalités.
26-
- **Facade** : Simplifie l'accès à un sous-système complexe.
27-
- **Flyweight** : Partage des objets pour économiser de la mémoire.
28-
- **Proxy** : Contrôle l'accès à un objet.
23+
- [**Adapter**](4-structural.md#adapter) : Rend compatibles des interfaces différentes.
24+
- [**Bridge**](4-structural.md#bridge) : Sépare abstraction et implémentation.
25+
- [**Composite**](4-structural.md#composite) : Structure des objets en arbre.
26+
- [**Decorator**](4-structural.md#decorator) : Ajoute dynamiquement des fonctionnalités.
27+
- [**Facade**](4-structural.md#facade) : Simplifie l'accès à un sous-système complexe.
28+
- [**Flyweight**](4-structural.md#flyweight) : Partage des objets pour économiser de la mémoire.
29+
- [**Proxy**](4-structural.md#proxy) : Contrôle l'accès à un objet.
2930

3031
## 3. Patterns comportementaux (Behavioral Patterns)
3132
Ils concernent la communication et la répartition des responsabilités entre les objets.
3233

3334
**Exemples :**
34-
- **Observer** : Notifie automatiquement les changements d'état.
35-
- **Strategy** : Permute dynamiquement des algorithmes.
36-
- **Command** : Encapsule des requêtes comme objets.
37-
- **State** : Change le comportement selon l'état interne.
38-
- **Chain of Responsibility** : Passe une requête à travers une chaîne d'objets.
39-
- **Iterator** : Parcourt une collection sans exposer sa structure.
40-
- **Mediator, Memento, Template Method, Visitor, Interpreter** : Autres patterns avancés.
41-
42-
> **À retenir :**
43-
> Chaque famille répond à une problématique différente : création, structure ou comportement.
35+
- [**Observer**](5-behavioral.md#observer) : Notifie automatiquement les changements d'état.
36+
- [**Strategy**](5-behavioral.md#strategy) : Permute dynamiquement des algorithmes.
37+
- [**Command**](5-behavioral.md#command) : Encapsule des requêtes comme objets.
38+
- [**State**](5-behavioral.md#state) : Change le comportement selon l'état interne.
39+
- [**Chain of Responsibility**](5-behavioral.md#chain-of-responsibility) : Passe une requête à travers une chaîne d'objets.
40+
- [**Iterator**](5-behavioral.md#iterator) : Parcourt une collection sans exposer sa structure.
41+
- [**Mediator**](5-behavioral.md#mediator), [**Memento**](5-behavioral.md#memento), [**Template Method**](5-behavioral.md#template-method), [**Visitor**](5-behavioral.md#visitor), [**Interpreter**](5-behavioral.md#interpreter) : Autres patterns avancés.
42+
43+
::: tip
44+
À retenir : Chaque famille répond à une problématique différente : création, structure ou comportement.
45+
:::
4446

4547
Chacune de ces familles sera détaillée dans les fichiers suivants, avec des exemples concrets en Java.

docs/cours/design-patterns/3-creational.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
Les patterns de création facilitent la création d'objets tout en cachant la logique de création. Ils permettent de rendre le code plus flexible, testable et indépendant des classes concrètes.
44

5-
> **Info :**
6-
> Utilisez ces patterns pour éviter le couplage fort entre les classes et la logique de création d'objets.
5+
::: info
6+
Utilisez ces patterns pour éviter le couplage fort entre les classes et la logique de création d'objets.
7+
:::
78

89
## Singleton
910
Le Singleton garantit qu'une classe n'a qu'une seule instance et fournit un point d'accès global à cette instance.
@@ -54,8 +55,9 @@ public class Database {
5455
}
5556
```
5657

57-
> **À retenir :**
58-
> Le constructeur est privé pour empêcher la création d'autres instances.
58+
::: warning
59+
Le constructeur est privé pour empêcher la création d'autres instances.
60+
:::
5961

6062
## Factory Method
6163
Permet de déléguer la création d'objets à des sous-classes, sans connaître la classe exacte à instancier.
@@ -243,7 +245,8 @@ Sheep s1 = new Sheep();
243245
Sheep s2 = s1.clone();
244246
```
245247

246-
> **Info :**
247-
> Le pattern Prototype est utile pour dupliquer rapidement des objets configurés.
248+
::: info
249+
Le pattern Prototype est utile pour dupliquer rapidement des objets configurés.
250+
:::
248251

249252
Chaque pattern de création permet de résoudre des problèmes spécifiques liés à l'instanciation d'objets, tout en rendant le code plus flexible et maintenable.

docs/cours/design-patterns/4-structural.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
Les patterns structurels facilitent la composition de classes et d'objets pour former des structures plus complexes. Ils permettent de rendre les architectures plus flexibles, évolutives et maintenables.
44

5-
> **Info :**
6-
> Utilisez ces patterns pour organiser et optimiser la structure de vos applications, sans modifier le code existant.
5+
::: info
6+
Utilisez ces patterns pour organiser et optimiser la structure de vos applications, sans modifier le code existant.
7+
:::
78

89
## Adapter
910
Permet de faire collaborer des classes qui n'ont pas d'interface compatible.
@@ -51,8 +52,9 @@ class Adaptateur implements Cible {
5152
}
5253
```
5354

54-
> **À retenir :**
55-
> L'adaptateur agit comme un traducteur entre deux interfaces incompatibles.
55+
::: tip
56+
À retenir : L'adaptateur agit comme un traducteur entre deux interfaces incompatibles.
57+
:::
5658

5759
## Bridge
5860
Sépare l'abstraction de son implémentation pour qu'elles puissent évoluer indépendamment.
@@ -148,8 +150,9 @@ class Composite implements Composant {
148150
}
149151
```
150152

151-
> **Info :**
152-
> Le composite est très utilisé pour les structures arborescentes (ex : menus, systèmes de fichiers).
153+
::: info
154+
Le composite est très utilisé pour les structures arborescentes (ex : menus, systèmes de fichiers).
155+
:::
153156

154157
## Decorator
155158
Ajoute dynamiquement des responsabilités à un objet.
@@ -307,5 +310,6 @@ class ProxyService implements Service {
307310
}
308311
```
309312

310-
> **À retenir :**
311-
> Les patterns structurels facilitent la maintenance et l'évolution des architectures logicielles.
313+
::: tip
314+
À retenir : Les patterns structurels facilitent la maintenance et l'évolution des architectures logicielles.
315+
:::

docs/cours/design-patterns/5-behavioral.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
Les patterns comportementaux facilitent la communication entre objets et la répartition des responsabilités. Ils permettent de rendre les interactions plus souples, découplées et évolutives.
44

5-
> **Info :**
6-
> Utilisez ces patterns pour organiser la logique métier et la communication entre objets sans créer de dépendances fortes.
5+
::: info
6+
Utilisez ces patterns pour organiser la logique métier et la communication entre objets sans créer de dépendances fortes.
7+
:::
78

89
## Observer
910
Le pattern Observer permet à un objet (le sujet) de notifier automatiquement ses observateurs lorsqu'un changement d'état survient. Cela permet de mettre en place des systèmes réactifs et découplés.
@@ -64,8 +65,9 @@ sujet.ajouter(o);
6465
sujet.changerEtat("Nouveau!");
6566
```
6667

67-
> **À retenir :**
68-
> L'observateur permet de réagir automatiquement à des changements sans couplage fort.
68+
::: tip
69+
À retenir : L'observateur permet de réagir automatiquement à des changements sans couplage fort.
70+
:::
6971

7072
## Strategy
7173
Permet de changer dynamiquement l'algorithme utilisé par un objet.
@@ -680,10 +682,12 @@ sequenceDiagram
680682

681683
On voit ici que l'action est déterminée par le type de l'objet et le type de l'interaction, permettant ainsi un comportement flexible et extensible.
682684

683-
> **À retenir :**
684-
> Le double dispatch permet de gérer des interactions complexes entre types, en déléguant la logique de décision à des classes spécifiques. Cela rend le code plus flexible et extensible, car on peut ajouter de nouveaux types d'interactions sans modifier les classes existantes.
685+
::: tip
686+
À retenir : Le double dispatch permet de gérer des interactions complexes entre types, en déléguant la logique de décision à des classes spécifiques. Cela rend le code plus flexible et extensible, car on peut ajouter de nouveaux types d'interactions sans modifier les classes existantes.
687+
:::
685688

686689

687690

688-
> **À retenir :**
689-
> Ces patterns avancés permettent de structurer des systèmes complexes et évolutifs.
691+
::: tip
692+
À retenir : Ces patterns avancés permettent de structurer des systèmes complexes et évolutifs.
693+
:::

docs/cours/java/10-exceptions.md

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
La gestion des erreurs est un aspect fondamental de la programmation. En Java, ce sont les exceptions qui permettent de signaler et de traiter les situations anormales, sans faire planter tout le programme.
44

5-
> **À retenir** : Une exception est un événement qui interrompt le déroulement normal du programme. Elle permet de réagir proprement à une erreur, au lieu de laisser le programme s’arrêter brutalement.
5+
::: info À retenir
6+
Une exception est un événement qui interrompt le déroulement normal du programme. Elle permet de réagir proprement à une erreur, au lieu de laisser le programme s’arrêter brutalement.
7+
:::
68

79
## Qu'est-ce qu'une exception ?
810

@@ -14,7 +16,9 @@ Pour éviter cela, il faut gérer les exceptions à l’aide d’un bloc `try-ca
1416

1517
Le bloc `try` permet d’« essayer » un morceau de code susceptible de générer une exception. Si une exception survient, le contrôle passe dans le bloc `catch` correspondant, où vous pouvez réagir à l’erreur.
1618

17-
> **Info** : Vous pouvez chaîner plusieurs blocs `catch` pour gérer différents types d’exceptions, ou utiliser un seul bloc avec le type `Exception` pour tout attraper.
19+
::: info
20+
Vous pouvez chaîner plusieurs blocs `catch` pour gérer différents types d’exceptions, ou utiliser un seul bloc avec le type `Exception` pour tout attraper.
21+
:::
1822

1923
Exemple :
2024

@@ -32,7 +36,9 @@ catch(InputMismatchException ex){
3236
scanner.close();
3337
```
3438

35-
> **Attention** : Le nom de la méthode est `nextInt()` (avec un n minuscule), pas `NextInt()`.
39+
::: warning Attention
40+
Le nom de la méthode est `nextInt()` (avec un n minuscule), pas `NextInt()`.
41+
:::
3642

3743
## Finally
3844

@@ -138,7 +144,9 @@ Throwable
138144
└── ...
139145
```
140146

141-
> **À savoir** : Les erreurs (`Error`) sont des problèmes graves (ex : mémoire insuffisante) que l’on ne cherche généralement pas à gérer.
147+
::: info À savoir
148+
Les erreurs (`Error`) sont des problèmes graves (ex : mémoire insuffisante) que l’on ne cherche généralement pas à gérer.
149+
:::
142150

143151
### Exemple pratique complet
144152

@@ -185,19 +193,25 @@ public class ExceptionComparison {
185193

186194
### Quand utiliser quoi ?
187195

188-
> **Utilisez les exceptions vérifiées** quand :
189-
> - L’erreur est prévisible et externe à votre contrôle (fichier manquant, problème réseau, etc.)
190-
> - L’application peut potentiellement récupérer de l’erreur
191-
> - Vous voulez forcer les utilisateurs de votre méthode à gérer l’exception
196+
::: tip
197+
**Utilisez les exceptions vérifiées** quand :
198+
- L’erreur est prévisible et externe à votre contrôle (fichier manquant, problème réseau, etc.)
199+
- L’application peut potentiellement récupérer de l’erreur
200+
- Vous voulez forcer les utilisateurs de votre méthode à gérer l’exception
201+
:::
192202

193-
> **Les RuntimeException sont appropriées** quand :
194-
> - L’erreur représente un bug de programmation (paramètre null inattendu, index invalide, etc.)
195-
> - L’erreur indique un état incohérent qui ne devrait jamais arriver si le code est correct
196-
> - L’erreur est généralement fatale et difficile à récupérer
203+
::: info
204+
**Les RuntimeException sont appropriées** quand :
205+
- L’erreur représente un bug de programmation (paramètre null inattendu, index invalide, etc.)
206+
- L’erreur indique un état incohérent qui ne devrait jamais arriver si le code est correct
207+
- L’erreur est généralement fatale et difficile à récupérer
208+
:::
197209

198210
Cette distinction aide à créer du code plus robuste et expressif : les exceptions vérifiées documentent les cas d’erreur que les appelants doivent considérer, tandis que les RuntimeException signalent des bugs qui doivent être corrigés plutôt que gérés.
199211

200-
> **Pour aller plus loin** : Essayez de provoquer différentes exceptions dans vos programmes, puis entraînez-vous à les gérer proprement avec des blocs try-catch adaptés !
212+
::: tip
213+
Pour aller plus loin : Essayez de provoquer différentes exceptions dans vos programmes, puis entraînez-vous à les gérer proprement avec des blocs try-catch adaptés !
214+
:::
201215

202216

203217

@@ -230,7 +244,9 @@ public class PropagationExceptionDemo {
230244
}
231245
```
232246

233-
> **À retenir** : Une exception peut être capturée à n’importe quel niveau de la pile d’appels. On peut choisir de la traiter, de la relancer, ou de la transformer en une autre exception plus explicite.
247+
::: info À retenir
248+
Une exception peut être capturée à n’importe quel niveau de la pile d’appels. On peut choisir de la traiter, de la relancer, ou de la transformer en une autre exception plus explicite.
249+
:::
234250

235251
## Créer ses propres exceptions
236252

@@ -252,7 +268,9 @@ public class InvalidUserInputException extends Exception {
252268
}
253269
```
254270

255-
> **Info** : L’argument `cause` permet de conserver la trace de l’exception d’origine. Cela facilite le débogage, car on peut remonter toute la chaîne d’exceptions jusqu’à la source du problème.
271+
::: info
272+
L’argument `cause` permet de conserver la trace de l’exception d’origine. Cela facilite le débogage, car on peut remonter toute la chaîne d’exceptions jusqu’à la source du problème.
273+
:::
256274

257275
Vous pouvez ensuite utiliser votre exception personnalisée dans votre code :
258276

@@ -270,7 +288,9 @@ public void processUserInput(String input) throws InvalidUserInputException {
270288

271289
Dans cet exemple, si l’utilisateur saisit une valeur non entière, une `NumberFormatException` sera levée. On la capture et on relance une exception métier plus explicite (`InvalidUserInputException`), tout en conservant la cause d’origine grâce à l’argument `cause`.
272290

273-
> **À retenir** : Créer ses propres exceptions permet de rendre le code plus lisible, de mieux documenter les erreurs possibles, et de faciliter le suivi des causes lors du débogage.
291+
::: info À retenir
292+
Créer ses propres exceptions permet de rendre le code plus lisible, de mieux documenter les erreurs possibles, et de faciliter le suivi des causes lors du débogage.
293+
:::
274294

275295
### Affichage de la trace complète avec `printStackTrace()`
276296

@@ -309,7 +329,9 @@ Caused by: java.lang.NumberFormatException: For input string: "abc"
309329
...
310330
```
311331

312-
> **À retenir** : Grâce à l’argument `cause` et à `printStackTrace()`, on peut remonter toute la chaîne des erreurs, ce qui facilite grandement le débogage.
332+
::: info À retenir
333+
Grâce à l’argument `cause` et à `printStackTrace()`, on peut remonter toute la chaîne des erreurs, ce qui facilite grandement le débogage.
334+
:::
313335

314336

315337
## Exemple réel : gestion et propagation d’exceptions dans une application
@@ -376,5 +398,7 @@ public class ApplicationDemo {
376398
- Une erreur d’analyse (`IllegalArgumentException`) est capturée, puis transformée en `AnalysisException` (exception métier).
377399
- Une erreur d’accès au fichier (`IOException`) est capturée et transformée en `AnalysisException`.
378400

379-
> **À retenir** : Dans une application réelle, il est courant de laisser certaines exceptions traverser plusieurs couches, d’en relancer d’autres, ou de les transformer pour donner plus de sens au contexte métier.
401+
::: info À retenir
402+
Dans une application réelle, il est courant de laisser certaines exceptions traverser plusieurs couches, d’en relancer d’autres, ou de les transformer pour donner plus de sens au contexte métier.
403+
:::
380404

0 commit comments

Comments
 (0)