diff --git a/GRASP.qmd b/GRASP.qmd index d1985978..4505b6a6 100644 --- a/GRASP.qmd +++ b/GRASP.qmd @@ -284,10 +284,11 @@ class Joueur { ::: {#exr-GRASP_GOF_contrôleur} -### GRASP Contrôleur et Fabrication Pure +### GRASP Contrôleur, Fabrication Pure et Indirection - Expliquez pourquoi le principe du GRASP Contrôleur dans le cas d'un contrôleur de session (de cas d'utilisation) est une Fabrication Pure. - Soit un contrôleur de session `GestionnaireVentes`; quelle est la "situation désespérée" qui est mitigée par ce contrôleur? Astuce: relire la définition de Fabrication Pure. +- Expliquez pourquoi le principe du GRASP Contrôleur dans le cas d'un contrôleur de session est un exemple du GRASP Indirection. ::: @@ -378,3 +379,77 @@ class SomeClass { ::: +::: {#exr-GRASP_GOF_fabrication_pure_indirection_fabrique} + +### GRASP Fabrication Pure et Indirection + +Appliquez le GRASP Fabrication Pure au contrôleur `BirdManager` pour améliorer sa cohésion. +Ajoutez une fabrique de `Bird` à qui le contrôleur pourra déléguer la responsabilité de créer les objets `Bird`. +Par la suite, expliquez pourquoi la fabrique que vous avez ajoutée est un exemple du GRASP Indirection. + +```javascript +class BirdManager { + addBird(b: {type: String, numberOfCoconuts: number, voltage: number}) { + let bird: Bird; + + if (b.type == "EuropeanSwallow") { + bird = new EuropeanSwallow(); + } + else if (b.type == "AfricanSwallow") { + bird = new AfricanSwallow(b.numberOfCoconuts); + } + else if (b.type == "NorwegianBlueParrot") { + bird = new NorwegianBlueParrot(b.voltage) + } + else { + throw new Error("Unsupported bird."); + } + + // Then, we do something with the bird... + } +} +``` + +:::: {.callout-note collapse="true" icon="false"} + +## Voici une solution + +L'ajout de la fabrique `BirdFactory` permet d'améliorer la cohésion du contrôleur `BirdManager` puisque ses responsabilités sont réduites. +La fabrique est un exemple du GRASP Indirection puisqu'elle élimine le couplage direct entre le contrôleur `BirdManager` et les différents types de `Bird`. +Si d'autres types de `Bird` sont ajoutés à l'application, l'impact sera moins important sur le contrôleur. + +```javascript +class BirdManager { + addBird(b: {type: String, numberOfCoconuts: number, voltage: number}) { + let bird: Bird = BirdFactory.createBird(b); + + // Then, we do something with the bird... + } +} + +class BirdFactory { + public static createBird(b: {type: String, numberOfCoconuts: number, + voltage: number}) { + let bird: Bird; + + if (b.type == "EuropeanSwallow") { + bird = new EuropeanSwallow(); + } + else if (b.type == "AfricanSwallow") { + bird = new AfricanSwallow(b.numberOfCoconuts); + } + else if (b.type == "NorwegianBlueParrot") { + bird = new NorwegianBlueParrot(b.voltage) + } + else { + throw new Error("Unsupported bird."); + } + + return bird; + } +} +``` +:::: + +::: +