Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajout d'exercices pour les GRASP #111

Merged
merged 3 commits into from
Feb 20, 2023
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 74 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,75 @@ 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, il ne sera pas nécessaire de modifier 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;
}
}
```
::::

:::