Méthodes de visualisation de correspondances et de similarité
Les duplications de code existant au sein d’un projet ou entre plusieurs projets peuvent être nombreuses et protéiformes. Si des méthodes de consolidation de correspondances telles que celle présentée au chapitre 11 permettent de proposer des correspondances plus étendues et moins nombreuses, il reste à présenter ces résultats à l’utilisateur d’une manière conviviale avec la possibilité d’étudier des similarités à plusieurs échelles du code. Dans un premier temps, nous examinons quelques méthodes de visualisation de correspondances pour ensuite nous intéresser à la visualisation de valeurs de similarit é, permettant d’avoir une vision plus globale de l’état des similarités au sein de volumes de code importants, afin d’affiner ensuite l’échelle de l’examen pour étudier des correspondaLa visualisation de correspondances par confrontation des sources est proposée par la plu- part des outils de recherche de similitudes. Elle consiste à afficher les différents extraits de code source correspondant à la similitude trouvée afin de permettre à l’utilisateur de juger de la pertinence du clone trouvé. Ces extraits peuvent être concaténés dans un fichier texte ou bien visualisés par l’intermédiaire d’une interface graphique. Une telle interface graphique peut se présenter sous la forme de deux zones d’affichage défilantes avec la possibilité d’aligner un exemplaire de correspondance avec un autre, ce qui permet de prendre également connais- sance du contexte environnant de chaque exemplaire de clone. Pour une meilleure lisibilité, les exemplaires d’une même correspondance peuvent être marqués par une même couleur. Les sous-zones correspondantes ainsi que les fossés pour des clones non-exacts peuvent également être mis en valeur. Il est possible d’utiliser une application dédiée de visualisation ou bien une sortie HTML, comme cela est l’usage pour les outils de recherche de similitudes uniquement disponibles sous la forme de services Web [76, 94, 95].
Ce procédé de visualisation de similarité, s’il permet d’évaluer précisément la qualité de chaque correspondance, ne peut être utilisé efficacement pour une vue d’ensemble de la nature des similarités trouvées au sein d’un projet ou de plusieurs projets de taille conséquente : des méthodes de visualisation plus globales (dotplot ou visualisation de matrice de simila- rité) doivent être employées. D’autre part, si chaque correspondance comprend de multiples exemplaires, la visualisation simultanée de tous ces exemplaires peut s’avérer difficile.}. Ces différentes unités sont concaténées et divisées en autant de portions que l’axe des abscisses (pour P ) ou l’axe des ordonnées (pour Q) contient de pixels. Ainsi chaque pixel représente une zone de code de taille identique et des pixels contigus représentent des zones de code contigües. Les pixels de coordonnées correspondant à une paire de zones de code mises en correspondances sont marqués pour représenter la similarité. En pratique les unités de code analysées pour les abcisses et les ordonnées sont les mêmes (P = Q) ce qui permet l’obtention d’un graphe symétrique avec une diagonale marquée (les zones de code sont similaires avec elle- mêmes). Il est envisageable de moduler la nuance du pixel en fonction du degré de similarité de la paire de zones symbolisée par le pixel. Un graphe explorable avec modification interactive d’échelle pourrait être également intéressant.
Le graphe d’appels factorisé d’un ensemble de projets peut être obtenu par l’application de la méthode de factorisation décrite au chapitre 7. Au cours de cet algorithme, chaque fonction des projets analysés est découpée en une séquence d’appels de fonction : les fonctions appelées peuvent être des fonctions réelles du code source ou alors des fonctions synthétisées créées à partir de la factorisation d’une séquence de lexèmes primitifs partagée par plusieurs fonctions. Le graphe d’appels factorisé est donc un graphe d’appels classique augmenté par les fonctions factorisées. Il permet ainsi de visualiser des portions de code partagées. Le graphe d’appels factorisé, dans sa forme exhaustive ne présente pas un intérêt immédiat pour une visualisation par un humain : le nombre de fonctions externalisées par factorisation et le nombre de liens d’appel peuvent être potentiellement assez élevés ce qui rend l’exploration du graphe difficile. Cependant des critères de filtrage peuvent être envisagés afin d’explorer certains types de similarité.Nous pouvons noter que outre l’utilisation qui semble naturelle de ce type de représenta- tion pour le résultat obtenu par la méthode de factorisation, celle-ci peut être exploitée par tout autre méthode de recherche de similitudes. Il s’agit alors de considérer pour feuilles du graphe les portions de code issues de correspondances trouvées puis de déterminer par clô- ture transitive l’ensemble des fonctions appelant ces portions de code. Nous obtenons ainsi un graphe d’appels représentant uniquement les fonctions appelant (directement ou indirecte- ment) les portions de code mises en correspondance (ces fonctions étant les nœuds internes) et les portions de code elles-mêmes (feuilles). La principale différence avec le graphe d’appels fac- torisé réside dans le fait que les portions en correspondance ne sont pas elle-mêmes factorisées entre-elles.