:: Enseignements :: Master :: M1 :: 2014-2015 :: Design Pattern ::
[LOGO]

Mes premières factories




Exercice 1 - Arbre Lexicographique

Un arbre lexicographique, ou trie en Anglais, est un arbre qui stocke un ensemble de mots. Contrairement à une table de hachage, ce genre d'arbre permet de trouver tous les mots ayant un préfixe commun. Cette structure de donnée peut être utilisée, par exemple, pour proposer une complétion automatique de mots lorsque dans une interface graphique un utilisateur tape le début d'un mot. Par exemple, si l'arbre lexicographique contient "toto", "tuto" et "tota", il est possible de demander à l'arbre tous les mots ayant le préfix "to", la réponse sera "toto" et "tota".
Nous allons supposer qu'une implantation de Trie a déjà été écrite par un de vos collègues, par contre celui-ci n'a pas le temps de reprendre son code et est faché avec les commentaires.

Le but de cet exercice est de savoir reprendre du code existant, de savoir le modifier pour y introduire de nouvelles fonctionnalités.

  1. Avant de modifier le code, nous allons dans un premier temps, le commenter en écrivant sa documentation au format javadoc.
    Dans un premier temps, expliquer en 2 ou 3 phrases en Français avec vos propres mots ce que font les méthodes add(String), contains(String) et prefix(String, Consumer<String>) d'un point de vue utilisateur (donc pas comment le code fonctionne, mais ce que fait/renvoie chaque fonction en fonction de ce que l'on passe en entrée).
  2. Ecrire les commentaires en Anglais au format javadoc des 3 méthodes sus-citées.
  3. On veut ajouter un constructeur qui prend en paramètre une suite de chaînes de caractères (séparées par des virgules) et qui construit l'arbre associé.
    Ecrire un tel constructeur.
    Pourquoi ce n'est pas une bonne idée ?
    Que doit-on faire à la place ?
  4. Il existe plusieurs implantations de table associative symbolisée par l'interface Map en Java, HashMap, LinkedHashMap ou TreeMap. Pour chaque implantation, dans quel ordre sont stockées les couples clés/valeurs.
    Déduisez en dans quel ordre sont passés les mots au consommateur pris en paramètre de la méthode prefix.
  5. On veut changer l'implantation pour pouvoir choisir l'ordre dans lequel les mots sont envoyés au consommateur de la méthode prefix.
    On se propose pour cela, d'ajouter une méthode createMap() abstraite à la classe Trie, de modifier le code de Trie pour que la création des Map de chaque noeud de l'arbre utilise la méthode createMap puis d'ajouter 3 sous-classes HashTrie, LinkedHashTrie et TreeTrie chacune implantant la méthode createMap pour créer respectivement une HashMap, une LinkedHashMap et une TreeMap.
  6. Dessiner le diagramme UML correspondant et prenez une photo.
    Vérifier que vous avez bien implanter le design pattern nommé method factory du GoF.
    Note: attention method factory et static method factory sont deux design pattern différents
  7. En fait, ce design pattern est un mauvais design pattern (et oui ça existe), expliquer pourquoi il ne respecte pas le S de SOLID.
  8. Séparer les deux responsabilités en deux types et utiliser la délegation de sorte que la façon de créer une Map soit pris en paramètre lors de la création du Trie.
    Vérifier que votre code est correct en écrivant les tests dans un autre package que le package contenant le Trie.
    Expliquer dans quel cas on doit utiliser la délégation et dans quel cas on doit utiliser l'héritage !
Pour préparer la prochaine séance, étudiez les articles suivants :