forked from nfp121-bek-920bek/nfp121.tp5
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tp5.html
387 lines (358 loc) · 22.3 KB
/
tp5.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
<html>
<body>
<link rel="stylesheet" type="text/css" href="css/style.css" />
<div id="container">
<div id="header">
<div id="header_toprow">
Conservatoire national des arts et métiers
</div>
<div id="header_title">
NFP121 : Programmation avancée<br />
TP n° 5 - Classes abstraites / interface / héritage
</div>
</div>
<div id="content">
<div class="paragraphe">
Thèmes du TP :<br />
<br />
Classes abstraites, interface, héritage
<ul>
<li>Le package java.util
<ul>
<li>java.util.AbstractCollection</li>
<li>java.util.AbstractSet</li>
<li>java.util.Set</li>
<li>java.util.TreeSet</li>
<li>java.util.Vector</li>
<li>java.util.HashMap</li>
</ul>
</li>
<li>Les interfaces
<ul>
<li>Iterator</li>
<li>Comparator</li>
</ul>
</li>
</ul>
<br />
Lecture préalable :
<ul>
<li>Les notes de cours</li>
<li>Ce tutorial sur les <a href="http://docs.oracle.com/javase/tutorial/collections/index.html" target="_blank">collections</a></li>
<li>Le
<a href="http://jfod.cnam.fr/NFP121/corejavachap2.pdf">
chapitre 2 de ce livre</a> </li>
<li>Revoir également les <a href="http://docs.oracle.com/javase/tutorial/java/javaOO/index.html" target="_blank">classes internes</a> (<i>Nested Classes</i>)</li>
</ul>
</div>
<div class="paragraphe">
<p align="center">(L'énoncé de la question 1 est inspiré du tutorial d'Oracle sur les <a href="http://docs.oracle.com/javase/tutorial/collections/index.html" target="_blank">
collections</a>.)</p>
</div>
<br />
<hr />
<div class="question">
<img src="images/question1_1.png" width="111" height="80" />
<span>Une classe Ensemble</span>
</div>
<div class="paragraphe">
Complétez la classe "Ensemble", nommée <b>Ensemble<T></b>
<ul>
<li>L'implémentation préconisée utilise par délégation une instance de la classe <b>java.util.Vector<T></b>.</li>
<li>Seule <b>une méthode est à développer ici</b> : <code><font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>boolean </b></font><font color="#000000">add</font><font color="#000000">(</font><font color="#000000">T t</font><font color="#000000">)</font></code>
<li>Cette méthode doit garantir la sémantique de l'ajout d'un élément dans un ensemble (au sens mathématique).</li>
<li>Questions à se poser : Que se passe-t-il si on utilise this.add(...) dans cette méthode ? Et this.contains() ?
Que déclenche la méthode addAll de la super-classe ? </li>
</ul>
</div>
<br />
<hr />
<div class="question">
<img src="images/question1_2.png" width="111" height="80" />
<span>Les tests unitaires</span>
</div>
<div class="paragraphe">
Proposez une classe de tests unitaires de la classe "Ensemble<T>" (pour la méthode add())
</div>
<br />
<hr />
<div class="question">
<img src="images/question1_3.png" width="111" height="80" />
<span>La classe Ensemble<T> (suite)</span>
</div>
<div class="paragraphe">
Enrichissez la classe Ensemble<T>
avec ces 4 opérations :
</div>
<p align="center">
<img class="win_screenshot" src="images/operations.png" width="717" height="177" />
</p>
<div class="paragraphe">
<b>Aide : </b><br />
<br />
° <b>voir les méthodes xxxAll</b> spécifiées dans l'interface java.util.Collection (<b>aucune boucle n'est nécessaire !
pour la réalisation de ces 4 méthodes</b>). Dans la javadoc, "... adds each object ..." signifie "... calls add() for each object ..."<br />
°° ((e union e1) - (e inter e1))
</div>
<p><font size="4">Aide au comportement attendu</font>, une
interface graphique est disponible à cette adresse<br />
</p>
<div class="paragraphe">
<b><font size="3">>appletviewer
http://jfod.cnam.fr/progAvancee/tp5/tp5.html puis sélectionnez
la bonne applette</font></b><blockquote>
<p>
<img border="0" src="images/tp5.ht1.jpg" width="716" height="341"></p>
</blockquote>
<p>Attention chaque <b>opération retourne un nouvel ensemble</b>, comme le suggère cette signature de la méthode "union"
</div>
<div class="codesource">
<code>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">Ensemble<T> union</font><font color="#000000">( </font><font color="#000000">Ensemble<? </font><font color="#7f0055"><b>extends </b></font><font color="#000000">T>e1</font><font color="#000000">) </font><font color="#000000">... </font>
</code>
</div>
<div class="paragraphe">
Une utilisation possible :
</div>
<div class="codesource">
<code>
<font color="#ffffff"> </font><font color="#000000">Ensemble e = ...</font>
<br />
<font color="#ffffff"> </font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#2a00ff">" union de e et de e1 : " </font><font color="#000000">+ e.union</font><font color="#000000">(</font><font color="#000000">e1</font><font color="#000000">))</font><font color="#000000">; </font>
</code>
<p>
<font size=4>
<b>voir les méthodes <tt>xxxAll</tt> spécifiées dans l'interface
<a href="http://java.sun.com/javase/6/docs/api/java/util/package-summary.html"><tt>java.util.Collection</tt></a></b>
<i>(aucune boucle n'est nécessaire !, ce sera testé par jnews)</i>
<br>
Dans la javadocil est écrit, "... adds each object ..." signifie
"... calls <tt>add()</tt> for each object ..."
<i>(pattern Template Method)</i>
<br>
Bien comprendre quelle méthode <tt>addAll</tt> et quelle méthode <tt>add</tt>
sont appelées à chaque fois.
<br>
°° <b>(<i>(e union e1) - (e inter e1)</i>)</b>
<br>
<i>On peut coder, (ce sera testé par jnews) cette méthode avec une seule instruction !</i>
return <b>(<i>(e union e1) - (e inter e1)</i>)</b> ;</font></div>
<hr />
<div class="question">
<img src="images/question1_4.png" width="111" height="80" />
<span>Les tests unitaires (suite)</span>
</div>
<div class="paragraphe">
Enrichissez la classe de tests unitaires demandée en 1.2 (chaque méthode doit avoir été testée au moins une fois).
L'interface graphique est complète, son comportement avec votre
classe Ensemble doit être analogue à l'applette en ligne
</div>
<br />
<br />
<hr />
<div class="question">
<img src="images/question2_1.png" width="111" height="80" />
<span>Les listes et dictionnaires</span>
</div>
<div class="paragraphe">
Le texte de la fenêtre de l'interface ci-dessous est une liste constituée de mots extraits du <a href="http://jfod.cnam.fr/NFP121/corejavachap2.pdf" target="_blank">chapitre 2 de CoreJava2</a> consacré au "<b>LinkedList</b>" (les mots sont rassemblés dans une constante de type "String", <b>nommée CHAPITRE2</b> de la classe <b>Chapitre2CoreJava2</b>).<br />
<br />
<b>L'objectif est de pouvoir faire différents traitements sur cette liste de mots.</b>
</div>
<p align="center">
<img border="0" src="images/tp5.ht2.jpg" width="716" height="341"></p>
<p align="center">
<br />
</p>
<div class="paragraphe">
<b><font size="3">>appletviewer
http://jfod.cnam.fr/progAvancee/tp5/tp5.html puis sélectionnez
la bonne applette</font></b></div>
<div class="paragraphe">
<p>Complétez la classe <b>Chapitre2CoreJava2</b> en développant ces deux méthodes de classe<br />
<br />
</p>
<ul>
<li>Obtention d'une liste de mots à partir de la constante CHAPITRE2.<br />
<div class="codesource">
<code>
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#000000">List<String> listeDesMots</font><font color="#000000">()</font><i>(utilisez une LinkedList)</i>
</code>
</div>
</li>
<li>Obtention d'une liste de couples <String,Integer>, à partir la liste des mots ci-dessus.<br />
<div class="codesource">
<code>
<font color="#7f0055"><b>public static </b></font><font color="#000000">Map<String,Integer> occurrencesDesMots</font><font color="#000000">(</font><font color="#000000">List<String> listeDesMots</font><font color="#000000">)</font><i>(utilisez une HashMap)</i>
</code>
</div>
</li>
</ul>
</div>
<p align="center">
</p>
<hr />
<div class="question">
<img src="images/question2_2.png" width="111" height="80" />
<span>la classe JPanelListe</span>
</div>
<div class="paragraphe">
Complétez la classe <b>JPanelListe</b> afin d'implanter, toutes les actions associées aux noms des boutons<br />
<br />
<ul>
<li><b>rechercher</b> : recherche du mot tapé dans la zone de saisie; le booléen, le résultat de la recherche est affiché. la touche Entrée du clavier a le même effet qu'une action effectuée sur ce bouton.</li>
<li><b>retirer</b> : retrait de tous les mots commençant par le préfixe de la zone de saisie; le booléen, résultat du retrait est affiché.</li>
<li><b>croissant</b> : tri du texte selon cet ordre, utilisez Collections.sort.</li>
<li><b>décroissant</b> : proposer une classe interne implémentant l'interface Comparator.</li>
<li><b>occurrence</b> : obtention du nombre d'occurrences du mot présent dans la zone de saisie</li>
</ul>
une IHM au comportement attendu :
<p><b><font size="3">>appletviewer
http://jfod.cnam.fr/progAvancee/tp5/tp5.html</font></b></p>
<blockquote>
<blockquote>
<p>
<img border="0" src="images/tp5.ht2.jpg" width="367" height="177"></p>
</blockquote>
</blockquote>
</div>
<p align="left">
</p>
<p align="left">
<font face="Verdana" size="2">
<b>ATTENTION</b> le retrait d'un élément qui a déjà été présent
dans la table retourne un nombre d'occurrences égal à <b>zéro</b>.
</font></p>
<p align="left">
<font face="Verdana" size="2">
Demander le nombre d'occurrences d'un
élément qui n'a jamais été présent dans la liste initiale doit retourner
<b>??? </b></font></p>
<hr />
<div class="question">
<img src="images/question2_3.png" width="111" height="80" />
<span>la classe JPanelListe2</span>
</div>
<div class="paragraphe">
Complétez maintenant, la classe JPanelListe2 afin d'implanter la possibilité d<b>'<font size="4">annuler</font>
</b>les actions de modification du texte comme le retrait ou le tri sur la liste.<br />
<br />
L'idée est de stocker l'état de la 'liste de String' à chaque action ('retirer' , 'croissant' , 'decroisssant') dans une Pile (java.util.Stack<e>). Le dernier état de la 'liste de String' empilé est restitué à chaque action 'annuler'. Quand la pile est vide le bouton 'annuler' est sans effet.<br />
<br />
<b>ATTENTION de mettre à jour la table des occurrences</b>.
Pour la fonctionnalité annuler, Il est fortement encouragé
d'utiliser le patron
<a href="http://en.wikipedia.org/wiki/Memento_pattern">
Memento</a>, cette
<a href="https://www.youtube.com/watch?v=jOnxYT8Iaoo">vidéo</a> peut
vous être utile.<br />
<br />
</div>
<p><b><font size="4">>appletviewer
http://jfod.cnam.fr/progAvancee/tp5/tp5.html puis
sélectionnez l'applette avec l'annulation possible</font></b></p>
<p>
<img border="0" src="images/tp5.ht3.jpg" width="667" height="321"></p>
<blockquote>
<blockquote>
<p> </p>
</blockquote>
</blockquote>
<p align="left">
<applet code="question2.AppletteListe2.class" align="baseline" width="700" height="260" archive="applettes2.jar"></applet>
</p>
<p align="left">
</p>
<div class="paragraphe">
<b>Soumettez en fin de question votre réponse</b>
</div>
<br />
<hr />
<div class="question">
<img src="images/question3_1.png" width="111" height="80" />
<span>Le pattern fabrique</span>
</div>
<div class="paragraphe">
Selon la bibliographie habituelle (GoF95), l'objectif du Pattern Factory est de définir une interface pour la création d'un objet, en laissant aux classes implémentant cette interface le choix de la classe à instancier pour cet objet.<br />
<br />
Interface <i>Factory<T></i>, l'implémentation de la méthode create est laissée aux "clients"
</div>
<div class="codesource">
<code>
<font color="#7f0055"><b>package </b></font><font color="#000000">question3;</font>
<br />
<font color="#ffffff"></font>
<br />
<font color="#ffffff"> </font><font color="#7f0055"><b>public interface </b></font><font color="#000000">Factory<T> </font><font color="#000000">{</font>
<br />
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">T create</font><font color="#000000">()</font><font color="#000000">;</font>
<br />
<font color="#ffffff"> </font><font color="#000000">}</font>
</code>
</div>
<div class="paragraphe">
Exemple : TextFactory
</div>
<div class="codesource">
<code>
<font color="#7f0055"><b>public class </b></font><font color="#000000">TextFactory1 </font><font color="#7f0055"><b>implements </b></font><font color="#000000">Factory<TextComponent> </font><font color="#000000">{</font>
<br />
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">TextComponent create</font><font color="#000000">() {</font>
<br />
<font color="#ffffff"> </font><font color="#7f0055"><b>return new </b></font><font color="#000000">TextArea</font><font color="#000000">(</font><font color="#990000">100</font><font color="#000000">,</font><font color="#990000">50</font><font color="#000000">)</font><font color="#000000">;</font>
<br />
<font color="#ffffff"> </font><font color="#000000">}</font>
<br />
<font color="#000000">}</font>
<br />
<font color="#7f0055"><b>public class </b></font><font color="#000000">TextFactory2 </font><font color="#7f0055"><b>implements </b></font><font color="#000000">Factory<TextComponent> </font><font color="#000000">{</font>
<br />
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">TextComponent create</font><font color="#000000">(){</font>
<br />
<font color="#ffffff"> </font><font color="#7f0055"><b>return new </b></font><font color="#000000">TextField</font><font color="#000000">(</font><font color="#990000">40</font><font color="#000000">)</font><font color="#000000">;</font>
<br />
<font color="#ffffff"> </font><font color="#000000">}</font>
<br />
<font color="#000000">}</font>
</code>
</div>
<div class="paragraphe">
Un usage :
</div>
<div class="codesource">
<code>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>void </b></font><font color="#000000">utilisation</font><font color="#000000">(</font><font color="#000000">Factory fabrique</font><font color="#000000">){</font>
<br />
<font color="#ffffff"> </font><font color="#000000">TextComponent tc = fabrique.create</font><font color="#000000">()</font><font color="#000000">;</font>
<br />
<font color="#ffffff"> </font><font color="#000000">tc.setText</font><font color="#000000">( </font><font color="#2a00ff">"essai" </font><font color="#000000">)</font><font color="#000000">;</font>
<br />
<font color="#ffffff"> </font><font color="#000000">}</font>
<br />
<font color="#ffffff"></font>
<br />
<font color="#ffffff"> </font><font color="#000000">utilisation</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">TextFactory1</font><font color="#000000">())</font><font color="#000000">;</font>
<br />
<font color="#ffffff"> </font><font color="#000000">utilisation</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">TextFactory2</font><font color="#000000">())</font><font color="#000000">; </font>
</code>
</div>
<div class="paragraphe">
Proposez les fabriques d'ensembles <b>HashSetFactory</b>, (en utilisant la classe concrète java.util.HashSet) et <b>TreeSetFactory</b>, (en utilisant la classe concrète java.util.TreeSet,
attention dans ce cas les éléments doivent être comparables...).<br />
</div>
<br />
<hr />
<div class="question">
<img src="images/question3_2.png" width="112" height="80" />
<span>Les tests unitaires</span>
</div>
<div class="paragraphe">
Complétez les classes et la classe de Tests unitaires.
</div>
</div>
<div id="footer">
<a class="lien" href="http://jfod.cnam.fr/" target="_blank">JFOD</a> | <a class="lien" href="http://deptmedia.cnam.fr/phpBB2/viewforum.php?f=40" target="_blank">FORUM</a> | <a class="lien" href="http://www.cnam.fr/" target="_blank">CNAM</a>
</div>
</div>
</body>
</html>