You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/cours/design-patterns/1-intro.md
+12-9Lines changed: 12 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,20 +2,22 @@
2
2
3
3
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.
4
4
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
+
:::
10
11
11
12
## Pourquoi utiliser les design patterns ?
12
13
-**Réutilisabilité** : On évite de réinventer la roue.
13
14
-**Lisibilité** : Les développeurs comprennent plus vite le rôle d'une structure connue.
14
15
-**Robustesse** : Les patterns sont éprouvés et testés.
15
16
-**Communication** : Ils fournissent un vocabulaire commun entre développeurs.
16
17
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
+
:::
19
21
20
22
## Origine
21
23
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 :
28
30
-**Conséquences**
29
31
-**Exemple d'implémentation**
30
32
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.
Copy file name to clipboardExpand all lines: docs/cours/design-patterns/2-categories.md
+26-24Lines changed: 26 additions & 24 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,44 +2,46 @@
2
2
3
3
Les design patterns sont classés en trois grandes familles, chacune répondant à des besoins spécifiques dans la conception logicielle.
4
4
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
+
:::
7
8
8
9
## 1. Patterns de création (Creational Patterns)
9
10
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.
10
11
11
12
**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.
17
18
18
19
## 2. Patterns structurels (Structural Patterns)
19
20
Ils concernent la composition des classes et des objets, facilitant la conception de structures flexibles et efficaces.
20
21
21
22
**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.
Copy file name to clipboardExpand all lines: docs/cours/design-patterns/3-creational.md
+9-6Lines changed: 9 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,8 +2,9 @@
2
2
3
3
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.
4
4
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
+
:::
7
8
8
9
## Singleton
9
10
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 {
54
55
}
55
56
```
56
57
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
+
:::
59
61
60
62
## Factory Method
61
63
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();
243
245
Sheep s2 = s1.clone();
244
246
```
245
247
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
+
:::
248
251
249
252
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.
Copy file name to clipboardExpand all lines: docs/cours/design-patterns/4-structural.md
+12-8Lines changed: 12 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,8 +2,9 @@
2
2
3
3
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.
4
4
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
+
:::
7
8
8
9
## Adapter
9
10
Permet de faire collaborer des classes qui n'ont pas d'interface compatible.
@@ -51,8 +52,9 @@ class Adaptateur implements Cible {
51
52
}
52
53
```
53
54
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
+
:::
56
58
57
59
## Bridge
58
60
Sépare l'abstraction de son implémentation pour qu'elles puissent évoluer indépendamment.
@@ -148,8 +150,9 @@ class Composite implements Composant {
148
150
}
149
151
```
150
152
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
+
:::
153
156
154
157
## Decorator
155
158
Ajoute dynamiquement des responsabilités à un objet.
@@ -307,5 +310,6 @@ class ProxyService implements Service {
307
310
}
308
311
```
309
312
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.
Copy file name to clipboardExpand all lines: docs/cours/design-patterns/5-behavioral.md
+12-8Lines changed: 12 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,8 +2,9 @@
2
2
3
3
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.
4
4
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
+
:::
7
8
8
9
## Observer
9
10
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);
64
65
sujet.changerEtat("Nouveau!");
65
66
```
66
67
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
+
:::
69
71
70
72
## Strategy
71
73
Permet de changer dynamiquement l'algorithme utilisé par un objet.
@@ -680,10 +682,12 @@ sequenceDiagram
680
682
681
683
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.
682
684
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
+
:::
685
688
686
689
687
690
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.
Copy file name to clipboardExpand all lines: docs/cours/java/10-exceptions.md
+42-18Lines changed: 42 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,9 @@
2
2
3
3
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.
4
4
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
+
:::
6
8
7
9
## Qu'est-ce qu'une exception ?
8
10
@@ -14,7 +16,9 @@ Pour éviter cela, il faut gérer les exceptions à l’aide d’un bloc `try-ca
14
16
15
17
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.
16
18
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.
> **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
+
:::
36
42
37
43
## Finally
38
44
@@ -138,7 +144,9 @@ Throwable
138
144
└── ...
139
145
```
140
146
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
+
:::
142
150
143
151
### Exemple pratique complet
144
152
@@ -185,19 +193,25 @@ public class ExceptionComparison {
185
193
186
194
### Quand utiliser quoi ?
187
195
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
+
:::
192
202
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
+
:::
197
209
198
210
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.
199
211
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
+
:::
201
215
202
216
203
217
@@ -230,7 +244,9 @@ public class PropagationExceptionDemo {
230
244
}
231
245
```
232
246
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
+
:::
234
250
235
251
## Créer ses propres exceptions
236
252
@@ -252,7 +268,9 @@ public class InvalidUserInputException extends Exception {
252
268
}
253
269
```
254
270
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
+
:::
256
274
257
275
Vous pouvez ensuite utiliser votre exception personnalisée dans votre code :
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`.
272
290
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
+
:::
274
294
275
295
### Affichage de la trace complète avec `printStackTrace()`
> **À 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
+
:::
313
335
314
336
315
337
## Exemple réel : gestion et propagation d’exceptions dans une application
@@ -376,5 +398,7 @@ public class ApplicationDemo {
376
398
- Une erreur d’analyse (`IllegalArgumentException`) est capturée, puis transformée en `AnalysisException` (exception métier).
377
399
- Une erreur d’accès au fichier (`IOException`) est capturée et transformée en `AnalysisException`.
378
400
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.
0 commit comments