Formation Design Patterns juillet 2004
Envoyer un courrier :
Dernière mise à jour (Last update):
Liens
Présentation synthétique dans ../patterns/
(au
format Open Office)
../uml/UML-bookmarks.html - ../java/liens.html
Bruce Eckel's
MindView, Inc: Thinking in Patterns with Java
- aussi sur ce site plusieurs livres en HTML.
Démarrer avec CVS
- Programme formation
CVS
par J.M. Vanel
Exercices
Exercice 1
Programmer en Java l'exemple d'une base de données de Villes
avec le
Modèle de Conception Observateur-Observé; on peut
s'inspirer d'une version en C++ (classes
GeoApp, Geographie,
VillepasTrouveeException, ObservateurPopulation).
Solution en Java (ligne de
commande)
Exercice 2
Faire apparaitre la hiérarchie de java.awt.Component dans
eclipse;
examiner la classe Container. Quelle différence avec le Pattern
Composite "officiel" ?
Télécharger les exemples du livre "Java examples in a
Nutshell" (http://examples.oreilly.com/jenut3/);
faire tourner ComponentTree.
Pouvez-voir dans ComponentTree une conséquence fâcheuse de
la différence avec le Patterns Composite "officiel" ?
Solution
Exercice 3
Aller sur ma page "the same GUI
in
different (computer) languages. This a what I call the Rosetta
stone of GUI's".
Faire tourner Bonjour.java (vous pouvez faire tourner les autres via
cygwin).
Quel Design Pattern pouvez-vous reconnaitre?
Solution
Exercice 4
Conseil : faire d'abord le no 3.
Ajouter une IHM à la Solution
en Java (ligne de
commande) de la base de données de Villes (exercice 1).
- ajouter 3 champs de saisie et un bouton "Ajouter" pour une
nouvelle ville (classe InputWindow)
- ajouter un champ de requête avec le nom de la ville (et un
JLabel pour la réponse natürlich)
- mettre le champ de requête dans une autre fenêtre
(classe QueryWindow)
- factoriser le maximum de code entre les classes QueryWindow et
InputWindow, en créant une classe GeographyWindow - Conseils:
utiliser Patron de méthode; utiliser dans eclipse
Refactoring/Pull up pour remonter dans GeographyWindow les champs et
les méthodes
- faire tourner dans une même application (classe GeoAppGUI)
les fenêtres InputWindow et QueryWindow
- A-t-on besoin ici du Modèle de Conception
Observateur-Observé?
- ajouter une nouvelle fenêtre Observateur (classe
PopulationGUI) qui va afficher le total des populations
- A-t-on besoin ici du Modèle de Conception
Observateur-Observé?
- ajouter une nouvelle fenêtre Observateur (classe TableGUI)
qui va afficher une
vue HTML de l'instance Geographie; bien sûr ça va
implémenter Observateur (utiliser JEditorPane pour afficher du
HTML)
Solution
en Java (classes InputWindow, QueryWindow, ObserverWindow)
Exercice 5
A partir de ecolosim.
Voir "Manuel utilisateur" dans LISEZMOI.txt de la distribution ecolosim
(dans les fichiers téléchargés avec CVS).
Créer un "emballage" (décorateur, wrapper) autour de
deux classes
Individual qui va
ajouter les vecteurs déplacements de ces 2 modèles.
On l'appelera VectorAddWrapperModel.
- Pour tester on "ajoutera" SimpleAgregationModel et
RandomSimpleModel
. De cette façon va ajouter une composante aléatoire
à un déplacement qui serait autrement uniquement de se
rassembler au centre de gravité
- Pour généraliser je suggère le squelette de
code suivant où l'on peut "ajouter"
un nombre
quelconque de modèles :
package ecolosim.simu.models;
public class VectorAddWrapperModel implements Individual {
List<Individual>
public addDisplacement(Individual model) {
//????
}
}
Comment ajouter cette classe à
la liste des classes disponibles dans le menu déroulant
dans ecolosim:
Voir "Manuel développeur" dans LISEZMOI.txt de la distribution
ecolosim (dans les fichiers téléchargés avec CVS).
Exercice 5 bis
Plein d'autres exercices sur ecolosim ici :
http://jmvanel.free.fr/java/formation-5jours/exercices.html
Exercice 5 ter
Installer BlueJ . L'utiliser pour
visualiser les classes de Ecolosim (les fichiers bluej.pkg sont
déjà là dans tous les packages).
Quels exemples de délégation peut-on trouver? Parmi
ceux-ci lesquels sont des Décorateurs?
Exercice 6
A cette adresse on trouvera un projet de livre d'un auteur qui, comme
moi, a un point de vue "structurel" sur les DP:
Bruce Eckel's
MindView, Inc: Thinking in Patterns with Java
-
Il y a des exemples en Java pour la plupart des Patterns.
En faire tourner quelques-uns.
Exercice 7
Télécharger les exemples Java en
Français du livre en Français sur Java avec BlueJ, et
l'environnement
pédagogique BlueJ (Barnes et
Kölling).
Faire tourner les exemples des chapitres 5, 7, 10, 11, 12 . Le cas des
renards et des lapins (chap. 10) est joli à voir et ressemble
pas mal à ecolosim, mais là les animaux se
déplacent dans un quadrillage discret.
Exercice 8
Suite à l'exercie 1 ou 4, utiliser la fonctionalité
"encapsulate field" d'eclipse dans Refactoring pour "privatiser" le
champ ville dans la classe EvenementVille .
Exercice 8: Java 1.5
cf http://java.sun.com/developer/technicalArticles/releases/j2se15/
Un petit échantillon qui mélange la
généricité, l' "auto-boxing" et la
boucle for améliorée:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = list.get(0);
// i n'est pas l'indice, c'est le contenu
for (Integer i : list) {
System.out.println( i );
}
Attention : ça ne passera pas avec eclipse 3.0, il faudra
compiler en ligne de commande:
$JAVA_HOME/bin/javac Java15.java
$JAVA_HOME/bin/java -classpath . Java15
Installations et téléchargements
A télécharger :
Programme complémentaire
- quelques fonctionalités d'Eclipse: navigation,
Refactoring, Debug
- introduction au Refactoring (restructuration de code)
- le plug-in C++ d'eclipse
- ant: la (re)construction d'un livrable mieux que make
- JUnit: un outil pour les tests, et l'esprit "tests" qui va avec
Solutions
Exercice 2
Examiner la classe Container.
Quelle différence avec le Patterns
Composite "officiel" ?
Déjà la ressemblance:
- la classe Component a bien le rôle "Composant"
- la classe Container
a le rôle "Composite"
- "Composite" est bien un descendant de "Composant"
Les différences:
- la classe Component ne déclare pas add(Component comp) ,
remove(Component comp) et getComponent(int n) , contrairement au
Modèle (cf p. 191); celles-ci sont déclarées
uniquement dans Container
Pouvez-voir dans ComponentTree une conséquence fâcheuse de
la différence avec le Patterns Composite "officiel" ?
Si Component implémentait :
- int getComponentCount()
- Component getComponent(int n)
Il serait possible de parcourir l'arborescence des composants
graphiques très simplement. A cause de ça le programme
ComponentTree est obligé de faire pas mal de instanceof
(toujours un mauvais symptome, le instanceof !).
Exercice 3
Il fallait reconnaitre le Modèle de Conception "Observateur".
JButton est un observable.
Formation Design Patterns juillet 2004
Envoyer un courrier :
Dernière mise à jour (Last update):
Solutions
Exercices 2 et 3: Solutions
Exercice 4: Solution
en Java (classes InputWindow, QueryWindow, ObserverWindow)
Liens
Présentation synthétique dans ../patterns/
(au
format Open Office)
http://jmvanel.free.fr/uml/UML-bookmarks.html
http://jmvanel.free.fr/java/liens.html
Bruce Eckel's
MindView, Inc: Thinking in Patterns with Java
- sur ce site plusieurs livres en HTML.
Démarrer avec CVS
- Programme formation
CVS
par J.M. Vanel
Exercices
Exercice 1
Programmer en Java l'exemple d'une base de données de Villes
avec le
Modèle de Conception Observateur-Observé; on peut
s'inspirer d'une version en C++ (classes
GeoApp, Geographie,
VillepasTrouveeException, ObservateurPopulation).
Solution en Java (ligne de
commande)
Exercice 2
Faire apparaitre la hiérarchie de java.awt.Component dans
eclipse;
examiner la classe Container. Quelle différence avec le Pattern
Composite "officiel" ?
Télécharger les exemples du livre "Java examples in a
Nutshell" (http://examples.oreilly.com/jenut3/);
faire tourner ComponentTree.
Pouvez-voir dans ComponentTree une conséquence fâcheuse de
la différence avec le Patterns Composite "officiel" ?
Solution
Exercice 3
Aller sur ma page "the same GUI
in
different (computer) languages. This a what I call the Rosetta
stone of GUI's".
Faire tourner Bonjour.java (vous pouvez faire tourner les autres via
cygwin).
Quel Design Pattern pouvez-vous reconnaitre?
Solution
Exercice 4
Conseil : faire d'abord le no 3.
Ajouter une IHM à la Solution
en Java (ligne de
commande) de la base de données de Villes (exercice 1).
- ajouter 3 champs de saisie et un bouton "Ajouter" pour une
nouvelle ville (classe InputWindow)
- ajouter un champ de requête avec le nom de la ville (et un
JLabel pour la réponse natürlich)
- mettre le champ de requête dans une autre fenêtre
(classe QueryWindow)
- factoriser le maximum de code entre les classes QueryWindow et
InputWindow, en créant une classe GeographyWindow - Conseils:
utiliser Patron de méthode; utiliser dans eclipse
Refactoring/Pull up pour remonter dans GeographyWindow les champs et
les méthodes
- faire tourner dans une même application (classe GeoAppGUI)
les fenêtres InputWindow et QueryWindow
- A-t-on besoin ici du Modèle de Conception
Observateur-Observé?
- ajouter une nouvelle fenêtre Observateur (classe
PopulationGUI) qui va afficher le total des populations
- A-t-on besoin ici du Modèle de Conception
Observateur-Observé?
- ajouter une nouvelle fenêtre Observateur (classe TableGUI)
qui va afficher une
vue HTML de l'instance Geographie; bien sûr ça va
implémenter Observateur (utiliser JEditorPane pour afficher du
HTML)
Solution
en Java (classes InputWindow, QueryWindow, ObserverWindow)
Exercice 5
A partir de ecolosim.
Voir "Manuel utilisateur" dans LISEZMOI.txt de la distribution ecolosim
(dans les fichiers téléchargés avec CVS).
Créer un "emballage" (décorateur, wrapper) autour de
deux classes
Individual qui va
ajouter les vecteurs déplacements de ces 2 modèles.
On l'appelera VectorAddWrapperModel.
- Pour tester on "ajoutera" SimpleAgregationModel et
RandomSimpleModel
. De cette façon va ajouter une composante aléatoire
à un déplacement qui serait autrement uniquement de se
rassembler au centre de gravité
- Pour généraliser je suggère le squelette de
code suivant où l'on peut "ajouter"
un nombre
quelconque de modèles :
package ecolosim.simu.models;
public class VectorAddWrapperModel implements Individual {
List<Individual>
public addDisplacement(Individual model) {
//????
}
}
Comment ajouter cette classe à
la liste des classes disponibles dans le menu déroulant
dans ecolosim:
Voir "Manuel développeur" dans LISEZMOI.txt de la distribution
ecolosim (dans les fichiers téléchargés avec CVS).
Exercice 5 bis
Plein d'autres exercices sur ecolosim ici :
http://jmvanel.free.fr/java/formation-5jours/exercices.html
Exercice 5 ter
Installer BlueJ . L'utiliser pour
visualiser les classes de Ecolosim (les fichiers bluej.pkg sont
déjà là dans tous les packages).
Exercice 6
A cette adresse on trouvera un projet de livre d'un auteur qui, comme
moi, a un point de vue "structurel" sur les DP:
Bruce Eckel's
MindView, Inc: Thinking in Patterns with Java
-
Il y a des exemples en Java pour la plupart des Patterns.
En faire tourner quelques-uns.
Exercice 7
Télécharger les exemples Java en
Français du livre en Français sur Java avec BlueJ, et
l'environnement
pédagogique BlueJ (Barnes et
Kölling).
Faire tourner les exemples des chapitres 5, 7, 10, 11, 12 . Le cas des
renards et des lapins (chap. 10) est joli à voir et ressemble
pas mal à ecolosim, mais là les animaux se
déplacent dans un quadrillage discret.
Exercice 8
Suite à l'exercie 1 ou 4, utiliser la fonctionalité
"encapsulate field" d'eclipse dans Refactoring pour "privatiser" le
champ ville dans la classe EvenementVille .
Exercice 8: Java 1.5
cf http://java.sun.com/developer/technicalArticles/releases/j2se15/
Faire tourner ce petit échantillon qui mélange la
généricité, l' "auto-boxing" et la
boucle for améliorée:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42));
int total = list.get(0);
// i n'est pas l'indice, c'est le contenu
for (Integer i : list) {
System.out.println( i );
}
Attention : ça ne passera pas avec eclipse 3.0, il faudra
compiler en ligne de commande:
$JAVA_HOME/bin/javac Java15.java
$JAVA_HOME/bin/java -classpath . Java15
Installations et téléchargements
A télécharger :
Programme complémentaire
- quelques fonctionalités d'Eclipse: navigation,
Refactoring, Debug
- introduction au Refactoring (restructuration de code)
- le plug-in C++ d'eclipse
- ant: la (re)construction d'un livrable mieux que make
- JUnit: un outil pour les tests, et l'esprit "tests" qui va avec
Solutions
Exercice 2
Examiner la classe Container.
Quelle différence avec le Patterns
Composite "officiel" ?
Déjà la ressemblance:
- la classe Component a bien le rôle "Composant"
- la classe Container
a le rôle "Composite"
- "Composite" est bien un descendant de "Composant"
Les différences:
- la classe Component ne déclare pas add(Component comp) ,
remove(Component comp) et getComponent(int n) , contrairement au
Modèle (cf p. 191); celles-ci sont déclarées
uniquement dans Container
Pouvez-voir dans ComponentTree une conséquence fâcheuse de
la différence avec le Patterns Composite "officiel" ?
Si Component implémentait :
- int getComponentCount()
- Component getComponent(int n)
Il serait possible de parcourir l'arborescence des composants
graphiques très simplement. A cause de ça le programme
ComponentTree est obligé de faire pas mal de instanceof
(toujours un mauvais symptome, le instanceof !).
Exercice 3
Il fallait reconnaitre le Modèle de Conception "Observateur".
JButton est un observable.