3.2 Opérateurs de mutation dédiés aux transformations de modèles
3.2.1 Opérateurs de mutation concernant la navigation:
a- Remplacement d’une relation vers une même classe (RRMC) :
Cet opérateur remplace la navigation d’une relation vers une classe par la navigation d’une autre relation vers la même classe.
RRMC : Si la transformation comporte une opération de navigation d’une relation φ définie de
la classe X à la classe Y et s’il existe une autre relation σ entre X et Y alors la navigation de φ est remplacée par la navigation de σ. Tous les remplacements possibles sont effectués, chacun créant un mutant.
Par exemple, si uneClass, uneAssoc, et uneTable sont respectivement des instances de
Class, de Association, et de Table :
Opération de navigation originale Opération de navigation mutante
uneClass.parent uneClass.src uneClass.children uneClass.parent uneAssoc.dest uneAssoc.src uneTable.pkey uneTable.cols
Tableau 3-1- Exemples d'application de RRMC
La navigation d’une mauvaise relation définie vers la même classe peut avoir différentes conséquences en fonction de la cardinalité des relations (celle naviguée par le mutant et celle
qui aurait dû l’être). Le remplacement de uneClass.parent par uneClass.children
conduit à une différence de cardinalité puisque la navigation de la relation parent renvoie une seule instance de Class alors que la navigation de children renvoie un ensemble d’instance de Class. Selon l’opération qui sera appliquée sur le résultat de cette navigation et selon le langage d’implantation utilisé, la différence de cardinalité peut bloquer la suite de la transformation et être mise en évidence à l’exécution sans attendre que l’oracle compare les résultats de la transformation et du mutant. Par contre le remplacement de uneTable.pkey par
uneTable.cols conduit à une erreur pertinente : les deux retournant une collection d’instances de Column. C’est aussi le cas pour uneAssoc.src qui comme uneAssoc.dest retourne une instance de Class. Si ces fautes étaient commises par le développeur, elles ne seraient pas systématiquement révélées pendant la mise au point du programme car le reste de la transformation n’est pas affecté.
b- Remplacement d’une relation vers une autre classe (RRAC) :
Cet opérateur remplace la navigation d’une association vers une classe par la navigation d’une autre association vers une autre classe.
RRAC : Si la transformation comporte une opération de navigation d’une relation φ définie de
la classe X à la classe Y et s’il existe une relation σ entre X et une classe Z différente de Y alors la navigation de φ est remplacée par la navigation de σ. Tous les remplacements possibles sont effectués, chacun créant un mutant.
Par exemple, si uneClass et uneTable sont respectivement des instances de Class et de
Table :
Opération de navigation originale Opération de navigation mutante
uneClass.children uneClass.attrs uneClass.parent uneClass.attrs uneTable.pkey uneTable.fkeys
Tableau 3-2- Exemples d'application de RRAC
La navigation incorrecte d’une relation définie vers une autre classe peut avoir des conséquences plus importantes que celle vers une même classe (RRMC). En effet, les objets retournés par les opérations originales et mutantes sont des instances de classes de types différents. Ainsi il est plus complexe pour la transformation de poursuivre si les traitements effectués sur les objets résultants de la navigation sont spécifiques à leur type. Cependant, les classes définies dans les méta-modèles peuvent avoir des attributs identiques. C’est le cas du premier exemple puisque les classes Class et Attribute ont le même attribut name. Ces cas sont fréquents si les classes appartiennent au même arbre d’héritage. Dans ce cas elles héritent des mêmes propriétés et des mêmes méthodes dont le comportement peut changer en étant redéfini. Dans ces différents cas, cet opérateur est pertinent en ne bloquant pas l’exécution des opérations qui suivraient l’opération mutée. Nous retrouvons cependant comme précédemment (RRMC) les préoccupations de différences de cardinalités des relations naviguées.
57 Opérateurs de mutation dédiés aux transformations de modèles
c- Modification d’une succession de navigation avec manque (MSNM) :
Pendant la navigation, la transformation peut naviguer successivement plusieurs relations. Cet opérateur supprime la dernière étape d’une navigation composée.
MSNM : Si la transformation comporte une succession d’opérations de navigation non
interrompue par une opération d’un autre type alors la dernière opération de navigation est retirée. Tous les retraits possibles sont effectués, chacun créant un mutant.
Par exemple, si uneAssoc est une instance de Association : Succession originale d’opérations de
navigation
Succession mutante d’opérations de navigation
uneAssoc.dest.parent uneAssoc.dest uneAsso.dest.attrs.type uneAsso.dest.attrs
Tableau 3-3- Exemples d'application de MSNM
Cet opérateur conduit aux mêmes cas de figure que l’opérateur RRAC, ce qui justifie sa pertinence.
d- Modification d’une succession de navigation avec ajout (MSNA) :
Cet opérateur réalise le contraire de MSNM, il ajoute une étape à une navigation déjà composée d’une ou plusieurs opérations de navigation ininterrompues.
MSNA : Si la transformation comporte une opération de navigation ou une succession
d’opérations de navigation non interrompue par une autre sorte d’opération, si la dernière opération de navigation renvoie des instances d’une classe X, s’il existe une relation σ définie sortante de X, alors une opération de navigation naviguant σ est ajoutée. Tous les ajouts possibles sont effectués, chacun créant un mutant, produisant autant de mutant que de relation sortant de X.
Par exemple, si uneAssoc et uneClass sont des instances de Association et de Class : Opération ou succession originale
d’opérations de navigation
Succession mutante d’opérations de navigation uneAssoc.dest.children uneAssoc.dest.parent uneAssoc.dest uneAssoc.dest.attrs uneClass.parent.attrs uneClass.parent.attrs.type
Tableau 3-4- Exemples d'application de MSNA
La pertinence de cet opérateur est justifiée car il conduit aux mêmes cas que RRAC.