• Aucun résultat trouvé

Dans l épisode précédent

N/A
N/A
Protected

Academic year: 2022

Partager "Dans l épisode précédent"

Copied!
7
0
0

Texte intégral

(1)

Mon premier patron de conception : La Stratégie

Sébastien Mosser - INF5153 Chapitre 6 - Capsule 2 Automne 2020

ENCART CAMÉRA

crédits photos: Pixabay

Dans l’´episode précédent …

On s’est trompé

Et pourtant on pensait avoir fait comme il faut.

C’est normal de se tromper en conception

Il est illusoire de chercher la meilleure conception du premier coup

L’activité de conception est une activité d’essai-erreur

Il faut en faire, en faire, et encore en faire, …

2

ENCART CAMÉRA

3

ENCART CAMÉRA

Cancanant cancaner() default void cancaner() {

println("coin-coin");

}

AnimalVolant voler() default void voler() {

println("je m'envole");

}

Canard nager() afficher()

Colvert cancaner() voler() afficher()

@Override void afficher() { println("J'ai le col vert");

}

FuliguleTeteRouge cancaner() voler() afficher()

@Override void afficher() { println("J'ai la tête rouge");

}

CanardEnPlastique cancaner() afficher()

@Override void cancaner() { println("pouic-pouic");

}

@Override void afficher() { println("Je suis en plastique");

}

Leurre afficher()

@Override void afficher() { println("je suis un leurre en bois") }

(2)

Conclusions

Notre conception souffre fondamentalement d’un défaut majeur

• Pour l’utiliser, on doit reposer sur des casts & des instance of !

C’est à l’encontre des principes objets*

On peut s’acharner et essayer de la hacker

• Ou on peut faire levier sur cet échec pour :

caractériser les propriétés dont on à vraiment besoin

Définir une nouvelle conception, qui les garantie

* pourtant il y a des classes, des interfaces, …

4

Identifier ce qui varie

5

ENCART CAMÉRA

(cf. GRASP - “Protégé des variations”)

Identifier les points de variations

6

ENCART CAMÉRA

Être un

Canard Faire du bruit Voler

Cancanant cancaner() AnimalVolant

voler()

Canard nager() afficher()

Colvert cancaner() voler() afficher()

CanardEnPlastique cancaner() afficher()

Leurre afficher()

Cancanant cancaner() AnimalVolant

voler()

Canard nager() afficher()

Colvert cancaner() voler() afficher()

CanardEnPlastique cancaner() afficher()

Leurre afficher()

Cancanant cancaner() AnimalVolant

voler()

Canard

nager() afficher()

Colvert cancaner() voler() afficher()

CanardEnPlastique cancaner() afficher()

Leurre

afficher()

(3)

Où est notre erreur ?

7

ENCART CAMÉRA

AnimalVolant voler()

Canard afficher()

Colvert afficher() voler()

un Colvert est un Canard un Colvert est

un AnimalVolant

Généralisation

& Réalisation impliquent du Sous-Typage

Composition versus Héritage

8

ENCART CAMÉRA

C’est pour ça que l’héritage est arrivé tardivement dans le cours !

Comment faire sans héritage ?

9

ENCART CAMÉRA

Être un Canard

Comportement de cri

Comportement de vol

Possède un

Possède un

(4)

10

coin-coin

pouic-pouic

silencieux

utilise ses ailes

ne sait pas voler colvert

leurre

fuligule à

tête rouge canard en plastique Composition

Héritage

11

ENCART CAMÉRA

ComportementDeVol voler()

UtiliseSesAiles voler() Canard

voler() afficher()

Colvert afficher()

Utiliser ses ailes est un comportement de vol Un Colvert

est un Canard

Les canards possèdent un Comportement de vol

1 +vol

12

ENCART CAMÉRA

Vol

Cri ComportementDeVol voler()

NeSaitPasVoler voler()

@Override void voler() { // NOP }

UtiliseSesAiles voler()

@Override void voler() { println("je m'envole") }

ComportementSonore cancaner()

CoinCoin cancaner()

@Override void cancaner() { println("coin-coin") }

PouicPouic cancaner()

@Override void cancaner() { println("pouic-pouic") }

Silencieux cancaner()

@Override void cancaner() { // NOP } Canard nager() voler() cancaner() afficher()

void voler() { this.vol.voler() } void cancaner() {

this.cri.cancaner() } 1

-vol

1 -cri

Vision Globale

(5)

Assemblage de canards “ à la carte

13

ENCART CAMÉRA

Vol Cri

ComportementDeVol voler()

NeSaitPasVoler voler()

UtiliseSesAiles voler()

ComportementSonore cancaner()

CoinCoin cancaner()

PouicPouic cancaner()

Silencieux cancaner() Canard

nager() voler() cancaner() afficher()

Colvert afficher() 1

-vol

1 -cri

14

ENCART CAMÉRA

Vol Cri

ComportementDeVol voler()

NeSaitPasVoler voler()

UtiliseSesAiles voler()

ComportementSonore cancaner()

CoinCoin cancaner()

PouicPouic cancaner()

Silencieux cancaner() Canard

nager() voler() cancaner() afficher()

Colvert afficher()

FuliguleTeteRouge afficher()

CanardEnPlastique afficher()

Leurre afficher()

public Colvert() { this.cri = new CoinCoin() this.vol = new UtiliseSesAiles() }

@Override afficher() { println("j'ai le col vert") }

public FuliguleTeteRouge() { this.cri = new CoinCoin() this.vol = new UtiliseSesAiles() }

@Override afficher() { println("j'ai la tête rouge") }

public CanardEnPlastique() { this.cri = new PouicPouic() this.vol = new NeSaitPasVoler() }

@Override afficher() { println("Je suis en plastique");

}

public CanardEnPlastique() { this.cri = new Silencieux() this.vol = new NeSaitPasVoler() }

@Override afficher() { println("je suis un leurre en bois") }

1 -vol

1 -cri

Chaque sous-classe peut choisir ses comportements !

Changement dynamique de comportement

15

ENCART CAMÉRA

Vol Cri

ComportementDeVol voler()

ComportementSonore cancaner()

Canard nager() voler() cancaner() blesser() afficher() void blesser() {

this.vol = new NeSaitPasVoler() this.cri = new Silencieux() }

1 -vol

1

-cri

(6)

16

Premier patron de conception !

17

ENCART CAMÉRA

Le patron Stratégie

18

ENCART CAMÉRA

Context operation()

Strategy algorithm()

Strategy1 algorithm()

Strategy2 algorithm() void operation() {

this.strategy.algorithm() }

1

strategy

(7)

Les canards sont en fait des stratèges !

19

ENCART CAMÉRA

Patron

ApplicationConcrète

Context

operation() Strategy

algorithm()

Strategy1 algorithm()

Strategy2 algorithm()

Canard voler() ComportementDeVol

voler()

NeSaitPasVoler voler()

UtiliseSesAiles voler()

1

strategy

1 -vol

ENCART CAMÉRA

20

https://mosser.github.io/

https://ace-design.github.io/

Abonne toi à la chaine,

et met un pouce bleu !

Références

Documents relatifs

Consigne : avec ton crayon, trace le chemin qu’emprunte l’abeille pour voler jusqu’aux fleurs... Consigne : avec ton crayon, trace le chemin qu’emprunte le garçon pour rejoindre

Je suis un mot dans lequel O est la troisième lettre, qui

Consigne: Ecris la phrase en écriture cursive puis tout seul sur la ligne. c'est super de voler à dos

Exprimer espace et temps (tracer le chemin de la coccinelle dans l’ordre chronologique et la coller sur chaque animal au bon endroit). Associer doigts / constellations

Et comme elle dormait toute la journée et toute la nuit, cette coccinelle paresseuse ne savait pas voler.. Un jour, elle en eut assez de dormir au

C'est l'histoire d'une coccinelle qui dort le jour sur une fleur et la nuit sur une feuille et puis elle se réveille et elle réfléchit : elle en a assez de dormir à la même place

LA COCCINELLE

Consigne : Recompose le titre du livre « Violette veut voler » en retrouvant les bonnes étiquettes-mots.. Je colle ici