• Aucun résultat trouvé

CHAPITRE 5 LE MODELE

5.2 M ODELE DU LANGAGE SOURCE

Notre modèle de réutilisation des préoccupations peut être utilisé pour plusieurs langages sour-ces comme le montre la section précédente. Le langage source représente le langage utilisé pour écrire le code source des applications et des préoccupations. Pour lui permettre d’être indépendant du langage source, notre modèle est défini au-dessus d’un modèle MLS générique utilisé pour unifier tous les langages source envisageables.

MLS est composé des entités suivantes : le paquetage, la classe, la méthode, l’attribut, la signa-ture de méthode, la signasigna-ture d’attribut, le corps de méthode, le modificateur de visibilité, et la liste (utilisée comme conteneur pour encapsuler des ensembles d’instances). Nous avons choisi d’utiliser la notion du tableau pour représenter les listes par soucis de visibilité. Ces différentes entités vont être présentées en utilisant le formalisme UML [UML 04].

Notons que MLS est extensible par héritage des entités qui le compose. Par exemple, il est en-visageable de sous-classer Method pour prendre en compte le traitement des assertions du langage Eiffel.

Pour rester concis dans la description des différentes classes de MLS, nous n’allons pas parler des différentes méthodes jouant le rôle d’accesseurs et de modificateurs ; ces dernières étant né-cessaires à la mise en œuvre du modèle.

Figure 14. Diagramme de classes de MLS

La figure 14 présente toutes les classes qui composent MLS. MLS comporte deux principales entités d’encapsulation : la classe et le package. Le détail d’une classe est décomposé en attributs et méthodes. Chacun de ces deux derniers possède une signature (qui correspond à son nom, etc.). La méthode possède aussi un corps qui contient des instructions.

M LS

Class Package

Attribute MethodS ignature Method

MethodBody Instruction VisibilityModifier AttributeS ignature package methods * superClasses * * attributes packages * superPackage 0..1 * 1 1 1 1

5.2.1La classe

La classe représente une des deux principales entités d’encapsulation de MLS. Elle correspond à la notion de classe que l’on trouve dans les langages à objets.

<<Class>> Class - name : String - package : Package - superClasses : Class[*] - methods : Method[*] - attributes : Attribute[*] - visibilityModifier : VisibilityModifier + setName(name : String) + getName() : String + setPackage(package : Package) + getPackage() : Package + setSuperClasses(superClasses : Class[*]) + getSuperClasses() : Class[*] + setMethods(methods : Method[*]) + getMethods() : Method[*] + setAttributes(attributes : Attribute[*]) + getAttributes() : Attribute[*] + setVisibilityModifier(vM : VisibilityModifier) + getVisibilityModifier() : VisibilityModifier + getMethod( method : MethodSignature ) : Method

+ getAttribute( attribute : AttributeSignature ) : Attribute + generateUniqueId(prefix : String) : String

+ clone () : Class

Diagramme 1. La classe Class

Une classe (voir diagramme 1) possède un nom unique dans le paquetage auquel elle appar-tient. Elle contient deux ensembles : un ensemble de méthodes et un ensemble d’attributs. Enfin, elle possède un modificateur de visibilité. Toutes ces variables d’instance nécessitent des acces-seurs et des modificateurs car les opérateurs d’adaptation de notre modèle peuvent modifier cha-cune de ces variables. La méthode getMethod() retourne, si elle existe, la méthode qui possède la signature passée en argument. La méthode getAttribute() fait de même avec les attributs. La méthode generateUniqueId() génère un nouvel identificateur unique (utilisable pour un nom de méthode ou d’attribut) à partir d’un préfixe ; ceci sera utilisé pour masquer des méthodes ou des attributs en changeant leur nom.

5.2.2Le paquetage

Le paquetage est la seconde entité d’encapsulation de MLS, il contient des classes. Un paque-tage peut éventuellement contenir d’autres paquepaque-tages. Les paquepaque-tages sont donc organisés de manière hiérarchique depuis un paquetage spécial (root) qui est la racine de la hiérarchie.

<<Class>> Package - name : String - superPackage : Package - classes : Class [*] - packages : Package [*] + static getRoot(): Package + setName(name : String) + getName() : String + setClasses(classes : Class[*]) + getClasses() : Class[*] + setPackages(packages : Package [*]) + getPackages() : Package [*] + setSuperPackage(package : Package) + getSuperPackage() : Package

Diagramme 2. La classe Package

Un paquetage (voir diagramme 2) possède un nom (unique dans le paquetage auquel il appar-tient), un ensemble de classes, et un ensemble de packages (ses sous-paquetages). Il contient aussi une référence au paquetage qui le contient, et il possède un moyen d’obtenir le paquetage racine (root). Les autres méthodes sont des accesseurs et des modificateurs nécessaires à la mise en œuvre du modèle.

Le paquetage spécial root est un paquetage qui est son propre conteneur. Il représente le pa-quetage par défaut quand aucun papa-quetage n’est spécifié pour une classe.

5.2.3L’attribut

Un attribut représente une variable associée à une classe.

<<Class>> Attribute - class : Class - signature : AttributeSignature + setName(name : String) + getName() : String + setClass(class : Class) + getClass() : Class + setType(type : Class) + getType() : Class + setClassVariable(static : boolean) + getClassVariable() : boolean + setVisibilityModifier(vM : VisibilityModifier) + getVisibilityModifier() : VisibilityModifier + setSignature(signature : Signature) + getSignature() : Signature

Diagramme 3. La classe Attribute

Un attribut (voir diagramme 3) possède une référence vers la classe qui le contient et une autre vers sa signature. La signature d’un attribut (voir section 5.2.4) correspond entre autres au nom de l’attribut, à une référence vers la classe qui représente son type, nous pouvons aussi distinguer si c’est un attribut de classe ou d’instance. La classe Attribute possède aussi des accesseurs et des modificateurs nécessaires à la mise en œuvre du modèle, la plupart correspondent à la signature de l’attribut.

5.2.4La signature d’un attribut

Chaque attribut d’une classe possède une signature qui permet de l’identifier de manière uni-que. <<Class>> AttributeSignature - name : String - type : Class - classVariable : boolean - visibilityModifier : VisibilityModifier + setName(name : String) + getName() : String + setType(type : Class) + getType() : Class

+ setClassVariable (static : boolean) + getClassVariable () : boolean

+ setVisibilityModifier(vM : VisibilityModifier) + getVisibilityModifier() : VisibilityModifier

Diagramme 4. La classe AttributeSignature

La signature d’un attribut (voir diagramme 4) contient tous les éléments permettant de repré-senter l’attribut de manière unique à l’intérieur d’une classe. Il s’agit du nom de l’attribut, d’une référence vers la classe qui représente son type, d’un modificateur de visibilité, et d’une variable booléenne pour différencier les attributs de classe des attributs d’instance.

5.2.5La méthode

La méthode est un message qui peut être envoyé vers une classe pour qu’elle effectue une ac-tion. <<Class>> Method - class : Class - signature : MethodSignature + setName(name : String) + getName() : String + setClass(class : Class) + getClass() : Class + setClassMethod(static : boolean) + getClassMethod() : boolean + setBody(body : MethodBody) + getBody() : MethodBody

+ setParametersName (parametersName: String [*]) + getParametersName () : String [*]

+ setParametersType (parametersType: Class [*]) + getParametersType () : Class [*] + setVisibilityModifier(vM : VisibilityModifier) + getVisibilityModifier() : VisibilityModifier + setSignature(signature : Signature) + getSignature() : Signature + generateSourceCodeMethodCall() : String

Diagramme 5. La classe Method

Une méthode (voir diagramme 5) possède un nom (unique dans l’espace de nom de la classe à laquelle elle appartient). Elle est définie par une référence vers la classe qui la contient, le corps de la méthode, et une signature. La signature d’une méthode (voir section 5.2.6) est caractérisée par un type de retour, un modificateur de visibilité, et les noms et types des paramètres de la mé-thode. La classe Method possède aussi des accesseurs et des modificateurs nécessaires à la mise en œuvre du modèle, la plupart concerne sa signature. La méthode abstraite generate-SourceCodeMethodCall() a vocation à produire une chaîne de caractères utilisable pour faire un appel récursif à la méthode dans le langage source utilisé, elle est utilisée par les adaptations de type fusion (voir section 5.3.4.3).

5.2.6La signature de méthode

La signature d’une méthode représente de manière unique une méthode.

<<Class>> MethodSignature - name : String - classMethod : boolean - parametersName : String [*] - parametersType : Class [*] - returnType : Class - visibilityModifier : VisibilityModifier + setName(name : String) + getName() : String

+ setClassMethod (classMethod : boolean) + getClassMethod () : boolean

+ setParametersName (parametersName: String [*]) + getParametersName () : String [*]

+ setParametersType (parametersType: Class [*]) + getParametersType () : Class [*]

+ setVisibilityModifier(vM : VisibilityModifier) + getVisibilityModifier() : VisibilityModifier

Diagramme 6. La classe MethodSignature

La signature d’une méthode (voir diagramme 6) se caractérise par un nom, un type de retour, un modificateur de visibilité, et les noms et types des paramètres (dont la quantité peut varier de zéro à plusieurs) de la méthode.

5.2.7Le corps de méthode

Le corps d’une méthode est l’ensemble des instructions contenues dans la méthode.

<<Class>>

MethodBody - method : Method

- instructions : Instruction [*]

+ static parseBody(body : string) : Instruction [*] + setMethod(method : Method)

+ getMethod() :Methode

+ setIntructions(instructions : Instruction [*]) + getIntructions() : Instruction [*]

Diagramme 7. La classe MethodBody

Le corps d’une méthode (voir diagramme 7) est caractérisé par une référence vers la méthode associée et une liste d’instructions. La méthode de classe parseBody() permet de construire une liste d’instructions à partir du code source d’un corps de méthode.

Notons que notre modèle ne nécessite pas de description de la classe Instruction car les opérations d’adaptation opérées par notre modèle consistent seulement à ajouter (au début ou à la fin) des instructions à la liste d’instructions d’une méthode.

5.2.8Le modificateur de visibilité

Un modificateur de visibilité peut s’appliquer aux classes, aux méthodes, et aux attributs.

<<Class>>

VisibilityModifier - type : (public,private,protected)

+ setType(type : (public,private,protected)) + getType() : (public,private,protected)

Diagramme 8. La classe VisibilityModifier

Un modificateur de visibilité (voir diagramme 8) peut prendre l’une des trois valeurs suivantes :

public (visible par tout le monde), private (visible uniquement par le conteneur) ou