THÈse présentée








télécharger 0.65 Mb.
titreTHÈse présentée
page22/28
date de publication09.06.2018
taille0.65 Mb.
typeThèse
ar.21-bal.com > droit > Thèse
1   ...   18   19   20   21   22   23   24   25   ...   28

Modélisation des anti-patterns


Dans les sections précédentes, nous avons exprimé les propriétés qu’un modèle abstrait du diagramme de classes devrait vérifier pour pouvoir indiquer exactement toutes les interactions de classe pour un système. Le modèle que nous proposons est fondé sur un graphe dont nous donnons ici les règles de dérivation à partir d'un diagramme de classes UML. Un tel graphe s'appelle un Graphe des Dépendances de Classes (GDC). Après avoir défini précisément la construction de ce graphe et quelles informations il comporte, nous donnons des règles sur la topologie du graphe qui déterminent formellement les anti-patterns. Le GDC sert de base pour appliquer des algorithmes de graphe classiques pour détecter les anti-patterns et mesurer leur complexité.

5.3.5Construction d’un graphe à partir d'un diagramme de classes d'UML


Un graphe de dépendances de classes peut être construit automatiquement à partir d’un diagramme de classes. Les définitions suivantes précisent quelles informations le GDC doit contenir, et comment les obtenir à partir d’un diagramme de classes. L'ensemble de toutes les classes d'un système est désigné par C, et M(c) désigne l'ensemble des méthodes d'une classe c  C.

Un Graphe De Dépendance De Classes (GDC). Un graphe de dépendance de classe est une paire GDC=(X, ), où :

- X est l'ensemble des sommets, chaque sommet représentant une classe d'un système orienté objet. Une classe est représentée par un simple sommet.

-  est l'ensemble de paires (x,y)  X2, appelé ensemble des arcs orientés ((x,y)(y,x)) Un arc entre deux sommets, x et y, représente une dépendance de la classe représentée par x à la classe représentée par y. Un arc est marqué par le type de dépendance qui existe entre les deux classes, à savoir dépendances d'utilisation (association ou dépendance UML) ou bien héritage.

Un GDC peut être facilement construit à partir d'un diagramme de classes UML, les règles de transformation sont résumées Figure 60. Ces transformations sont rendues explicites dans les définitions suivantes. Notez que, puisqu'il y a un sommet pour chaque classe et chaque sommet représente une et une seule classe, dans les définitions suivantes, le sommet correspondant à une classe c s'appelle simplement c.

Étiquettes d’arc. Chaque arc dans un GDC représente une dépendance entre deux classes d'un système orienté objet. L’arc entre les sommets c  C et d  C est marqué par le type de dépendance existant entre c et d. Les dépendances peuvent être de deux types : utilisation (étiquette U) si c utilise d ou héritage (étiquette I) si c  d et c hérite de d.

Étiquette U. Nous associons un ensemble de méthodes à l'étiquette U qui correspond à l'ensemble de méthodes dans M(d) employé par la classe c. La valeur par défaut de cet ensemble de méthodes est M(d) (tant que nous ne connaissons pas le sous-ensemble M(d) utilisé par c). Cette transformation est illustrée dans la Figure 60(a). Dans le cas d’une dépendance d'utilisation stéréotypé par «instantiate» ou «create» entre les classes c et d, l'ensemble de méthodes associées à l'étiquette U est (created ()) et indique que c appelle seulement la méthode de création de classe d à travers cette relation d'utilisation.

Étiquette I. L'étiquette d'héritage est dérivée en deux étiquettes : I-child et I-parent (Figure 60(b)). Si c  C, d  C -{c}, et c hérite directement de d, alors il y a un arc (d,c) marqué I-child et un arc (c,d) marqué I-parent. Si d est une interface pure, l’arc(c,d) n'existe pas (dans ce cas, c ne peut pas employer des méthodes de d, Figure 60(c)), et si la classe d dépend d'autres classes, les arcs marqués U de d n'existent plus, mais sont déplacés aux enfants concrets de d (la Figure 60(d)).



Figure 60 – Les transformations de base d'un diagramme de classes UML en un GDC

Du point de vue du test, nous avons besoin d'une dépendance du parent à l'enfant, parce que toute référence à un objet de type parent peut désigner un objet fils. Ainsi, toute relation à une classe parent se propage vers chaque classe fille. La dépendance de la classe fille à la classe parent est évidente: c emploie d quand elle appelle une méthode m héritée de d.

La Figure 61 donne l’exemple d’un graphe de dépendance de classes obtenu à partir d'un petit diagramme de classes, en appliquant les règles de transformation données dans les définitions ci-dessus.



Figure 61 – Exemple GDC

5.3.6Détecter des anti-patterns à partir du GDC


Nous revenons maintenant à la notion d’anti-pattern, et les définissons en termes de topologie remarquable dans un graphe. Pour cela nous rappelons les définitions de chemin et de cycle dans un graphe qui seront nécessaires pour définir les anti-patterns.

Chemin. Un chemin C dans un GDC est une séquence de sommets C = [xi1, xi2, xi3,…, xik] tels que :

  • (xi1, xi2)   , (xi2, xi3)   ,…, (xik-1, xik)  

  • xi1 est l’origine du chemin et est appelé origine(C)

  • xik la fin, fin(C)

  • les xij (2  j  k-1), sont les sommets intermédiaires (cet ensemble de sommets est appelé sommetsIt(P)).

Cycle. Soit C un chemin, C est un cycle ssi fin(P) = origine(P).

Chemin et cycle élémentaire. Un chemin élémentaire est une séquence de sommets tels qu’il n’y ait jamais deux fois le même sommet. Un cycle élémentaire est un chemin élémentaire dans lequel seul le sommet d’origine est répété une fois.

Sur la Figure 61, [c, b, b2, b22] ou [c, b, b2, b21, e] sont des chemins élémentaires, mais [c, b, b2, b21, b2] n’en est pas un. De même, [c, b, b2, c] est un cycle élémentaire, mais pas [c, b, b2, b21, b2, c].

Interaction De Classe (IC). Il existe une interaction de classe IC(c,d) de la classe c  C à la classe d  C -{c}, s'il existe au moins deux chemins élémentaires P1 et P2 tels que P1  P2 et (origine(P1) = origine(P2)=c)  (end(P1) = end(P2) = d)  (sommetsIt(P1)  sommetsIt(P2)).

Un chemin traversant une hiérarchie d'héritage ne doit la traverser que dans une seule direction, c.-à-d. qu’on ne doit avoir que des arcs allant des sommets enfants aux sommets parents ou des arcs allant des sommets parents aux sommets enfants.



Figure 62 – IC sur un GDC

Cette définition de l'interaction ne tient compte que des interactions unitaires. Par exemple, sur le GDC de la Figure 62, deux interactions sont détectées : IC(a, c) et IC(d, f), tandis que la plus grande interaction IC(a, f) n'est pas détectée. Nous supposons qu’il est suffisant de ne détecter que les interactions, puisque la résolution de IC(a, c) et IC(d, f) résout également IC(a, f).

Auto Utilisation (AU). Il existe une interaction d’auto-utilisation AU(c) sur la classe c  C, s'il existe un cycle élémentaire d'origine c. L’anti-pattern concerne tous les nœuds du cycle.

Un cycle traversant une hiérarchie d'héritage doit croiser la hiérarchie seulement dans une direction, c.-à-d. qu’il ne doit y avoir que des arcs allant des sommets enfants aux sommets parents ou des arcs allant des sommets parents aux sommets enfants.



Figure 63 – AU Sur un GDC

La Figure 63 montre un graphe sur lequel une interaction AU(c) peut être détectée: il y a un cycle élémentaire du sommet c au sommet c. Tout comme l'interaction IC, la définition de l'interaction AU donnée ci-dessus considère seulement les interactions unitaires.

5.3.7Complexité des anti-patterns


La complexité d'un anti-pattern peut maintenant être formalisée en tenant compte du polymorphisme dans le système. La complexité d'une interaction augmente quand un ou plusieurs chemins impliqués traverse un graphe correspondant à une hiérarchie d'héritage.

Complexité d’une interaction. Soit {P1…PnbPaths} un ensemble de chemins correspondant à une interaction de classe IC, la complexité de l'interaction est liée à la complexité des différents chemins de la façon suivante:



Chemin de descendance. Dans une hiérarchie d'héritage, un chemin de descendance est l'ensemble des classes croisées par un chemin allant de la classe racine à une classe feuille.

Comme défini plus tôt, les chemins impliqués dans une interaction peuvent passer par une hiérarchie d'héritage seulement dans une direction. Nous identifions alors un sous-chemin correspondant à une tranche de la hiérarchie d'héritage allant d'une classe racine à une classe feuille comme le montre la Figure 64. Ce sous-chemin s'appelle un chemin de descendants dans une hiérarchie d'héritage. Si un chemin impliqué dans une interaction passe par une ou plusieurs classes d'un chemin de descendants dans le graphe, la complexité de l’interaction augmente de la façon suivante: s'il y a n classes dans un chemin de descendants, dont aucune n’est une interface pure, la complexité du sous composant est n*(n-1). Chaque classe a une relation avec chacune des (n-1) autres classes et n*(n-1) interactions peuvent se produire et doivent être examinées.



Figure 64 – Tranche dans un SCC correspondant à une hiérarchie d'héritage

Si deux hiérarchies d'héritage sont présentes dans l’interaction, chaque classe d'une hiérarchie peut avoir une relation avec chaque classe de l'autre hiérarchie. Aussi, la complexité d'un chemin est-elle le produit de la complexité associée à chaque hiérarchie croisée par l'interaction.

Complexité d'un chemin dans une interaction de classe. Soit P un chemin impliqué dans une interaction de classe, et IHi,…, IHnbCrossed les hiérarchies d'héritage croisées par P, la complexité de P est calculée de la manière suivante :

complexity(P) =

Les arcs des hiérarchies d'héritage ne sont pas pris en compte dans le calcul de la complexité.

Par la suite, nous définissons la complexité d'un chemin traversant une hiérarchie d’héritage. Plusieurs chemins de descendants dans une hiérarchie d'héritage peuvent augmenter la complexité d'un chemin. Si un chemin passe par une classe qui n'est pas une feuille dans la hiérarchie d'héritage, il peut y avoir plusieurs chemins de descendants incluant cette classe. Par exemple, sur la Figure 65, le chemin [bEvt, bSt, book] traverse la classe racine de la hiérarchie d’héritage de BookState. Puisque BookState n’est pas une classe feuille dans l’arbre d’héritage, tous les chemins de descendants commençant par le nœud bSt doivent être pris en compte dans le calcul de la complexité du chemin. Donc, les 5 chemins de descendants [bSt, Or], [bSt, Bd], [bSt, IL, BFx], [bSt, IL, Av], [bSt, IL, Rd] sont impliqués dans le calcul de la complexité du chemin [bEvt, bSt, book].

Complexité d'un chemin passant par une hiérarchie d'héritage. Soit IH une hiérarchie d'héritage et P un chemin croisant IH, la complexité d'IH pour P est l'addition de la complexité de dp1,…, dpnbDP , des chemins de descendance dans IH influençant la complexité de P.

complexiéy(IH,P) =

La complexité d'un chemin de descendants correspond au nombre maximum de dépendances entre les classes dans ce chemin. Dans le pire cas, chaque classe dépend de toutes les autres, ainsi, s'il y a n classes dans le chemin, il y aura donc tout au plus, n*(n-1) interactions.

Complexité d'un chemin de descendants. Soit DP un chemin de descendance de hauteur h, la complexité pour DP est alors :

complexité(dp) =

Dans la suite, ces définitions sont illustrées par le calcul de la complexité sur l’exemple du système de gestion de livres.

5.3.8Mesure de la complexité des anti-patterns : système de gestion de livres




Figure 65 – GDC pour le gestionnaire de livres

Le GDC pour le gestionnaire de livres de la Figure 53 est donné Figure 65. A partir de ce graphe, nous détaillons maintenant le calcul de la complexité de l’interaction de classes entre BookEvent et Book. La complexité de cette interaction est le produit de la complexité des deux chemins impliqués : C1 = [bEvt, book] et C2 = [bEvt, bSt, book].

Même si C1 se résume à un arc simple entre deux nœuds, il a une complexité non nulle puisque la classe BookEvent fait partie d’un arbre d’héritage. La complexité de C1 est donc la somme des complexités de chaque chemin de descendants impliqué. Comme la classe BookEvent est la racine de l’arbre d’héritage, tous les chemins de descendants sont impliqués dans le calcul de la complexité. Tous ces chemins sont de taille 2, et ont donc tous la même complexité. Il y a 7 chemins de descendants, et la complexité pour cet arbre d’héritage est : 7*2*(2-1)=14. C’est aussi la complexité de C1.

Le chemin C2 traverse les nœuds bEvt et bSt qui correspondent à deux classes racines d’arbres d’héritage. La complexité de l’arbre sous le nœud bEvt est 14. La complexité pour le second arbre d’héritage est l’addition de tous les chemins de descendance dans cet arbre. Deux chemins sont de longueur 2 et trois de longueur 3, la complexité est : 2*(2-1)+2*(2-1)+3*(3-1)+3*(3-1)+3*(3-1) = 22. La complexité de C2 est le produit des deux complexités, ce qui correspond au fait que les classes d’un arbre d’héritage peuvent potentiellement interagir avec toutes les classes de l’autre arbre. Le chemin C2 a une complexité de 22*14=308.

La complexité totale pour l’interaction de classe est égale au produit des complexités des chemins C1 et C2. Cette complexité correspond au nombre maximum d’interactions classe à classe, et ne tient pas compte du fait qu’un grand nombre de classes ne dépendent jamais l’une de l’autre. Par exemple la classe SetDamaged n’interagit avec aucune classe d’état. La complexité d’un anti-pattern est une borne maximum pour le nombre de relations qui devraient être couvertes au moment du test. Dans la section suivante, nous montrons que l’ajout de stéréotypes sur les associations et dépendances du diagramme de classes permettrait d’ignorer certains arcs au moment du calcul de la complexité d’un anti-pattern, et donc d’obtenir une valeur plus proche de la complexité réelle des interactions d’objets.
1   ...   18   19   20   21   22   23   24   25   ...   28

similaire:

THÈse présentée iconThèse Présentée à la Faculté de Pharmacie de Montpellier

THÈse présentée iconThèse présentée pour l’obtention du grade de Docteur

THÈse présentée iconThèse soutenue publiquement par Sang-Ha suh le 10 Juillet 2006
«avec projection», de cette thèse aux membres du Conseil scientifique et à leurs expliquer pourquoi cette thèse ne devait pas être...

THÈse présentée iconThèse soutenue publiquement par Sang-Ha S. le 10 Juillet 2006 Le...
«avec projection», de cette thèse aux membres du Conseil scientifique et à leurs expliquer pourquoi cette thèse ne méritait pas d’être...

THÈse présentée iconQuestionnaire sur les Cathédrales Quelle est le nom de la cathédrale...

THÈse présentée iconCommuniqué de presse
«L’homme et la matièRE» de Don Darby que l’année prenait son envol. L’exposition est présentée à la Salle Principale du cne jusqu’au...

THÈse présentée iconCatégorie de Grand Prix présentée (cocher la case correspondante)
«Les Grands Prix simi immobilier de Bureaux» du 17 juin au Vendredi 7 octobre 2016

THÈse présentée iconThèse

THÈse présentée iconCommuniqué de presse
«Komuna Fundamento» présentée lors de la xiiie exposition internationale d’architecture «Common Ground» qui se déroule dans le cadre...

THÈse présentée iconAutomne 2013 plan de cours
«Unified», combinée à l'apprentissage du langage uml, est présentée et mise en pratique dans un projet de conception et d'implantation...








Tous droits réservés. Copyright © 2016
contacts
ar.21-bal.com