Diagramme de séquence, Injection de dépendance, Builder
Exercice 1 - Diagramme de séquence
En reprenant les classes du premier td
td3convert.zip
sur les filtres d'images.
-
À partir du code écrit précédemment modéliser le scénario
d'applications d'un ensemble de filtre avec une image
en utilisant un diagramme de séquence avec les classes
que vous avez écrites.
Sur le paquetage courant, créer un "Diagramme de séquence",
placer l'acteur utilisateur à gauche et indiquer
l'ensemble des méthodes qui sont appelées.
Exercice 2 - Injection de dépendance
-
Dans un souci d'internationalisation, on souhaite que le fichier des filtres
permette de définir un filtre soit par son nom en anglais ou en français
(rotation et rotate, par exemple).
L'idée consiste à permettre à chaque créateur de filtre de s'enregistrer
plusieurs fois avec des noms de filtre différents dans la table d'association.
Ajouter une méthode indiquant pour chaque créateur de filtre l'ensemble
des noms pour lesquels il veut être enregistré.
-
Modifier votre code pour qu'au lieu d'utiliser une méthode de description
on utilise une annotation FilterNames permettant de
définir l'ensemble des noms d'un filtre.
Changer votre code en conséquence.
-
De façon plus général pour résoudre ce genre de problème, on utilise
le design-pattern Injection de dépendance (appelé aussi Inversion de contrôle).
C'est à dire, au lieu d'enregistrer le créateur de filtre
pour un ensemble de nom dans un code externe,
on demande au créateur de filtre de s'enregistrer lui-même en lui
passant en paramètre une table d'association
ou plus exactement une abstraction
de table associative pour éviter un couplage trop fort.
Implanter ce design-pattern en permettant que par défaut l'utilisation de
l'annotation FilterNames.
Exercice 3 - Requète SQL
On souhaite créer une classe Query permettant de créer des requêtes
SQL. Nous nous limiterons à des requêtes SELECT ... FROM ... WHERE ... AND ...
(avec autant de AND que l'on veut).
Pour créer la requête, on souhaite permettre à l'utilisateur de spécifier uniquement
des couples nom de table/champs soit en tant que clause SELECT soit en tant
que clause WHERE. Les valeurs du FROM seront calculées automatiquement.
-
Implanter la classe Query en utilisant le design-pattern builder :
Query query=new Query();
query.select("user.id");
query.select("user.name");
String sql=query.toSQL();
le code précédent doit générer la requête :
SELECT user.id,user.name FROM user;
-
Faire en sorte que l'on puisse chaîner les requêtes :
new Query().select("user.id").select("user.name").toSQL();
-
On souhaite de plus gérer les clauses WHERE sachant que l'on peut comparer la valeur
de deux champs avec '='.
Attention, la solution que vous proposerez devra éviter
d'avoir à écrire un parseur d'expressions.
Mdifier votre code pour que l'on puisse créer une requête de ce type :
SELECT id,name,street FROM user, address WHERE user.id = address.user_id;
Attention à la gestion des constantes ... WHERE user.id=3
-
Ajouter la gestion des '<>', '<', '>'.
-
Créer une annotation @Table qui permet d'assigner
un nom de table à une classe. Faire en sorte que l'annotation soit accessible par reflexion
lors de l'exécution, et se transmette aux sous-types.
Ajouter une méthode select(Class<?> type,String field) qui va chercher
le nom de la table en utilisant la classe type.
Rémi Forax - Université de Marne La Vallée