Skip to content

Commit

Permalink
Merge pull request #111 from fuhrmanator/olon11/grasp2
Browse files Browse the repository at this point in the history
Ajout d'exercices pour les GRASP
  • Loading branch information
fuhrmanator authored Feb 20, 2023
2 parents ebbc3d9 + 63d42e5 commit 6898a1e
Showing 1 changed file with 76 additions and 1 deletion.
77 changes: 76 additions & 1 deletion GRASP.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -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.

:::

Expand Down Expand Up @@ -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;
}
}
```
::::

:::

0 comments on commit 6898a1e

Please sign in to comment.