Table of Contents

TD2 : qui est Responsable?

Objectifs : Travailler sur de petits exemples différents points d'un développement pragmatique.

Responsabilités : Analyse et développement de la partie "Métier"

Le forum logiciel est maintenant composé de canaux.

Pour vous aider vous pouvez, dans un premier temps, ne pas tenir compte du canal par défaut et n'en tenir compte qu'à la fin du TD en identifiant bien les impacts sur le modèle et sur le code, en particulier avec les responsabilités qui en résultent.
  1. Quels modèles utilisez-vous pour analyser le problème ?
  2. Dans vos diagrammes de séquences, faîtes bien apparaître les interfaces graphiques et les contrôleurs mais dans les diagrammes de classe concentrez vous uniquement sur la partie métier dans un premier temps.
  3. Qui est responsable de retrouver à partir de son nom un forum? un canal de messages? (Pattern expert)
  4. Qui est responsable de créer un forum? un canal de message? pourquoi? (Pattern créateur)
  5. Qui est responsable de créer un message ? pourquoi? (Pattern créateur)
  6. Avez-vous des relations bi-directionnelles? Si oui, avez-vous décidé de qui est le “maître” et de qui est l'“esclave”?
  7. Avez-vous bien prévu les tests unitaires? Que se passe-t-il si vous demandez
    1. à lire les messages sur un canal qui n'existe pas?
    2. à créer un forum d'un nom déjà utilisé?
  8. A partir de maintenant, on s'intéresse au scénario suivant, sans tenir compte de l'interface graphique. Est-ce que vous pouvez l'implémenter, revenez sur votre code si besoin (Vous pouvez vous aider des tuyaux donnés plus bas si besoin):
    1. Je crée un forum “NiceInformation”
    2. Je crée une canal “Circulation” sur le forum “NiceInformation”
    3. Je crée un canal de Breves “@dept-info-iut-Nice” qui autorise uniquement des messages de 140 caractères.
    4. Je poste un message “Embouteillage” dans le canal “Circulation” du forum “NiceInformation”
    5. Je poste un message “Nouveau rond point” dans le canal “Circulation” du forum “NiceInformation” 3)
    6. Je lis les messages qui se trouvent dans le canal “Circulation”, i.e. je récupère les messages.
    7. Je demande à effacer les messages du canal “Circulation” du forum “NiceInformation” 4)
    8. Je poste un message “SoireeIUT” sur le forum “NiceInformation”
    9. Je poste un message “WEI … apres les cours de …” dans le canal “@dept-info-iut-Nice”
    10. Yoann plus bavard poste un message de plus de 140 caractères “ N'oubliez pas d'emmener …… et de choisir votre filleul …..” dans le canal “@dept-info-iut-Nice”… que se passe-t-il ?
    11. J'attends 2s (Thread.sleep(2000));
    12. Je poste un message “SoireeIntegrationIUT Choisissez vos parrain….” sur le forum “NiceInformation”
    13. J'attends 2s (Thread.sleep(2000));
    14. <Optionnel> Je demande à effacer tous les messages postés depuis plus de 4s sur le forum “NiceInformation”
  9. Regardez vos codes, et vérifiez que vous avez bien respecté la loi de Demeter5). Si ce n'est pas le cas, corrigez vos codes.
  10. Fixer MAX_MESSAGES à 1… comment se comporte votre programme?
  11. Complétez les tests pour prendre en compte les “brèves”.
  12. Comment avez-vous géré le canal par défaut? (Avez-vous pensé à définir des constantes?)
  13. Pouvez-vous décrire chacune de vos classes avec une seule phrase? Faîtes-le dans les commentaires de vos classes.
Aie aie votre propriétaire vient de réaliser que sur des forum de type “Community” il veut interdire d'avoir plus de 2 canaux, sur un forum “Premium” on ne peut pas en avoir plus de 5 et sur les forum “PRO” le nombre de canaux n'est pas limité.
Comment réagissez vous à ce changement? Modifiez vos codes et modèles pour tenir compte de cette nouvelle fonctionnalité.

Architecture : Interface graphique et contrôleur

L'objectif est ici de décomposer l'application pour que :

Pour se concentrer sur l'architecture, l'interface est une classe Java qui utilise Scanner pour lire au clavier et System.out.print… pour l'affichage. Vous pouvez vous inspirer du code ci-joint.

Le contrôleur n'a pas le droit de modifier la partie métier sans passer par des objets métiers. Il n'est pas autorisé à stocker la liste des forum etc. Pensez à utiliser le principe de délégation.

  1. Développez le code correspondant. Utilisez les informations et codes donnés ci-dessous.
  2. Quel type de contrôleur avez-vous défini en respectant les directives données? Est-il “bon”? Que feriez-vous sinon pour l'améliorer?
  3. Vous devez à présent pouvoir jouer le scénario précédent en utilisant votre interface graphique.
  4. Pouvez-vous décrire chacune de vos classes avec une seule phrase? Faîtes-le dans les commentaires de vos classes.

aide

Pour vous aider voici un exemple possible du programme principal dont vous pouvez vous inspirer :

    Controleur c = new Controleur();
    c.start();

Et pour le contrôleur :

public class Controleur {
    RegistreDeforum registre = new RegistreDeforum();
    UI ui = new UI();
 
    public void start() {
        String commande = ui.lireCommande();
        switch (commande.charAt(0)) {
        case 'c':
            creerforum();
            start();
            break;
        case 'b':
            creerBoite();
            start();
            break;
.....
 
private void creerforum() {
        String nomDuforum = ui.getNomDuforum(registre.getNomsforum());
        boolean reussi = registre.creerforum(nomDuforum);
        if (!reussi)
            ui.afficher("Erreur le forum existe déjà");
        else
            ui.afficher("forum " + nomDuforum + " créé");
    }

Architecture : Persistance simplifiée

1- On désire sauvegarder l'ensemble des forums à chaque fin d'exécution du programme principal et recharger l'état des forum à chaque lancement du programme principal.

Vous pouvez utiliser le code suivant. Pour l'utiliser il suffit que vos classes “implements Serializable'.

Exemple de sauvegarde :

 Memoire.save(registre, NomFichier);

Exemple de lecture :

        Object o  = Memoire.read(NomFichier);
        if (o != null)
            if (o instanceof RegistreDeforum)
                registre = (RegistreDeforum) o;
    }

Evolutions

  1. Dans certains canaux dès qu'un message est lu, il est effacé. Modifier votre code pour permettre la création de tels canaux. Attention, les autres canaux sont toujours utilisables. Utilisez bien les tests unitaires, pour vérifier que vous ne “cassez” pas vos codes. Comment votre modèle est-il modifié?
  2. Pour certains forums, lorsque l'on poste un message en donnant comme nom de canal “*”, le message est posté dans tous les canaux. Modifier votre code pour tenir compte de ce nouveau besoin.
  3. Analyser les dépendances entre vos classes.

Rendus

Le 17 octobre à minuit

  • Utilisez la boite de dépôt pavec date limite : le 17 octobre à minuit.
  • Le rendu consiste en :
    1. Un document contenant
      • votre modèle6) final (Tout le monde n'aboutit pas au même modèle, c'est certain, bien mettre des diagrammes pas le projet Modelio)
      • des explications sur les raisons de ce modèle, les choix que vous avez faits et les leçons apprises.
    2. Les codes et les tests en particulier les tests JUNIT;
    3. Il est préférable que les codes soient commentés en respectant les consignes d'une javadoc mais ce n'est pas essentiel 7)

Dans cet exercice nous évaluons votre capacité à concevoir les bons modèles et la “bonne” architecture relativement à vos objectifs. Des modèles incomplets sont évidemment considérés comme faux au regard de ces objectifs.

Tuyaux

Vous avez besoin dans ce TD de manipuler des collections et des dates, voici quelques tuyaux que vous pourriez retrouver sur le Web et qui sont extraits des codes que nous avons mis en oeuvre pour ce TD. Vous pouvez évidemment avoir d'autres solutions :

ArrayList<Message> messagesContenus = new ArrayList<Message>(messages);
        for (Message m : messagesContenus) {
            if (m.perime(i)) {
                m.detruire();
                messages.remove(m);
            }
  public boolean estPerime(int second){
        Date d = new Date();
        long ms = d.getTime();
        ms = ms - second*1000;
        d.setTime(ms);
        return this.dateEmission.before(d);
    }
    public void detruireMessages(int i) {
       for (Boite b : boites.values()) {
           b.detruire(i);
       }
1)
Comment gérez-vous le dépassement du nombre de messages alors que rien de vous est dit dans ce cas?
2)
obtenir la liste des messages
3) , 4)
pareil pour le forum “AntibesInformation”, ça passe?
5)
Quand on l'aura vu en cours
6)
Modèle = diagrammes UML