NFP121 - Rapport de TP n°1

Auteur


Nom : xxxxxxxxxxxxx

Prénom : xxxxxxxxxxxxx

Matricule : xxxxxxxxxxxxx

Email : xxxxxxxxxxxxx

Réponses aux questions


Question 1 :

A partir des classes fournies (Circle, Square, Triangle), on peut créer des objets et appeler leurs méthodes publiques. Par exemple, en rendant square1,triangle1 et circle1 visibles, en changeant leur couleur, leur taille ou leur position, on peut obtenir ceci:

illustration de la question 1.3

Avec un clic droit sur un objet, par exemple square1, on accède à la fonctionnalité "Inspecter" qui permet de voir les champs d'instance.

illustration de la question 1.4

On constate ici que square1 a été modifié depuis sa création. Sa taille est passée de 30 à 50, sa couleur de rouge à vert, il est visible, etc. Ces données reflètent l'état de l'objet concerné à un moment donné et sont susceptibles d'être modifiées par une méthode appelée.

Code-source et documentation

Question 2 :

> 2.1

Pour obtenir un soleil bleu, dans la méthode draw(), on modifie la couleur dans sun.changeColor("yellow") par "blue".

sun = new Circle();
sun.changeColor
("blue");
sun.moveHorizontal
(180);
sun.moveVertical
(-10);
sun.changeSize
(60);
sun.makeVisible
();

Vérifions en créant une instance de la classe Picture puis en lui appliquant la méthode draw().

illustration de la question 2.1

> 2.2

Pour ajouter un nouveau soleil jaune, il faut compléter la classe Picture avec une nouvelle donnée d'instance :

private Circle soleilJaune;

Puis modifier la méthode draw() de façon à ce qu'elle crée aussi l'objet soleilJaune, dont les paramètres de position sont légèrement différents du soleil bleu pour les distinguer :

soleilJaune = new Circle();
soleilJaune.changeColor
("yellow");
soleilJaune.moveHorizontal
(190);
soleilJaune.moveVertical
(-20);
soleilJaune.changeSize
(60);
soleilJaune.makeVisible
();

Voici le résultat :

illustration de la question 2.2

> 2.3

Afin de rendre possible le coucher du soleil, il faut non seulement ajouter une méthode sunset() pour que le soleil bleu descende, mais il faut aussi ajouter un sol (ground) pour délimiter la zone derrière laquelle le soleil est censé se coucher.

/**
* Make the blue sun set
*/
public void sunset() {
   
sun.slowMoveVertical(180);
    sun.makeInvisible
();
}
private Square ground;
ground = new Square();
ground.makeVisible
();
ground.changeColor
("blue");
ground.changeSize
(320);
ground.moveVertical
(180);
ground.moveHorizontal
(-70);

Voilà le résultat de la méthode sunset() :

illustration de la question 2.3

Pour obtenir un coucher de soleil automatique sans appel à une méthode supplémentaire au moment où l'image est dessinée, il suffit de rajouter le code de la méthode sunset() à la fin des instructions de la méthode draw() et de supprimer la méthode sunset().

Code-source et documentation

Question 3 :

>3.3

Il est possible de compléter la classe AuditeurCNAM ainsi :

Tout d'abord, voici les trois méthodes (nom(), prenom(), matricule()) qui permettent de lire le nom, le prénom et le matricule d'un auditeur.

/** Lecture du nom de l'auditeur.
*
@return son nom
*/
public String nom(){
   
return this.nom;
}

/** Lecture du prénom de l'auditeur.
*
@return son prénom
*/
public String prenom(){
   
return this.prenom;
}

/** Lecture du matricule de l'auditeur.
*
@return son matricule
*/
public String matricule(){
   
return this.matricule;
}

Ces trois données sont retournées telles qu'elles ont été saisies à la création de l'objet AuditeurCNAM. Il n'y a actuellement aucune vérification sur la cohérence de ces données (chiffres ou caractères spéciaux dans le nom/prénom, etc.). On doit donc supposer que ces données sont vérifiées avant leur passage au constructeur AuditeurCNAM.
Ensuite, pour que la méthode login() fonctionne correctement, il a été nécessaire d'écrire une méthode supplémentaire sansAccents(String s), qui s'occupe de supprimer les accents des chaînes qu'on lui passe.

/** Retourne une chaîne en remplaçant les caractères accentués par les caractères non-accentués correspondants.
*
@param s la chaîne accentuée initiale
*
@return la chaîne non accentuée
*/
public String sansAccents(String s) {
   
String sAccents = "äâàáåãéèëêòóôõöøìíîïùúûüýñçÿÄÂÀÁÅÃÉÈËÊÒÓÔÕÖØÌÍÎÏÙÚÛÜÝÑÇÝ";
    String sSansAccents =
"aaaaaaeeeeooooooiiiiuuuuyncyaaaaaaeeeeooooooiiiiuuuuyncy";
   
int longueur = sAccents.length();
   
for (int i=0;i<longueur;i++) {
     
s = s.replace(sAccents.charAt(i),sSansAccents.charAt(i));
   
}
   
return s;
}

La méthode login() retourne un login Cnam simplifié mais valide. On récupère tout d'abord le nom et le prénom avec les méthodes d'accès complétées auparavant. On leur applique ensuite une série de traitements. On supprime par exemple les éventuels chiffres qui pourraient se trouver dans le nom ou le prénom pour ne garder que les lettres (et autres caractères). On supprime les accents (méthode sansAccents(String s)), on passe le tout en minuscule. On ne garde que la longueur voulue : pour le nom, les 6 premiers caractères (ou moins si le nom est plus court), pour le prénom, la première lettre. Et pour finir, on remplace tout ce qui ne serait pas des lettres par un "_".

/** le login au Cnam :
* 6 premières lettres du nom suivies de la première lettre du prénom séparées de '_' .
* le login retourné est en minuscules,
* le trait d'union, ou spéciaux
(pour unix)sont remplacés par des '_'
* pas de caractères accentués pour le login
* voir les classes prédéfines,
* java.lang.String : les méthodes replaceAll, toLowerCase et substring
* java.lang.Math   : la méthode min

* BlueJ : Menu Aide
*
@return le login du Cnam simplifié, sans les adaptations dues aux homonymes...
*/
public String login(){
   
String nomL;
    String prenomL;
    nomL=
this.nom();
    nomL=nomL.replaceAll
("[0-9]","");
    nomL=sansAccents
(nomL).toLowerCase().substring(0, Math.min(nomL.length(),6)).replaceAll("[^a-z]","_");
    prenomL=
this.prenom();
    prenomL=prenomL.replaceAll
("[0-9]","");
    prenomL=sansAccents
(prenomL).toLowerCase().substring(0,1).replaceAll("[^a-z]","_");   

   
return nomL+"_"+prenomL;
}

>3.5 et 6

Les tests décrits dans la classe AuditeurCNAMTest ont fini par être couronnés de succès et ont été très utiles pour progresser dans le codage de la méthode login().

Pour les compléter, j'ai écrit deux petits tests supplémentaires, afin de me familiariser avec l'usage des tests unitaires dans BlueJ.

Le premier teste si un prénom dont la première lettre est accentuée renvoie bien une lettre non accentuée dans le login.

/** Teste si la première lettre d'un prénom, qui est accentuée, devient non accentuée.
*
*/
public void test_prenom_avec_accent(){
   
question3.AuditeurCNAM auditeur1 = new question3.AuditeurCNAM("Dupont","Élodie","12345");
    assertEquals
("Mme Dupont Élodie", "Dupont", auditeur1.nom());
    assertEquals
("Mme Dupont Élodie", "Élodie", auditeur1.prenom());
    assertEquals
("prénom avec accent sur la première lettre ? ", "dupont_e", auditeur1.login());     
}

Le second teste si des chiffres insérés dans le nom ou le prénom sont bien supprimés lors de la fabrication du login.

/** Teste si des chiffres insérés dans le nom ou le prénom sont bien supprimés
* lors de la fabrication du login.
*/
public void test_nom_prenom_avec_chiffres () {
   
question3.AuditeurCNAM auditeur1 = new question3.AuditeurCNAM("54Du79pont","29Sa487bine","12345");
    assertEquals
("login avec des chiffres dans le nom/prénom ? ", "dupont_s", auditeur1.login());
}

Code-source et documentation

Difficultés rencontrées :


Dans la question 2.3 (coucher du soleil), je n'ai pas trouvé dans les classes respectives, y compris Canvas, ce qu'il faudrait pour faire en sorte que le soleil bleu se couche directement derrière l'objet ground (c'est à dire que celui-ci reste toujours au premier plan). Je m'en suis sortie de manière peu élégante en choisissant une couleur pour le sol identique au soleil (bleu) de façon à fondre l'un dans l'autre visuellement. Afin de respecter la sémantique du coucher du soleil, l'objet sun est rendu invisible une fois qu'il est passé entièrement sous le niveau du sol.

Dans la question 3.3, la rédaction de la méthode login() a été assez laborieuse, notamment pour enlever les accents des chaînes de caractères. Je n'ai pas trouvé de solution simple ou de méthode pré-existante pour faire cela. Il y avait plusieurs façons de procéder pour chercher les caractères accentués et les remplacer, mais dans tous les cas, cela restait assez coûteux en terme d'itérations. Et encore, je n'ai pas cherché tous les caractères accentués qui existent. Or, cela aurait pu être nécessaire sur des noms ou prénoms qui peuvent avoir des accents autres que les accents de la langue française.

Afin de valider également les tests sur la Javadoc, j'ai complété et corrigé toutes les classes qui posaient problème (erreurs données par le submitter), notamment celles de la question 1. La difficulté venait du fait que je ne suis pas certaine d'avoir compris certaines méthodes de la classe Canvas et qu'il est donc difficile dans ce cas de documenter utilement ces méthodes.

Conclusion et bibliographie :


Conclusion

La réalisation de ce tp et la lecture des documentations associées m'ont permis de découvrir de façon très concrète le fonctionnement et l'intérêt de BlueJ. Je ne connaissais que l'environnement Eclipse pour développer en Java, et je le sous-utilisais très largement. A mon niveau, BlueJ est amplement suffisant.
L'interface de BlueJ est très intuitive, le schéma des relations des classes aide grandement à la conception d'un projet. Je redoutais un peu les capacités de l'éditeur de code, comparé à Eclipse ou même Notepad++. Et finalement, tout cela est convenable, avec quelques bonnes surprises, comme l'aperçu latéral droit pour se situer dans son code.
Mais le véritable point positif de BlueJ réside dans son orientation pédagogique avec de nombreux messages d'aide lorsque la compilation ne fonctionne pas.

Bibliographie