Bonjour,

Veuillez trouver ci-dessous la réponse à une question
qui me semble devoir intéresser tout le monde ...

At 25/05/2008 21:24, one student wrote:
Bonjour,
Dans le cadre de l'exercice 7.47 visant à intégrer la conception de
 zuul-even-better, je me heurte à un problème : je ne vois pas comment
 combiner l'abstract command avec les enums CommandWords. Pour moi si
 chaque commande a sa classe, l'enum ne sert plus.
 Ai-je raison ?
 Si oui, supprime-t-on la conception des enums ?
 Si non, pourquoi, et comment combiner les 2 ?
Cordialement,

Excellente question !

D'abord d'un point de vue général, il est bon de poser ce genre de
question pluttt que de faire n'importe quoi; vous avez également
pu constater que souvent dans les exercices précédents, une nouvelle
version de Zuul vous était donnée comme exemple de mise en oeuvre
d'un point particulier, mais qu'elle ne reprenait pas toutes les
améliorations qui avaient été apportées à d'autres aspects du jeu.

Venons-en maintenant à l'exercice 7.47.

Tout d'abord, c'est probablement un des exercices les plus difficiles
de PR102. C'est également celui qui demande le plus de modifications
dans le code déjà écrit.

J'espère qu'en lisant le chapitre 7 vous en comprendrez tout l'intérjt.

Alors, doit-on supprimer le long switch sur les commandes
pour le remplacer par un simple appel de méthode (judicieusement
redéfinie différemment pour chaque commande) ?  OUI

Donc, doit-on supprimer les enum ?  NON

Chaque String tapée est d'abord transformée en un CommandWord (enum),
et une HashMap permet de retrouver le second à partir de la première.

Ensuite, à chaque CommandWord est associée une Command qui contient
la fameuse méthode à exécuter, et une HashMap permet de retrouver
la seconde à partir du premier.

Cette conception permet donc de séparer
la mécanique du jeu (CommandWord -> Command)
de son interface textuelle (String -> CommandWord)
en utilisant une seule instruction : "exécute la méthode
associée à la Command associée au CommandWord associé à la String tapée"

Bien entendu, l'interface graphique peut court-circuiter une étape
si elle fournit directement le CommandWord pluttt que la String.

Bon travail.

P.S.: Attention !
Zuul-even-better est écrit en java 1.4; il n'utilise donc pas le
for-each mais des itérateurs, il ne précise pas les types des
éléments des HashMap, etc., toutes choses que nous nous
interdisons de faire en 1.6 !