CSC 4102 – Introduction au génie logiciel pour applications orientées objet

Portail informatique

Séance 5 — TP : Programmation outillée

Pour réaliser le projet, vous avez besoin de connaître la méthodologie présentée en cours. En outre, vous pouvez vous inspirer des exemples du cours ainsi que des deux études de cas complètes fournies dans le projet GitLab csc4102-exemples. Si ce n'est pas déjà fait, clonez le projet GitLab (cd ~/CSC4102/; git clone git@gitlabens.imtbs-tsp.eu:enseignants.csc4102/csc4102-exemples.git; cd csc4102-exemples) et prenez connaissance du fichier readme.md. Ou, mettez à jour le dépôt que vous avez cloné (les exemples évoluent [même si c'est peu]) : cd ~/CSC4102/csc4102-exemples; git fetch; git pull origin main.

quelques retours en arrière sur les activités précédentes sont possibles à cause d'oublis ou de mauvaises compréhensions du système. Nous vous conseillons de noter les modifications/adaptations à faire pendant le TP, mais si possible d'attendre le hors présentiel pour les faire.

(Re-)Positionnement dans le dépôt Git de GitLab

Voici la procédure que nous proposons (dans tous les cas « par défaut »). « En cas de panique », veuillez vous reporter à celle qui suit celle-ci.

  • Procédure « repositionnement »
    • on repart d'un dépôt mis à jour et on continue dans la branche develop
      • cd ~/CSC4102
        cd csc4102-projet
        git fetch # prendre connaissance des nouveautés
        git branch # quelle est la branche courante ?
        si pas déjà dans la branche develop alors « git checkout develop » # se positionner dans la branche
        git pull origin develop # accepter les modifications de la branche
        si conflit et besoin d'une fusion, « git mergetool --tool=meld » puis « git commit »

« En cas de panique », veuillez suivre la procédure qui suit :

  • Procédure « nouveau clonage »
    • on clone à nouveau le dépôt et on continue dans la branche develop :
      • cd ~/CSC4102
        mv csc4102-projet csc4102-projet_old # garder une copie au cas où du contenu n'ait pas été poussé
        git clone URL_DE_VOTRE_PROJET
        cd csc4102-projet
        git checkout develop # positionnement dans la branche develop
En fin d'énoncé de ce TP, nous proposons une procédure pour la tâche duale consistant à clore une phase de travail en validant et poussant les modifications sur le dépôt Git de GitLab.

Prise en main du module Maven du projet

  • prendre connaissance du module Maven : configuration, compilation, exécution des tests, etc. ;
  • prendre en main le code dans l'environnement de développement intégré (Eclipse) ;
  • prendre en main l'intégration continue mise en place dans le projet.

Configuration du module Maven


Ouvrez le fichier pom.xml avec emacs (avant de démarrer votre IDE Eclipse) et adaptez les informations à votre binôme-projet : adaptez <artifactId>csc4102-Prenom1Nom1_Prenom2Nom2</artifactId> en y mettant vos prénoms et noms.

Cette configuration est primordiale pour la suite du module.

Module Maven


Des éléments de modélisation et aussi des éléments de programmation sont fournis depuis le début du projet. Les éléments de programmation sont déjà disponibles dans le projet Maven du répertoire src. Commençons par compiler le code avec la commande « mvn clean install ». En plus de l'affichage ci-dessous, vous remarquerez les téléchargements d'archives (fichiers jar) entre autres à partir du dépôt csc4102-util-snapshot.

Observons ce qui s'est passé :

  • le module dépend d'un module mis à disposition dans le dépôt Maven du module CSC4102 : csc4102-util-snapshot. Nous pouvons vérifier que cette dépendance est maintenant disponible dans notre dépôt Maven local avec la commande
    « ls -R ~/.m2/repository/eu/telecomsudparis/csc4102/csc4102-util/ » ;
  • puis, nous voyons l'appel d'une séquence de greffons (en anglais, plug-ins) :
    • maven-clean-plugin : suppression du répertoire target (tout ce qui a été généré lors du processus de construction de l'exécution précédente) ;
    • maven-resources-plugin : traitement des ressources autres que des classes JAVA. Nous n'en avons pas ; ce pourrait être des fichiers de données, des fichiers de configuration, etc. ;
    • maven-compiler-plugin : compilation des classes JAVA ;
    • maven-resources-plugin : traitement des ressources des tests. Nous n'en avons pas non plus ;
    • maven-compiler-plugin : compilation des classes de test JAVA ;
    • maven-surefire-plugin : exécution des tests ;
  • ensuite, l'archive résultat est créée avec le greffon maven-jar-plugin. Cette archive contient les classes compilées de l'application. Nous aurions aussi pu générer l'archive des classes compilées des tests ainsi que les archives des codes source de l'application et des tests ;
  • et enfin, nous atteignons la fin de la construction du logiciel avec l'installation des archives dans le dépôt local (répertoire ~/.m2/repository/). La fin est notifiée avec le message « BUILD SUCCESS ». Nous pouvons vérifier l'installation avec la commande
    « ls -R ~/.m2/repository/eu/telecomsudparis/csc4102/*/1.0-SNAPSHOT/ ».

nous vous conseillons de construire avec la commande « mvn clean install » le code des exemples dans le répertoire ~/CSC4102/csc4102-exemples/src.

Création du projet dans l'IDE (Eclipse ou autre)


Pour créer le projet, Eclipse demande deux fichiers de configuration : .project et .classpath. Voici la manière de procéder :

  • il s'agit d'utiliser le greffon m2e (Maven to Eclipse) de Eclipse : au lieu de créer le projet dans Eclipse comme un projet Java, importez-le comme un projet Maven  (menu File > Import > Maven > Existing Maven Projects > Next puis Browse > ~/CSC4102/csc4102-projet/ et enfin Finish). Dans ce cas, c'est Eclipse qui crée les fichiers de configuration .project et .classpath. Dans la vue « package explorer » de Eclipse, un « M » est ajouté à côté du « J » sur l'icone du projet et les cibles Maven sont disponibles dans le menu contextuel : click droit > Run As.
Il existe une autre procédure, que nous n'utiliserons pas. Il s'agit d'utiliser le greffon eclipse de Maven : (1) exécutez la commande « mvn eclipse:clean eclipse:eclipse » et (2) créez le projet Eclipse (menu File > Java Project, décochez la case Use default location puis Browse > ~/CSC4102/csc4102-projet/ et enfin Finish). Avec cette approche, les tâches de compilation, etc. sont effectuées en mode commande dans la console.

nous vous conseillons de créer aussi un projet Eclipse pour lire et étudier le code des exemples dans le répertoire ~/CSC4102/csc4102-exemples/.

Utilisation du projet Eclipse


Vous mettrez des assertions JAVA dans votre code, par exemple avec l'instruction « assert invariant(); » déjà utilisée dans les classes du squelette fourni. Nous proposons d'activer l'utilisation des assertions dans les tests JUnit : menu Window > Preferences > Java > JUnit puis cochez la case « Add '-ea' to VM arguments when creating a new JUnit launch configuration » (l'option « ea » de la machine virtuelle Java signifie « enable assertions »).

Pour exécuter les tests JUnit, sélectionnez tous les tests du module Maven (src/test/java) ou un paquetage (p.ex. .../validation) ou encore une classe de test (p.ex. .../validation/TestXxxx.java) puis le menu contextuel (click droit) Run as > JUnit Test.

L'option n'est active que pour les nouvelles configurations JUnit à venir. Donc, supprimez les anciennes configurations correspondant à vos anciennes exécutions des tests dans Eclipse : dans le menu contextuel d'une classe de tests déjà exécutée Test*, Run As > Run Configurations et supprimez les configurations existantes.

Pour vérifier l'activation de l'option, ajoutez l'instruction « assert false; » comme première ligne dans un des tests (dans une classe Test*, dans une méthode annotée @Test) et ré-exécutez les tests de la classe de tests. Votre test modifié est en erreur avec un message du type « java.lang.Exception: [...] java.lang.AssertionError ». Avant de continuer, retirez bien sûr l'instruction « assert false; ».

Intégration continue mise en place avec GitLab CI


Lorsque vous poussez de nouveaux instantanés sur le dépôt Git de votre projet GitLab, la commande Maven indiquée dans le fichier .gitlab-ci.yml est exécutée par le service d'intégration continue GitLab CI. Cette commande compile les classes JAVA de votre projet Maven. Au fur et à mesure que nous avançons dans le projet, nous retirons les options de la commande mvn pour compiler les tests, etc.

À partir de cette séance, si vous poussez du code qui ne compile pas, vous recevrez un courriel avec un sujet de la forme « csc4102-projet | Pipeline ... has failed for branche[...] | beginning of SHA1 ».

Nous attendons que vous poussiez du code qui « passe » les vérifications de l'intégration continue, c'est-à-dire qui compile, etc., et donc que nous ne recevions pas de courriel d'alerte « Pipeline ... has failed ».

Découverte de la bibliothèque csc4102-util du module

  • manipuler des dates,
  • saisir des données à la console (si vous décidez de faire une interface textuelle, ce qui n'est pas nécessaire),
  • exception OperationImpossible.
La documentation Javadoc de la bibliothèque est disponible ici : http://www-inf.telecom-sudparis.eu/COURS/CSC4102/maven-repository/site/fr/apidocs/index.html. Ajoutez cet URL dans vos favoris (p.ex. avec la documentation des classes de JAVA 17).

Manipulation des dates


Afin de faciliter la programmation, la bibliothèque csc4102-util propose des méthodes pour manipuler des dates (jours), des instants (date avec heure, minute, etc.), des intervalles de dates. Dans le code du dépôt csc4102-exemples, parcourez les classes exemples ExempleManipulationsDatesInstants et ExempleManipulationsIntervalleDates dans le paquetage utilisationdelabibliothequeutil.

Saisies de texte à la console pour une interface textuelle


Si vous pensez que cela peut vous aider ou pour votre plaisir, vous pouvez programmer une interface textuelle, qui ne sera pas évaluée. Afin de faciliter la programmation d'une interface textuelle, la bibliothèque csc4102-util propose des méthodes pour afficher une invite et lire une valeur à la console (ligne, entier, double, et date). La classe ExempleManipulationsConsole dans le paquetage ...csc4102/utilisationdelabibliothequeutil fournit des exemples.

la construction des diagrammes de séquence des cas d'utilisation ainsi que des tables de décision des tests de validation a dû vous convaincre qu'il n'y a pas de lecture à la console dans la façade et qu'une interface textuelle n'est pas utile pour « valider » la correction de votre solution. Si vous n'êtes pas convaincus, discutez-en avec vos responsables de groupe.

Début de la programmation

  • programmer les premiers éléments des classes : les attributs et les constructeurs,
  • programmer les premiers cas d'utilisation.
  • dans cette séance, selon votre dextérité, peut-être est-il raisonnable de commencer par ne considérer que les situations normales. Nous présentons le traitement des situations avec erreurs dans la prochaine séance avec la gestion des exceptions ;
  • cette séance est le début de la programmation ; l'objectif n'est pas de tout programmer avant la prochaine séance.
les étapes qui suivent proposent la programmation des classes de l'application de l'étude de cas dans un certain ordre. Il s'agit de la programmation de la solution que vous avez spécifiée et conçue. Par conséquent :
  1. quelques alignements entre la modélisation et la programmation sont possibles et presqu'inévitables ;
  2. les instructions dans les énoncés de TP ne sont pas et ne peuvent pas être complètes ;
  3. le début de la programmation proposé dans le module Maven en début de projet est modifiable et à modifier selon votre solution.

Classes avec leurs attributs et leurs constructeurs


Pour les classes impliquées dans les premiers cas d'utilisation, programmez une première « version » de la classe avec les premiers attributs que vous avez identifiés et un construteur. Nous proposons que vous étudiiez les autres méthodes de ces classes relativement à la programmation des cas d'utilisation («  »), («  ») et («  »). C'est un conseil donné pour éviter de programmer des choses inutiles : par exemple, c'est une mauvaise idée de programmer sans nécessité des getters et des setters. Si vous n'êtes pas convaincus, discutez-en avec vos responsables de groupe.

Parmi les classes fournies au début du projet, certaines ont des instances dont les références sont mises dans des collections (listes ou dictionnaires) avec les associations ou compositions ayant des multiplicités « * » dans le diagramme de classes. Ces classes doivent redéfinir les méthodes equals et hashCode. Dans le code existant, vous avez un exemple de programmation d'une composition (avec la multiplicité « * ») de la façade du système vers une classe qui redéfinit les méthodes equals et hashCode.

Premiers cas d'utilisation


Programmez les premiers cas d'utilisation («  »), («  »), et («  »). Pour ce faire, peut-être devez-vous programmer quelques autres cas d'utilisation, dont les diagrammes de séquence ne sont pas construits. Si un diagramme de séquence n'est pas construit pour un cas d'utilisation, c'est une occasion de faire la différence entre la programmation à partir du diagramme de classes avec un diagramme de séquence, et la programmation à partir du diagramme de classes sans le diagramme de séquence.

en attendant l'écriture de tests de validation avec le canevas logiciel JUnit à la prochaine séance, vous pouvez « tester » vos cas d'utilisation en écrivant un scénario dans une méthode main en l'exécutant dans Eclipse (menu contextuelle Run as > Java Application).

Mise à disposition du travail effectué dans le dépôt Git de GitLab

Systématiquement, avant de terminer une séance de travail, que ce soit en salle TP ou chez vous, mettez à jour votre dépôt local (au cas où vous ayez travaillé en parallèle), validez et poussez votre travail :

  • git fetch # charger les modifications non encore connues localement
    git pull origin develop # mettre à jour votre branche develop
    et si conflit et besoin d'une fusion, git mergetool --tool=meld
  • git status # connaître l'état de votre arborescence
    selon les besoins, pour préparer la zone de transit pour la validation du prochain instantané, git add, git mv, git checkout --, etc.
    git commit -m "je dis ce que contient le nouvel instantané" # valider les modifications de la zone de transit
    git push origin develop# pousser pour mettre à disposition
  • connectez-vous à GitLab et vérifiez que votre travail a été poussé.

À LA FIN DU TP DE LA SÉANCE

Avant de quitter le TP, veuillez s'il vous plaît remplir dans la page Partage de votre groupe le tableau d'avancement de votre binôme-projet :

C'est aussi le moment de parcourir la grille d'auto-évaluation de la séance.