====== TD1 : Prise en main de l'environnement de développement ======
Commencer par lancer IntelliJ et Modelio qui sont long à charger !!
Ce module exige que vous utilisiez un environnement de développement pas un éditeur de texte !
JCreator, Notexxx ne sont pas de tels environnements de développement.
Vous devez utiliser **IntelliJ**.
Le téléchargement de ces outils peut être long, il doit avoir été fait avant le TD.
* [[https://www.jetbrains.com/idea/|IntelliJ]]
Et pour GIT, vous devez déjà l'avoir sur vos ordinateurs.
Vous pouvez aussi installer un client GIT pour vous faciliter son utilisation (en principe..)
* [[https://www.sourcetreeapp.com/|SourceTree]]
Mais vos environnements intègrent également une connexion à GIT...
**Objectifs :** Par le développement d'un mini-bus à messages (Twitter par exemple) nous mettons en place notre environnement de travail et rappelons les notions de base de la COO.
Le sujet est dans cette version initiale très facile. Il doit être traité dans les 2 heures ! 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 **bus à messages** permet à un "producteur" d'envoyer un "message"(texte, contenu multimedia, ...) vers des consommateurs. Les consommateurs peuvent lire les messages quand ils le veulent. Selon les modèles de bus, les consommateurs sont notifiés immédiatement du message (//twitter par exemple//), ou bien doivent aller eux-même chercher leurs messages (//email par exemple//).
Il s'agit de construire les **bases "rudimentaires" d'un "bus à messages"**, //pensez flux d'informations par exemple (flux RSS).//
* Un agent peut créer un bus.
* Des producteurs émettent des messages vers un bus.
* Des consommateurs demandent à lire des messages sur le bus.
* Un agent peut effacer des messages sur le bus.
* 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))}}
**Pour en savoir plus** -- Il existe beaucoup de modèles de "bus" : 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 bus que l'on vous demande dans un premier temps de mettre en oeuvre.
L'agence "oogle-Agency" (//Agent//) crée un bus logiciel "Nice-circulation".\\
La voiture A (//Producteur//) émet un message //mAttente : "Attente de 5mn"// sur le bus logiciel "Nice-circulation". \\
La voiture B (//Consommateur//) demande s'il y a de l'information sur le bus logiciel et obtient le message //mAttente//. \\
La voiture B (//Consommateur//) pose la même question et obtient le même message. \\
La voiture B (//Producteur//) émet un message //mAccident : "Accident sortie Saint-Augustin"//. \\
Les messages postés il y a plus de 30s sont détruits par "oogle-Agency".
===== Comprendre le contexte de l'application : 5mn =====
- Quels sont les grands cas d'utilisation? Vous pouvez les faire simplement sur Papier.
===== De l'analyse à la conception du bus logiciel =====
==== Analyse : 15mn ====
- Sous [[:modelio|MODELIO]], commencer par créer un projet (Attention à bien sélectionner **Java Project**)
- Définissez un diagramme de classes de niveau Analyse.
- 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 bus 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 ====
- 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 et de faibles couplages...
===== Mise en oeuvre =====
==== Un projet java (5mn) ====
- Créer un projet **MAVEN**
- Nom du projet : busV1
- GroupID = fr.unice.iut.info.coo
- ArtefactID = bus
- ( **voir comment faire ici [[https://mbf-iut.i3s.unice.fr/doku.php?id=intellij#creer_un_projet_maven|ici]]** )
- La structure contient
- src -> main -> Java ...
- test -> java -> ...
- Exécutez le main sous gid et les tests...
- Ok maintenant vous êtes prêts.
==== 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.
- Générez les codes (voir [[https://mbf-iut.i3s.unice.fr/doku.php?id=modelio#generer_les_codes|ici]] et choisissez comme répertoire de génération celui sous src/main/java/fr/unice/iut/info/coo
- - Sélectionner votre diagramme de classe en conception;
- Vérifier que vous avez bien toutes les classes prévues;
- Préciser si vous voulez travailler avec des vecteurs ou autres (Réfléchissez!!), **et** **préciser bien comme répertoire pour la génération votre répertoire** (si besoin, spécifiez le nom du package fr.unice.iut.info.coo directement dans le code généré) {{ :2014_2015:s3:concprogobjet:td:generationcodejava.png?direct&200 |}}
- Retourner sous IntelliJ. Si votre répertoire est mal organisé (nouveau package par exemple, déplacer simplement les codes comme vous le voulez, par glisser/coller.)
- Corriger vos codes pour qu'ils soient "compilables" :
- Afin que les annotations de Modelio soient comprises, ajouter {{:javadesigner.jar|}} comme une library du projet
- déposer sous idea/libraries... puis sélectionner le .jar et l'enregistrer comme une librairie utilisée par le projet
- **ou bien** placez vous sur le projet puis avec le menu contextuel (clique droit) > Open module Setting > Librairies et ajouter le .jar
==== Mise en place du programme principal préliminaire (10mn) ====
Voici ce que doit faire a minima votre programme principal, pour cela retourner sur "MonScenario.java" et modifier le //main// pour :
- créer un bus de nom "Nice-Circulation",
- créer un message annonçant "une attente de 5mn"
- créer un message annonçant "un accident"
- lire les messages,
- afficher le contenu des message.
Ce programme ne peut pas tourner puisque quasi rien n'est implémenté, par contre vous pouvez vous aider d'IntelliJ 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.
http://pierre-gerard.github.io/coo/uml-td03-annexe.html
==== 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.
/*
- Ajoutez un nouveau dossier de sources nommé //tests// au même niveau d’arborescence que src
* sur le projet, faire un //new source-folder//, et l'appeler //tests// {{ :2014_2015:s3:concprogobjet:td:newsourcefolder.png?direct&200 |}}
*/
- Pour créer des tests sur votre classe //Message//, suivez les instructions sous https://www.jetbrains.com/help/idea/2016.2/creating-tests.html. La classe de test créée se trouve sous test/java/...
* Cochez les cases ''setUp()'' ((est exécutée avant tout test)) et ''tearDown()'' ((est exécutée après tout test)).
- IntelliJ a maintenant créé automatiquement le squelette de la classe de test. Il ne reste plus alors qu’à remplir cette dernière.
- Par exemple
protected Message mToTest;
protected String content;
@Before
public void setUp() throws Exception {
content = "mon message";
mToTest = new Message(content,b);
}
@Test
public void setContenu() throws Exception {
String nv = "newValue";
mToTest.setContenu("newValue");
assertEquals(" message contents is as expected",nv,mToTest.getContenu());
assertFalse(" message contents has been modified", mToTest.getContenu().equals(content));
}
- Dans le menu contextuel, cliquez sur //Run As – JUnit test//.
Enfin, le premier rapport de tests s’affiche !
==== Développement (20mn) ====
- Terminez la mise en oeuvre du bus en complétant les tests au fur et à mesure.
==== Pour aller plus loin ====
Un "bus à messages" s'appuie sur plusieurs design patterns 'Observeur/Observable" et plus précisément "Publish/Subscribe". Il existe aujourd'hui de nombreuses implémentations de ces systèmes permettant des communications asynchrones, où les consommateurs sont automatiquement notifiés de l'arrivée de message, où les consommateurs peuvent faire des demandes spécifiques, avec des systèmes de filtres complexes, etc.
===== EVALUATION de CE TD =====
- Le programme est fonctionnel et le scénario de base est bien réalisé.
- Les modèles sont cohérents avec le code.
[[http://jalon.unice.fr/cours/blay/Cours-blay-20160929210709/BoiteDepot-blay-20160929210839376812?mode_etudiant=false|Jalon de dépôt pour Mme Fornarino : donner comme nom du dépot : Gr]]
===== 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.