• Aucun résultat trouvé

C HAPITRE 5 Guider le processus

5.1 Les guides de l’extraction

Nous étudions, dans cette section, les informations intentionnelles et contextuelles ainsi que leurs liens avec les guides auxiliaires. Ensuite, nous proposons un modèle des informations permettant de les utiliser lors de l’exploration. Enfin, nous détaillons les méthodes utilisant ces informations pour guider le processus en réduisant l’espace de recherche.

5.1.1 Les informations intentionnelles

Les informations intentionnelles reflètent l’architecture que les concepteurs ont imaginée pour le sys- tème. Elles donnent ainsi une image de l’architecture du système avant qu’elle ne soit soumise au bruit dû à l’utilisation d’un langage de programmation et au passage de plusieurs phases de maintenance. Elles décrivent donc l’architecture intentionnelle d’un système, c’est-à-dire l’architecture que les concepteurs ont souhaitée mettre en place. Elles permettent donc d’identifier des dépendances entre classes ou des fonctionnalités imaginées lors de la conception.

L’utilisation de l’information intentionnelle est un challenge important pour les travaux d’extraction d’architectures. Comme nous l’avons vu dans le chapitre 2, plusieurs travaux [69, 88, 123] utilisent des experts pour retranscrire ces informations et les utiliser dans le processus pour obtenir une vue de l’architecture ou affiner la vue obtenue.

De façon similaire, nous utilisons les recommandations de l’architecte pour fournir des informa- tions intentionnelles. Elles définissent un ensemble de propriétés que doit posséder une architecture pour correspondre à la vision de son architecte. Ces recommandations portent sur tous les éléments architec- turaux et peuvent être positives ou négatives. L’architecte peut, par exemple, imposer que deux classes appartiennent au même contour de composant ou à l’inverse que ces deux classes appartiennent à deux contours différents. Cependant, comme pour les autres travaux, cela a pour conséquence directe, une augmentation de la dépendance du processus par rapport aux experts.

Afin de limiter le recours à des experts, nous proposons d’utiliser la documentation pour pouvoir prendre en compte, dans un processus semi-automatique, l’architecture intentionnelle d’un système. En effet, le cycle de vie d’un logiciel voit la création de nombreux documents visant à faciliter la compré- hension du système en conservant et en explicitant les informations intentionnelles.

Les informations intentionnelles contenues dans la documentation sont différentes de celles fournies par l’architecte. D’abord, elles définissent des propriétés sur les composants qui sont positives. Elles peuvent, par exemple, montrer que des classes collaborent étroitement et appartiennent donc à un même contour. De plus, les informations contenues dans la documentation concernent principalement les com- posants et la configuration mais peu les connecteurs. En effet, la documentation s’attache surtout à décrire les fonctionnalités du système et comment elles sont mises en œuvre. Les informations concernant les modes de communication entre les modules, par exemple, sont souvent considérées comme des « détails » d’implémentation.

Figure 5.1 – Les documents et les recommandations disponibles

En plus des recommandations de l’architecte, nous avons identifié trois sources d’informations, parmi l’ensemble des documents disponibles, qui nous offrent quantité d’informations sur les relations entre les classes et nous donnent une vue au moins partielle de l’architecture du système (cf. Figure 5.1) : les diagrammes UML, les fichiers du code source et les archives des outils de versionnement.

Diagrammes UML. Nous utilisons les diagrammes UML pour diriger notre processus vers l’ar- chitecture intentionnelle du système. En effet, la modélisation UML d’un système est l’un des types de documents le plus couramment utilisé aujourd’hui. Les diagrammes de ce modèle accompagnent un logiciel durant tout son cycle de vie.

Ils sont d’abord utilisés dans la phase de conception, pour modéliser les fonctionnalités du système, les classes associées à ses fonctionnalités et les relations entre ces classes. Par la suite, ils sont affinés pendant la phase de production et se rapprochent alors de la structure réelle du système. Enfin, pendant les phases de maintenance, s’ils sont maintenus à jour, ils permettent de suivre l’évolution du système.

Ces diagrammes constituent une source importante d’informations intentionnelles. Ils modélisent les liens entre les classes, tels que les concepteurs les prévoient puis les supposent. A ce titre, ils contiennent suffisamment d’informations pour permettre d’obtenir une vue de l’architecture intentionnelle d’un sys- tème.

Exemple 5.1 (Informations intentionnelles disponibles dans un diagramme UML).

La figure 5.2 montre un diagramme de classes UML. Le diagramme montre que les classes A et B sont liées par une relation de composition, alors que la classe C est disjointe et n’a pas de relation avec A ou B. Nous pouvons donc supposer que les classes A et B doivent appartenir à un même composant, et que la classe C fait partie d’un autre composant.

Figure 5.2 – Informations intentionnelles disponibles dans un diagramme UML

Fichiers sources. Nous utilisons le code source pour diriger notre processus vers l’architecture intentionnelle du système. En effet, les fichiers du code source constituent un autre type de documents contenant des informations utiles pour l’extraction d’une architecture intentionnelle. Ils contiennent, outre le code source de l’application, des informations sur les intentions des programmeurs.

Ces informations sont stockées à la fois, dans les commentaires qui sont associés au code et dans le code lui-même, à travers le choix des noms pour les entités du programme. Elles établissent un lien entre les classes et les fonctionnalités que les programmeurs leur associent. Ces liens permettent donc d’établir une vue de l’architecture intentionnelle du système.

Exemple 5.2 (Informations intentionnelles disponibles dans un fichier source).

La figure 5.3 montre deux exemples de fichiers de classe Java. Le premier fichier contient une classe qui est décrite par son nom et ses commentaires associés comme réalisant le tri d’une liste donnée en paramètre selon un algorithme de tri par fusion. Le second fichier contient une classe décrite, par les commentaires, comme une classe de tri selon l’algorithme de tri par insertion. Ainsi, les commentaires mettent en évidence la proximité sémantique des deux classes et constituent un indicateur précieux pour les regrouper sur la base de la proximité de leurs parties métier.

Figure 5.3 – Informations intentionnelles disponibles dans un fichier source

Rapports des outils de versionnement. Nous utilisons les rapports des outils de versionnement pour obtenir une architecture intentionnelle du système qui nous permet d’influer sur notre processus d’extraction. En effet, durant les phases de maintenance, la structure de l’application est modifiée et ces modifications sont, la plupart du temps, archivées d’une manière plus ou moins précise à travers les différents outils de versionnement.

Les informations stockées peuvent être utilisées pour détecter les liens, supposés par les program- meurs, entre les classes. En effet, des classes qui semblent liées pour un programmeur, seront probable- ment modifiées en cascade ou en simultané. Ces liens entre les classes permettent d’établir une vue de l’architecture intentionnelle du système.

Exemple 5.3 (Informations intentionnelles disponibles à travers un outil de versionnement).

Le tableau 5.1 représente les informations archivées par un outil de versionnement lors de la mainte- nance d’un système constitué de quatre classes A, B, C et D. La première colonne donne le nom de la classe, la deuxième précise l’heure puis la date de la dernière modification et enfin la dernière colonne contient le nom de l’auteur de la modification. Les classes A et B ont été modifiées de manière rappro- chée par Mr X, il semble donc que la modification de l’une ait un impact sur l’autre. Ces deux classes ont donc une forte chance d’appartenir au même composant. La classe C a été modifiée pratiquement à la même période mais par une personne différente. Elle n’est donc pas forcément liée aux deux classes précédentes. La classe D, enfin, a été modifiée à une date différente et seule. Elle semble donc isolée des autres et a donc une forte chance d’appartenir à un autre composant.

Classe Modification Auteur

a 14 :50 :23 :09 :08 X

b 14 :55 :23 :09 :08 X

c 14 :52 :23 :09 :08 Y

d 17 :06 :20 :09 :08 Y

Table 5.1 – Informations intentionnelles disponibles à travers un outil de versionnement

5.1.2 Les informations contextuelles

Les informations contextuelles décrivent le contexte dans lequel le système doit être déployé, c’est-à- dire les limitations en termes de mémoire ou de communication, par exemple. Elles reflètent l’architec- ture matérielle à laquelle le système doit être adapté. A ce titre, elles donnent une image de l’architecture que doit respecter le système.

L’utilisation des informations contextuelles est peu répandue dans les travaux d’extraction d’archi- tectures. En effet, l’architecture matérielle peut varier au cours de l’utilisation d’un système et, dans le cas général, elle impose peu de contraintes sur l’architecture logicielle. Cependant, dans le cadre d’une préparation à une phase d’évolution vers une architecture matérielle distribuée ou embarquée, les nou- velles contraintes contextuelles peuvent être fortes. Dans ce cas, leur prise en compte dès l’extraction de l’architecture permet de faciliter l’évolution future en proposant une représentation de l’architecture logicielle qui soit la plus adaptée à la future architecture matérielle.

Nous proposons d’utiliser les informations contextuelles pour rejeter les solutions qui sont incompa- tibles avec l’architecture matérielle prévue. Pour cela, nous devons convertir les propriétés du contexte en contraintes sur les éléments de l’architecture et donc sur les entités COA des solutions. Les informations contextuelles sont donc surtout négatives et portent sur l’ensemble des éléments architecturaux.

Par contre, à la différence des informations intentionnelles, les contraintes extraites des informations contextuelles portent uniquement sur les entités COA. Par exemple, les limitations en mémoire peuvent résulter en une contrainte sur la taille des contours mais elles n’ont pas d’impact sur les classes objets.

Ceci montre les limites de l’utilisation du contexte. En effet, comme l’extraction ne modifie pas le code source, l’adaptation à l’architecture matérielle est limitée par les propriétés des entités objets et ne permet pas d’obtenir une architecture trop éloignée de celle prévue à l’origine. Par exemple, l’occupation mémoire d’un contour de composant dépend surtout de la taille des classes qui le composent. Il est donc impossible de respecter des clauses strictes. L’adaptation à l’architecture matérielle est ainsi uniquement une première étape vers l’adaptation d’un système à une nouvelle architecture matérielle.

5.1.3 Influence des guides sur l’exploration

Le passage d’un espace de solutions à un espace de recherche peut être transparent. L’espace de re- cherche est alors celui des solutions. Cependant, face à un espace de solutions immense, il est possible de définir un espace de recherche qui soit strictement inclus dans l’espace des solutions. Nous utili- sons donc les informations intentionnelles et contextuelles pour réduire l’espace de recherche selon deux méthodes : la suppression et le ciblage.

La suppression. Nous utilisons les informations disponibles pour éliminer les mauvaises solutions. Pour cela, nous devons éliminer de l’espace de recherche les solutions qui, en fonction des informations disponibles, ne peuvent pas être des solutions satisfaisantes au problème.

En effet, les éléments de l’espace des solutions n’ont pas tous la même qualité vis-à-vis des objectifs de l’architecte. Pour certains de ces éléments, il n’est pas utile de mesurer une quelconque fonction objectif pour voir que cette solution ne conviendra pas. Par exemple, l’élément qui associe chaque classe d’un système à un contour de composants et qui ne contient que des contours de connecteurs vides ne peut pas satisfaire l’architecte, quelque soit le résultat de la fonction objectif.

Nous proposons donc de définir un ensemble de contraintes que doivent vérifier les bonnes solutions. De plus, nous utilisons des contraintes hiérarchiques pour représenter la diversité des sources d’informa- tions et leur pertinence tout aussi diverse.

Le ciblage. Les voisins d’un élément de l’espace des solutions sont déterminés par les opérations utilisées par le processus pour passer d’une solution à une autre. Des opérations simples définissent un voisinage réduit alors que des opérations complexes définissent un voisinage étendu.

Dans le cas d’un voisinage réduit, l’espace des solutions n’est pas uniforme. Il existe dans cet espace des zones qui sont plus ou moins pauvres en solutions correctes. En effet, si la notion de voisinage n’est pas très étendue, il est probable que le passage d’une solution à une autre ne modifie pas beaucoup la qualité. On peut donc supposer que, dans ce cas, le voisinage d’une bonne solution doit contenir plus de solutions intéressantes qu’une autre région de l’espace des solutions prise au hasard.

La méthode de réduction par ciblage utilise cette assertion. Elle vise à cibler une région plus in- téressante de l’espace des solutions. Pour cela, l’exploration débute à partir d’une solution correcte au problème et, dans l’hypothèse d’un voisinage réduit, demeure dans le voisinage de cette bonne solution. Nous proposons donc de définir différentes solutions correspondant à une ou plusieurs sources d’in- formations et représentant une solution satisfaisante.

5.1.4 Modélisations des informations intentionnelles et contextuelles

Les informations, quelles soient intentionnelles ou contextuelles, ne sont pas immédiatement dispo- nibles pour guider notre processus d’extraction d’architectures. Pour résoudre cela, nous proposons deux modèles d’informations qui peuvent être instanciés à partir de la documentation, les recommandations et le contexte de déploiement.

Dans la suite, nous présentons chacun de ces modèles en fonction de la méthode de réduction qu’il permet. Nous montrons également comment il permet de réaliser la réduction. Par contre, nous présen- tons les transformations d’un modèle à l’autre dans la section 5.3.

5.1.4.1 Modèle pour le ciblage

Le ciblage d’un espace de recherche nécessite la définition d’une solution, c’est-à-dire une instance de notre modèle COA (cf. Figure 5.4). Cette solution marque le centre d’un sous-espace de l’espace des solutions qui possède un intérêt particulier du point de vue des informations intentionnelles.

Cependant, les informations disponibles ne sont pas suffisantes pour instancier facilement chaque élément du modèle COA. En effet, nous avons vu que les informations intentionnelles portent principa- lement sur les contours de composants et de configuration. Elles concernent rarement les contours de connecteurs. De plus, les informations contextuelles ne donnent pas d’informations supplémentaires sur les entités du système mais plutôt des contraintes sur les futures entités de l’architecture logicielle. Il est ainsi impossible d’utiliser ces informations pour instancier un quelconque élément du modèle COA. Par conséquent, le contexte ne permet pas de compenser les manques concernant les contours de connecteurs et d’interfaces.

Figure 5.4 – Le modèle de correspondance Objet/Architecture

Ainsi, notre modèle d’informations pour le ciblage est un sous-ensemble du modèle COA. Ce sous- ensemble ne contient pas les entités du modèle pour lesquelles il est difficile d’obtenir des informations de types intentionnelles ou contextuelles : les contours d’interfaces, de connecteurs et de configuration. Notre modèle contient donc uniquement les contours de composants. Nous appelons architecture inten- tionnelle une instance de ce modèle.

Pour cibler une solution à partir d’une instance de ce modèle d’informations, nous devons proposer un ensemble de règles pour transformer cette instance en une instance du modèle COA. Ces règles de trans- formations sont simples. La première consiste à ajouter des contours de connecteurs vides entre chaque contour de composant qui communique à travers un appel de méthodes. La deuxième règle consiste à ajouter à chaque contour de composant, un contour d’interface par contour de connecteur avec, dans l’in- terface, le nom de l’appel de méthode. Enfin, la dernière transformation crée un contour de configuration correspondant à l’ensemble des contours de composants et de connecteurs ainsi que leurs connexions.

5.1.4.2 Modèle pour la suppression

La suppression d’éléments dans l’espace de recherche nécessite la définition d’un ensemble de critères déterminant le choix de l’élément à supprimer ou à conserver. Le respect de ces critères marque la validité d’une solution et entraine sa conservation dans l’espace de recherche. Par contre, le non-respect de ces critères provoque la suppression de l’élément concerné de l’espace de recherche.

Ces critères concernent des entités du modèle COA, objets ou les deux à la fois. En effet, les critères qui sont proposés par l’architecte peuvent concerner des classes (e.g. appartenance au même contour), des contours de composants (e.g. nombre de composants) ou encore les deux à la fois (e.g. taille des contours de connecteurs). Par contre, les critères issus du contexte concernent uniquement les relations entre entités COA et objets (e.g. taille des contours de composants).

Nous modélisons ces critères par un réseau de contraintes. Ainsi, notre modèle d’informations pour la suppression comporte une entité contrainte et trois sous-types :

• les contraintes objets décrivent les critères portant uniquement sur les entités objets ; • les contraintes mixtes décrivent les critères portant à la fois sur les entités COA et objets.

Pour tenir compte des diverses sources d’information, nous proposons de ne pas considérer toutes les contraintes au même niveau. La notion de niveau représente aussi le niveau de confiance ou de pertinencede la source de cette information. Ainsi, le réseau formé par les contraintes de notre modèle est, en fait, un réseau hiérarchique. Chaque contrainte possède donc un attribut reflétant son niveau dans la hiérarchie des contraintes. La résolution de ce réseau implique que les contraintes du niveau maximal soient toutes respectées et que le maximum des contraintes soient respectées dans les niveaux inférieurs.