====== TD1 : De la conception au développement, échauffement ====== **Objectifs :** Par le développement d'un mini-Forum tels que Twitter ou Slack ou Discorde, nous rappelons les notions de base de la COO. Commencer par lancer Eclipse et Modelio qui sont longs à charger !! POUR LES ETUDIANTS QUI ONT DES SOUCIS SUR LEUR MACHINE PERSONNELLE AVEC MODELIO (en particulier les MACS), basculer sur Visual Paradigm. Le sujet est dans cette version initiale très facile. Il doit être traité dans les 2 heures maximum ! Les temps donnés expriment le temps maximum estimé pour faire la tâche. A vous de voir si vous parvenez à les respecter. ===== Présentation de l'application ===== Un **Forum ** (//e.g.// Slack, Discorde) permet à un "producteur" (e.g. membre autorisé à écrire) de poster des "messages" (texte, contenu multimedia, ...). Les "consommateurs" (e.g. membre) peuvent lire les messages quand ils le veulent. Il s'agit de construire les **bases "rudimentaires" d'un "Forum"** (on fera mieux la semaine prochaine). ==== ENONCE ==== * Un administrateur peut créer un Forum. * Des producteurs postent des messages sur un Forum. * Des consommateurs lisent des messages sur le Forum. * Un producteur peut effacer des messages sur le Forum. * Un consommateur peut demander à lire des messages et qu'il n'y en ait aucun. {{ :2016_2017:s3:concprogobjet:td:value_of_mb_on_zos_esb.jpg?nolink&300 |((extraite de http://www.ibm.com/developerworks/websphere/library/techarticles/0604_odowd/0604_odowd.html))}} Il existe beaucoup de modèles de "bus" (ici utilisé pour réaliser un forum) : choix des consommateurs par filtrage sur le message, abonnement des consommateurs à des boîtes spécialisées, envoi des messages à la demande des consommateurs, dés qu'un message est lu, il n'est plus accessible aux autres consommateurs, ... Ces modèles d'architectures sont très utilisés pour faciliter des communications asynchrones et l'envoi d'informations à un groupe de destinataires (pensez au principe des tags sous Twitter par exemple). [[http://docs.oracle.com/cd/E19798-01/821-1841/bnced/index.html| en savoir plus]] ==== Un exemple de scénario ==== Attention, il s'agit d'un exemple concret mais c'est bien la notion de Forum que l'on vous demande dans un premier temps de mettre en oeuvre. L'agence "oogle-stade" (//Administrateur//) crée un forum "OGCN".\\ Mario (//Producteur//) poste un message //WaitAndSee: "a quoi cela sert de courir?"// sur le forum "OGCN". \\ Walter (//Consommateur//) demande s'il y a de l'information sur le forum et obtient le message //WaitAndSee//. \\ Walter(//Consommateur//) pose la même question et obtient le même message. \\ Alban(//Consommateur//) pose la même question et obtient le même message. \\ Walter (//Producteur//) poste un message //Yes : "Tout à fait d'accord!"//. \\ Youcef (//Producteur//) poste un message //PFFF : "Vous rigolez?"//. \\ Les messages postés il y a plus de 30s sont détruits par "oogle-stade". ===== Comprendre le contexte de l'application : 5mn ===== - {{fa>arrow-circle-right?24}} Quels sont les grands cas d'utilisation? Vous pouvez les faire simplement sur Papier. ===== De l'analyse à la conception du forum (simplifié) ===== ==== Analyse : 15mn ==== - {{fa>arrow-circle-right?24}} Commencez par créer un projet (Attention à bien sélectionner **Java Project**) sous [[:modelio|MODELIO]] - {{fa>arrow-circle-right?24}} Définissez un diagramme de classes de niveau Analyse. - {{fa>arrow-circle-right?24}} Définissez, par cas d'utilisation, un diagramme de séquence élémentaire mettant en jeu les objets de votre système **et compléter** votre diagramme de classes au fur et à mesure. Pour cela utilisez, évidemment des lignes de vie qui font référence à des classes et les messages qui vous permettent d'identifier les méthodes et mettre à jour vos diagrammes de classes. * Avez-vous vérifié que le scénario initial est bien couvert par votre modélisation? Même pour la destruction des messages postés il y a "longtemps"? * Un forum délivre un ou plusieurs messages? Quel est le problème avec l'unique scénario qui est donné? * Votre modélisation tient-elle compte de l'absence de messages en attente? ==== Conception : 15mn ==== - {{fa>arrow-circle-right?24}} Compléter votre modèle à classes pour préparer l'implémentation : * Réfléchir au sens des relations * Vérifier les "couplages" * Cet exemple est très petit, en conséquence, il est possible qu'il n'y ait quasi rien à faire à cette étape. Attention, ce tout petit exemple sera très largement étendu par la suite. Prenez-donc un soin particulier pour bien construire un modèle qui respecte les propriétés DRY((don’t repeat yourself)) et de faibles couplages... ===== Mise en oeuvre ===== ==== Un projet java (3mn) ==== * {{fa>arrow-circle-right?24}} [[2018_2019:s3:concprogobjet:td:s3atd1:creationProjet|Créez un projet java]] comme nous l'avons vu en méthodo sans oublier le tests folder. ==== Génération des codes (10 mn) ==== Nous allons à présent travailler sur les codes. Pour cela nous allons les générer à partir des modèles. Pour cette tâche, vous retournez sous Modelio. Aujourd'hui nous faisons le choix de générer les codes puis de travailler ces derniers sans chercher, au moins pour l'instant, à maintenir les modèles en cohérence. - {{fa>arrow-circle-right?24}} Génération des codes (voir [[https://mbf-iut.i3s.unice.fr/doku.php?id=modelio#generer_les_codes|ici]] ) - Choisissez votre répertoire de génération des codes sous src - Préciser si vous voulez travailler avec des vecteurs ou autres (Réfléchissez!!) {{ :2014_2015:s3:concprogobjet:td:generationcodejava.png?direct&200 |}} - {{fa>arrow-circle-right?24}} Vérifier que vous avez bien toutes les classes prévues qui ont été générées; - {{fa>arrow-circle-right?24}} Retourner sous votre IDE. Si votre répertoire est mal organisé (nouveau package par exemple, déplacer simplement les codes comme vous le voulez, par glisser/coller.) - {{fa>arrow-circle-right?24}} Corriger vos codes pour qu'ils soient "compilables" : - ou en éliminant les annotations (@...) - ou en faisant en sorte que les annotations de Modelio soient comprises, ajouter {{:javadesigner.jar|}} comme une library du projet * sous [[https://mbf-iut.i3s.unice.fr/doku.php?id=eclipse#ajouter_un_jar_externe|Eclipse]] ==== Un projet sous "tests" (15mn) ==== Notre objectif est à présent de préparer les tests qui accompagneront notre développement. Pour cela, nous utiliserons l'environnement JUNIT. La structuration du projet en une partie principale et une partie test est, elle, exigée pour toute la suite de ce module. Vous avez déjà utilisé JUnit l'an dernier, il devrait s'agir uniquement de rappels. **Sous ECLIPSE** - {{fa>arrow-circle-right?24}} Dans le menu contextuel de, par exemple la classe //Message//, cliquez sur //New – Others - Java - JUnit Test Case//((Cette partie du TD reprend en partie le tutoriel JUNIT : http://www.junit.fr/2011/11/20/tutoriel-eclipse-junit-mon-premier-test-automatique/)). {{ :2014_2015:s3:concprogobjet:td:junittestcase.png?direct&200 |}} Dans le panneau qui s'affiche {{ :2014_2015:s3:concprogobjet:td:messagetest.png?direct&200 |}} * Sélectionnez le bouton radio //New JUnit 4 test//. * Changez le dossier Source folder pour celui de tests * Nommez la classe ''MessageTest''. * Cochez les cases ''setUp()'' et ''tearDown()''. * Enfin cliquez sur //Finish//. * Eclipse va remarquer que la bibliothèque de //JUnit// est absente du projet et vous propose d’ajouter automatiquement cette dernière au projet. * Dans le panneau qui apparaît, cliquez sur OK. - {{fa>arrow-circle-right?24}} Eclipse a maintenant créé automatiquement le squelette de la classe de test. Il ne reste plus alors qu’à remplir cette dernière. **Voir un exemple de code ci-dessous.** - {{fa>arrow-circle-right?24}} Dans le menu contextuel, cliquez sur //Run As – JUnit test//. Enfin, le premier rapport de tests s’affiche ! {{ :2014_2015:s3:concprogobjet:td:testok.png?direct&200 |}} - {{fa>arrow-circle-right?24}} Visualiser la couverture de tests {{ :2018_2019:s3:methodo:td:coverage.png?direct&300 |}} Voici un exemple de code de test pour Junit 4 (@BeforeEach and @BeforeAll are the JUnit 5 equivalents of @Before and @BeforeClass. These annotations were renamed with clearer names to avoid confusion.) protected Message mToTest; protected String contents; @Before public void setUp() throws Exception { contents = "mon message"; mToTest = new Message(contents); } @Test public void setContents() throws Exception { String nv = "newValue"; mToTest.setContenu("newValue"); assertEquals(" message contents is as expected",nv,mToTest.getContents()); assertFalse(" message contents has been modified", mToTest.getContents().equals(content)); } ==== Mise en place d'un programme principal préliminaire (10mn) ==== {{fa>arrow-circle-right?24}} Voici ce que devra faire a minima votre programme principal, pour cela retourner soit dans le folder de tests créez un fichier "testMonScenario.java" qui contient un //main//, soit ajoutez des tests pour vérifier le scénario suivant: - créer un forum de nom "Nice-Circulation", - créer un message annonçant "une attente de 5mn" - créer un message annonçant "un accident" - récupérer les messages sur le forum de nom "Nice-Circulation", - afficher le contenu des messages. Vous pouvez compléter cet exemple par l'exemple donné plus haut. Ce programme ne peut pas tourner puisque quasi rien n'est implémenté, par contre vous pouvez vous aider de votre IDE pour qu'au moins il soit "syntaxiquement" juste et créer les bonnes méthodes si elles n'existent pas déjà, ou les appeler! A la fin de ce TD, évidemment, il fonctionnera. ==== Développement (20mn) ==== {{fa>arrow-circle-right?24}} Terminez la mise en oeuvre du forum en complétant les tests au fur et à mesure. {{fa>arrow-circle-right?24}} Pensez à tester : * Retrouver un forum de nom donné ===== Je sais ===== * Créer un projet sous un IDE avancé, et le structurer correctement. * (Rappel) Faire correspondre le code java et un modèle de classes en UML. * Mettre en place des tests unitaires. * Utiliser un IDE pour améliorer mon développement en utilisant les outils d'aide au développement. ===== Pour les avancés ===== [[https://github.com/iluwatar/java-design-patterns/tree/master/producer-consumer/src/main/java/com/iluwatar/producer/consumer|Des exemples de code Producteur/Consommateur]]