TP3 pile - infos supplémentaires

Introduction

La version originale du TP se trouve sur http://lmi92.cnam.fr/progAvancee/ et contient des instructions pour BlueJ.
Pour tester, vous pouvez suivre les instructions de Paris et importer le TP dans BlueJ, ça vous permettra par exemple d'avoir un diagramme de classe.

Cette page contient des instructions pour faire le TP sur Eclipse.

Une copie de l'énoncé original se trouve sur cnam-paris/tp3.html

Chaque question du TP correspond à un package.
Le code source des énoncés est dans le répertoire enonce/

Les tests unitaires donnés dans l'énoncé sont en junit3 et doivent être adaptés pour utiliser junit5.

Dans Eclipse, créez un nouveau projet java "tp3-pile"

Question 1

- Click droit sur le projet / Nouveau / Package ; nommez-le "question1"
- Click droit sur le package question1 / Import / File system ; choisissez le répertoire enonce/question1/
(cela implique que vous ayez une version du cours sur votre machine - si vous avez déjà cloné le dépôt, mettez à jour avec git pull -u)

L'ennoncé du TP contient une version de la classe Pile qui marche avec des int.
Sans modifier le code, vous pouvez tester l'IHM : click droit sur IHMPile.java / Run as / Java application.
Les boutons ne répondent pas, c'est normal.

Question 1.1

  1. Complétez IHMPile.java pour faire fonctionner les boutons "Empiler" et "Dépiler".
  2. L'énoncé fournit une pile qui fonctionne avec des int.
    Modifiez Pile.java pour que la pile fonctionne avec des Object, voir l'énoncé de Paris pour vous aider.
  3. Vérifiez que IHMPile fonctionne toujours, et que vous pouvez saisir autre chose que des int.
  4. Ecrivez des classes de test pour les classes Pile et PolygoneRegulierTest (en JUnit 5).
Dans la classe Pile, vous verrez que la méthode toString() utilise la classe StringBuffer, pas vue en cours.
On pourrait très bien écrire cette méthode en n'utilisant que String.
Pour comprendre la différence, voir par exemple http://www.commentcamarche.net/forum/affich-52738-string-et-string-buffer-en-java

Question 1.2

Pour la suite du TP, suivez l'énoncé de Paris.

Question 2

Dans le code fourni, tous les constructeurs ont une signature de type : public Pile(int taille) ; ça fonctionne, mais le nom du paramètre porte à confusion.
Vous pouvez remplacer par public Pile(int capacite).

Créez un nouveau package "question2" en important les fichiers comme à la question1.

Question 2.1

Dans l'ennoncé, le lien "How to avoid traps and correctly override methods from java.lang.Object" est cassé, l'url correcte est https://www.javaworld.com/article/2076332/java-se/how-to-avoid-traps-and-correctly-override-methods-from-java-lang-object.html
Vous n'êtes pas obligés de comprendre tous les détails de l'article pour répondre à la question (utile pour la question 2.5).

Question 2.2

A lire avant : Délégation

Les Piles 2 et 3 utilisent une syntaxe qu'on n'a pas encore vu : private Stack<Object> stk;
En fait, cela veut seulement dire que stk est une Stack qui contient des Object.
Pour comprendre de quoi il s'agit, lisez le début du cours sur les génériques (lire l'intro et le paragraphe "Generic types").
Dans le constructeur de Pile2, pour initialiser stk, vous aurez besoin de la syntaxe : this.stk = new Stack<Object>();

Pile4 utilise la notion de classe interne, voir le cours sur les types imbriqués.
Dans mon implémentation de Pile4, pour que ce soit plus clair j'ai remplacé suivant() et element() par getSuivant() et getElement().

Question 2.3

Assez rapide à écrire, car PileTest est déjà écrite, pour écrire les autres classes de test, il suffit de copier-coller PileTest et de replacer "Pile" par "Pile2", "Pile3", "Pile4".

Question 3

On utilisera ces questions pour servir d'exemples aux cours sur les generics et les annotations.