• Aucun résultat trouvé

Algorithme de détection

Dans le document en fr (Page 128-131)

alternatifs dans un modèle

Application 3.1 : Association à chaque classe du fragment d’un participant du patron abîmé

II.4. Algorithme de détection

Cet algorithme se décompose en trois étapes. À l’issue de chaque étape, un ensemble de classes caractéristiques est sélectionné de l’ensemble issu de l’étape précédente. Ainsi, chaque étape réduit le nombre de classes à traiter jusqu’à ne conserver que les classes appartenant à des fragments alternatifs.

Pour présenter le déroulement de cet algorithme, nous illustrons chaque étape sur l’exemple présenté dans la figure 3.19, où toutes les contextualisations du patron abîmé sont recherchées dans le modèle.

Figure 3.19 : Un patron abîmé et un modèle à analyser

Composant Feuille Composite * * Classe X Classe U Classe Z Classe Y Classe V Classe W Classe T * * * * Classe R * Classe S *

La première étape de l’algorithme consiste à sélectionner l’ensemble des classes vérifiant le prédicat local_CPR pour chacun des participants du patron abîmé. Ainsi, chaque classe du modèle est analysée pour vérifier si ses particularités structurelles locales sont conformes aux particularités structurelles locales d’au moins un des participants du patron abîmé. Cette étape construit donc un ensemble de classes pour chaque participant du patron abîmé. Dans notre exemple, cette étape retourne trois ensembles de classes. Le tableau 3.2 présente le résultat de l’algorithme pour l’exemple précédent.

Participant Classes ayant leurs responsabilités locales concordantes avec le participant Composant Classe X, Classe Y

Composite Classe Z, Classe W

Feuille Classe U, Classe Z, Classe V, Classe T, Classe W, Classe S Tableau 3.2 : Résultat de la première étape de l'algorithme de détection

La deuxième étape récupère le résultat de l’étape précédente et cherche à regrouper les classes par fragment alternatif distinct, un par classe de référence, ici Composite. Pour mémoire, le participant de référence doit être unique dans un fragment. Ainsi, en vérifiant par quelles relations chaque classe est rattachée au participant de référence, l’algorithme « démêle » les classes sélectionnées précédemment afin de former un ensemble d’ensembles de classes. Chaque ensemble contient une seule classe candidate aux responsabilités du participant de référence et, pour chacun des autres participants, un ensemble de classes reliées à la classe référence par les mêmes relations que dans le patron abîmé.

Dans notre exemple, deux ensembles sont donc créés par cette étape puisqu’il y a deux classes candidates aux responsabilités de Composite, la Classe Z et la Classe W. Lors du démêlage, la Classe U et la Classe X sont associées au fragment ayant pour référence Classe

Z. Pour le fragment ayant pour référence Classe W, ce sont Classe Y, Classe V, Classe T et Classe S qui lui sont associées. En ce qui concerne Classe Z et Classe W, nous pouvons

remarquer dans le tableau 3.2 qu’elles sont également candidates aux responsabilités de

Feuille, mais qu’elles ne le sont plus dans le tableau 3.3 qui présente le résultat du démêlage.

Elles ont été toutes les deux éliminées des ensembles de Feuille. Cette élimination à l’étape de démêlage s’explique par le fait que ces deux classes ne sont pas reliées correctement au participant de référence. Dans le cas où une classe ne serait pas reliée correctement à un participant non-référence, le démêlage ne l’aurait pas éliminée, et il aurait fallu attendre l’étape de filtrage des particularités globales.

Fragment Participant Classes ayant les mêmes responsabilités locales

1 Composant Classe X

Composite Classe Z Feuille Classe U

2 Composant Classe Y

Composite Classe W

Feuille Classe V, Classe T, Classe S

La troisième étape de l’algorithme vérifie si les fragments issus de l’étape précédente sont bien conformes au prédicat frag_alternatif. Pour cela, l’algorithme vérifie, pour chacune des classes du fragment, s’il est possible d’atteindre les autres classes avec les mêmes relations que pour les participants correspondants du fragment. Si une classe n’est pas reliée de la même manière, c'est-à-dire qu’elle n’a pas les mêmes particularités structurelles globales que le participant correspondant dans le patron, elle est éliminée du fragment. De plus, si l’algorithme identifie qu’en plus des liens autorisés, une classe est reliée à une autre par un lien supplémentaire, il vérifie si ce lien n’est pas interdit. Le cas échéant, il élimine la classe concernée.

Dans notre exemple, Classe S est la fille de Classe W qui a les responsabilités de

Composite. Il est explicitement décrit dans le patron abîmé qu’il ne doit y avoir aucune

relation d’héritage entre une Feuille et un Composite. Cette classe est donc éliminée du fragment. Finalement, la troisième étape fournit les deux fragments alternatifs de notre exemple, comme illustré dans le tableau 3.4.

Fragment Participant Classes ayant les mêmes responsabilités locales

1 Composant Classe X

Composite Classe Z Feuille Classe U

2 Composant Classe Y

Composite Classe W

Feuille Classe V, Classe T

Tableau 3.4 : Résultat de la troisième étape de l'algorithme de détection

Nous pouvons remarquer que le lien d’héritage entre Classe V et Classe R n’interfère pas dans l’identification des fragments, puisque Classe R ne s’est vue attribuée aucune responsabilité. La figure 3.20 met en exergue les deux fragments identifiés.

Figure 3.20 : Deux fragments alternatifs identifiés dans le modèle à analyser

En conclusion, notre algorithme permet de détecter de manière détaillée les contextualisations des patrons abîmés. Ces derniers constituant une base génératrice de formes à identifier, nous caractérisons exactement ce qui est recherché, moyennant points d’extensions, relâchement de contraintes et relations interdites. L’utilisation d’OCL nous permet d’éviter de changer d’espace technologique, et ainsi, de ne pas imposer au concepteur de prétraitement sur les modèles avant de lancer l’activité.

Classe X Classe U Classe Z Classe Y Classe V Classe W Classe T * * * * Classe R * Classe S *

Dans le document en fr (Page 128-131)