ch-usecase.tex 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. % vim:spell spelllang=fr
  2. \chapter{Études de cas : illustration et utilisation du langage}
  3. \label{ch:usecase}
  4. %15p
  5. %\ttodo{Ici on donne des cas d'utilisation :
  6. %\begin{itemize}
  7. %\item SimplePDLToPetrinet : exemple jouet que tout le monde connait et qui est
  8. %facile
  9. %\item SysML2Vhdlams ? Family2Person ? Class2Relational ?
  10. %\item autre ?
  11. %\end{itemize}}
  12. %\todo{refaire, il n'y avait pas encore le deuxième cas (aplatissement de
  13. %packages), et l'orga était légèrement différente}
  14. Dans ce chapitre, nous présentons un cas d'étude et expliquons le processus
  15. complet ainsi que son implémentation, depuis les métamodèles jusqu'au code
  16. de la transformation.
  17. Dans la section~\ref{sec:simplepdl2pn}, nous présentons le cas d'étude
  18. \emph{SimplePDLToPetriNet} tandis que dans la section~\ref{sec:aplatissement}
  19. nous présentons le cas de la transformation de l'aplatissement d'une hiérarchie
  20. de classes.
  21. \section{Cas \emph{SimplePDLToPetriNet}}
  22. \label{sec:simplepdl2pn}
  23. Dans cette section, nous présentons la transformation
  24. \emph{SimplePDLToPetriNet} introduite dans les chapitres précédents. Elle a été
  25. présentée et traitée par Benoît Combemale~\cite{combemale08}. Son principe est de
  26. transformer la représentation d'un processus exprimé avec le langage SimplePDL
  27. en sa représentation exprimée dans le formalisme des réseaux de Petri.
  28. L'intérêt de cette transformation dans la communauté est de travailler sur la
  29. vérification : dans le formalisme SimplePDL, il n'est pas possible de vérifier
  30. directement le processus décrit tandis que sous forme de réseau de Petri
  31. ---~qui est un modèle mathématique~---, il est tout à fait possible de
  32. l'utiliser avec un \emph{model-checker} pour en vérifier des propriétés.
  33. %\todo{[nécessaire de définir mathématiquement le réseau de Petri
  34. %(6-uplet places/transitions/arcs/marquage initial/arcs primaires/limite de
  35. %capacité, etc.) ou alors le MM suffira ?]}
  36. %Dans un premier temps, nous rappelons les métamodèles
  37. Nous rappelons d'abord les métamodèles permettant d'exprimer un processus que
  38. nous avons déjà présentés et expliqués précédemment,
  39. %Nous décrivons tout d'abord les métamodèles permettant d'exprimer un processus,
  40. puis nous donnons un exemple de processus décrit en SimplePDL ainsi que sa
  41. version sous forme de réseau de Petri.
  42. \subsection{Métamodèles}
  43. \subsubsection{Métamodèle source : formalisme SimplePDL}
  44. Nous reprenons le métamodèle~\ref{fig:simplesimplepdlmmodel} que nous
  45. complétons afin de pouvoir représenter des processus hiérarchiques. Nous
  46. ajoutons deux relations \emph{opposite} entre les métaclasses
  47. \emph{WorkDefinition} et \emph{Process}, les autres éléments restant identiques. Une \emph{WorkDefinition} peut ainsi
  48. être elle-même définie par un processus imbriqué (référence \emph{process}),
  49. qui conserve un lien vers l'activité qu'il décrit (référence \emph{from}). Nous
  50. obtenons le métamodèle illustré par la figure~\ref{fig:simplepdlmmodel}.
  51. \begin{figure}[h]%[fig:simplepdlmmodel]{Métamodèle SimplePDL.}%[H] %[!h]
  52. \begin{center}
  53. \input{figures/simplepdlmmodel}
  54. \caption{Métamodèle SimplePDL.}
  55. \label{fig:simplepdlmmodel}
  56. \end{center}
  57. \end{figure}
  58. %Le langage SimplePDL dont le métamodèle est donné
  59. %figure~\ref{fig:simplepdlmmodel} permet d'exprimer simplement des processus
  60. %génériques. Un processus (\emph{Process}) est composé d'éléments
  61. %(\emph{ProcessElement}). Chaque \emph{ProcessElement} référence son processus
  62. %\emph{parent} et peut être soit une \emph{WorkDefinition}, soit une
  63. %\emph{WorkSequence}. Une \emph{WorkDefinition} définit une activité qui doit
  64. %être effectuée durant le processus (un calcul, une action, {\etc}). Une
  65. %\emph{WorkSequence} définit quant à elle une relation de dépendance entre deux
  66. %activités. La deuxième (\emph{successor}) peut être démarrée ---~ou
  67. %terminée~--- uniquement lorsque la première (\emph{predecessor}) est déjà
  68. %démarrée ---~ou terminée~--- selon la valeur de l'attribut \emph{linkType} qui
  69. %peut donc prendre quatre valeurs : \emph{startToStart}, \emph{finishToStart},
  70. %\emph{startToFinish} ou \emph{finishToFinish}. Afin de pouvoir représenter des
  71. %processus hiérarchiques, une \emph{WorkDefinition} peut elle-même être définie
  72. %par un processus imbriqué (référence \emph{process}), qui conserve un lien vers
  73. %l'activité qu'il décrit (référence \emph{from}).
  74. \FloatBarrier
  75. \subsubsection{Métamodèle cible : formalisme des réseaux de Petri}
  76. Nous reprenons le métamodèle des réseaux de Petri proposé dans le
  77. chapitre~\ref{ch:traceability}, sans aucune modification additionnelle.
  78. La figure~\ref{fig:petrinetmmodel} est un rappel du métamodèle des réseaux
  79. de Petri que nous utilisons.
  80. %Le métamodèle donné par la figure~\ref{fig:petrinetmmodel} permet d'exprimer
  81. %les réseaux de Petri. Un tel réseau se définit par un ensemble de nœuds
  82. %(\emph{Node}) qui sont soit des places de type \emph{Place}, soit des
  83. %transitions de type \emph{Transition}, ainsi que par des arcs (\emph{Arc}). Un
  84. %arc (orienté) relie deux nœuds de types différents (le réseau de Petri est un
  85. %graphe biparti) et peut être de type \emph{normal} ou \emph{read-arc}. Il
  86. %spécifie le nombre de jetons (\emph{weight} ---~poids~---) consommés dans la
  87. %place source ou produits dans la place cible lorsqu'une transition est tirée. Un
  88. %\emph{read-arc} vérifie uniquement la disponibilité des jetons sans pour autant
  89. %les consommer (test de franchissement). Le marquage d'un réseau de Petri est
  90. %défini par le nombre de jetons dans chaque place (\emph{marking}).
  91. \begin{figure}[h]%[fig:petrinetmmodel]{Métamodèle PetriNet.}%[H] %[!h]
  92. \begin{center}
  93. \input{figures/petrinetmmodel}
  94. \caption{Métamodèle des réseaux de Petri.}
  95. \label{fig:petrinetmmodel}
  96. \end{center}
  97. \end{figure}
  98. \FloatBarrier
  99. \subsection{Exemple de processus et de réseau de Petri résultant}
  100. Nous décidons de traiter l'instance de SimplePDL suivante : le processus
  101. hiérarchique composé d'activités et de contraintes de précédence illustré par
  102. la figure~\ref{fig:simplepdlusecase}.
  103. \begin{figure}[h]
  104. \begin{center}
  105. \input{figures/simplepdlusecase}
  106. \caption{Exemple de processus décrit dans le formalisme SimplePDL.}
  107. \label{fig:simplepdlusecase}
  108. \end{center}
  109. \end{figure}
  110. Dans cet exemple, le processus \texttt{root} est composé de deux activités,
  111. \texttt{A} et \texttt{B}, reliées par une séquence \emph{start2start} notée
  112. \emph{s2s}, ce qui signifie que \texttt{B} peut démarrer uniquement si
  113. \texttt{A} a déjà démarré. \texttt{B} est elle-même décrite par un processus
  114. (\texttt{child}) composé de deux activités, \texttt{C} et \texttt{D} reliées
  115. par une séquence \emph{finish2start} notée \emph{f2s}. Ainsi, \texttt{C} doit
  116. être terminée pour que \texttt{D} puisse démarrer. Ce processus est
  117. conforme au métamodèle SimplePDL donné par la figure~\ref{fig:simplepdlmmodel}.
  118. Notre but est de transformer sa représentation actuelle en sa représentation
  119. sous forme d'un réseau de Petri. La figure~\ref{fig:petrinetusecase} est le
  120. résultat attendu pour cette transformation.
  121. \begin{figure}[h]
  122. \begin{center}
  123. %\begingroup
  124. %\tikzset{every picture/.style={scale=0.9}}%
  125. %\tikzset{global scale/.style={scale=0.9,every node/.style={scale=0.9}}}
  126. %\input{figures/petrinetusecase}
  127. %\scalebox{0.9}{\input{figures/petrinetusecase}}
  128. \resizebox{1.0\linewidth}{!}{\input{figures/petrinetusecase}}
  129. \caption{Réseau de Petri équivalent au processus décrit par la
  130. figure~\ref{fig:simplepdlusecase}.}
  131. \label{fig:petrinetusecase}
  132. %\endgroup
  133. \end{center}
  134. \end{figure}
  135. Dans cette figure ainsi que dans la suite du document, nous représentons les
  136. places par des cercles rouges, et les transitions par des carrés bleus. Les
  137. arcs de type \emph{normal} sont matérialisés par des flèches en trait plein
  138. noires, ou vertes dans le cas du résultat de la transformation d'une
  139. \emph{WorkSequence}. Ceux en pointillés correspondent aux synchronisations
  140. entre éléments, c'est-à-dire aux arcs de type \emph{read\_arc}.
  141. \FloatBarrier
  142. \subsection{Implémentation en utilisant les outils développés}
  143. %\ttodo{décomposition, explication des trois transformations, snippets de code,
  144. %code complet en annexe ; puis version optimale ? Transfos élémentaires : P2PN,
  145. %WD2PN et WS2PN.}
  146. Les métamodèles ainsi qu'un exemple de modèle d'entrée et son résultat attendu
  147. ayant été présentés, détaillons la transformation, ainsi que sa mise en œuvre
  148. avec nos outils. Pour améliorer la lisibilité ---~et donc la compréhension~---,
  149. les extraits de code apparaissant dans cette section sont légèrement simplifiés
  150. par rapport à l'implémentation réelle qui est donnée en
  151. annexe~\ref{annexe:pdl2pn}. Nous avons notamment supprimé certains paramètres
  152. et modifié des noms de variables (ajouts de préfixes $P$ et $WD$ par exemple)
  153. afin d'extraire l'essentiel du code en tâchant d'éviter toute confusion au
  154. lecteur. Nous avons aussi conservé une cohérence entre les schémas et les
  155. extraits de code.
  156. Pour transformer le processus décrit par la figure~\ref{fig:simplepdlusecase},
  157. on peut aisément isoler trois transformations élémentaires qui composent la
  158. transformation globale. Chacune d'entre elles transforme un type d'élément du
  159. modèle source : respectivement \emph{Process2PetriNet},
  160. \emph{WorkDefinition2PetriNet} et \emph{WorkSequence2PetriNet} pour les
  161. éléments \emph{Process}, \emph{WorkDefinition} et \emph{WorkSequence}. Ces
  162. transformations élémentaires sont implémentées par des sous-constructions
  163. \texttt{definition}.
  164. \paragraph{ProcessToPetriNet.} Un \emph{Process} SimplePDL est traduit par un
  165. réseau de Petri de la forme de celui donné par la
  166. figure~\ref{fig:PNProcess}. Cette transformation élémentaire est
  167. implémentée par la \emph{définition} \texttt{P2PN} donnée par le
  168. listing~\ref{code:p2pn}.
  169. \begin{figure}[h]
  170. \begin{center}
  171. \input{figures/PNProcess}
  172. \end{center}
  173. \caption{Réseau de Petri résultant de la transformation d'un \emph{Process}.}
  174. \label{fig:PNProcess}
  175. \end{figure}
  176. L'image d'un processus est donc constituée de trois places ($P_{p_{ready}}$,
  177. $P_{p_{running}}$ et $P_{p_{finished}}$), deux transitions ($P_{t_{start}}$ et
  178. $P_{t_{finish}}$) et quatre arcs. Dans le cas où il s’agit d'un processus
  179. hiérarchique, il peut y avoir un arc de synchronisation pointant vers la
  180. première place ($P_{p_{ready}}$) et un autre partant de la dernière place
  181. ($P_{p_{finished}}$).
  182. Techniquement, nous implémentons cette transformation élémentaire par une
  183. \emph{définition} comprenant une seule règle filtrant tous les éléments
  184. \emph{Process} du modèle source (ligne 2). Dans cette règle, seul le nom du
  185. processus nous importe, nous n'instancions donc que la variable \texttt{name}.
  186. Dans le membre droit de la règle, les places et arcs de l'image d'un
  187. \texttt{Process} sont créés comme tout terme {\tom}, en utilisant la
  188. construction \lex{backquote} (lignes 3 à 5, et 9 à 12). En revanche, pour créer
  189. les deux transitions \texttt{Pt\_start} et \texttt{Pt\_finish}, nous utilisons
  190. la construction \lex{\%tracelink} afin de \emph{tracer} ces deux éléments
  191. (lignes 6 et 7). Notons que ces transitions nouvellement créées et tracées
  192. sont immédiatement utilisées dans la construction des arcs du réseau de Petri.
  193. Le bloc de code des lignes 14 à 23 sert à la gestion des processus
  194. hiérarchiques : dans un tel cas, un processus possède un processus père qui est
  195. une \emph{WorkDefinition} non \texttt{null}, et il existe un traitement
  196. particulier. Il s'agit de créer des éléments \emph{resolve} par la construction
  197. \lex{\%resolve} (lignes 16 et 20) pour jouer le rôle de transitions créées dans
  198. une autre \emph{définition}. En effet, ces deux nœuds sont censés être créés
  199. par la transformation de \emph{WorkDefinitions} en réseaux de Petri. Ils sont
  200. représentés par les deux carrés bleus aux bords pointillés sur la
  201. figure~\ref{fig:PNProcess}. Les deux éléments \emph{resolve} peuvent être
  202. immédiatement utilisés dans la construction d'autres termes (lignes 18 et 22,
  203. arcs en pointillés sur la figure~\ref{fig:PNProcess}) ou avec {\java} (lignes
  204. 17 et 21).
  205. \begin{figure}[h]
  206. \begin{center}
  207. \input{code/defP2PN}
  208. \end{center}
  209. % \caption{\texttt{P2PN :} Code de la définition \emph{ProcessToPetriNet}.}
  210. % \label{code:p2pn}
  211. \end{figure}
  212. \FloatBarrier
  213. \paragraph{WorkDefinitionToPetriNet.} Une \emph{WorkDefinition} SimplePDL est
  214. traduite par un réseau de Petri de la forme de celui donné par la
  215. figure~\ref{fig:PNWorkDefinition}. Cette transformation élémentaire est
  216. implémentée par la \emph{définition} \texttt{WD2PN} donnée dans le
  217. listing~\ref{code:wd2pn}.
  218. \begin{figure}[h]
  219. \begin{center}
  220. \input{figures/PNWorkDefinition}
  221. \end{center}
  222. \caption{Réseau de Petri résultant de la transformation d'une \emph{WorkDefinition}.}
  223. \label{fig:PNWorkDefinition}
  224. \end{figure}
  225. Le réseau de Petri résultant de cette transformation élémentaire ressemble
  226. beaucoup à celui obtenu par transformation d'un \emph{Process}. Il se
  227. différencie par un arc et une place supplémentaires $WD_{p_{started}}$ après
  228. la transition $WD_{t_{start}}$. Ces éléments additionnels par rapport à l'image
  229. d'un \emph{Process} permettent l'ajout d'une séquence entre deux
  230. \emph{WorkDefinitions}. L'image d'une activité est donc constituée de quatre
  231. places ($WD_{p_{ready}}$, $WD_{p_{running}}$ et $WD_{p_{finished}}$,
  232. $WD_{p_{started}}$), deux transitions ($WD_{t_{start}}$ et $WD_{t_{finish}}$)
  233. et cinq arcs. Dans le cas où il s'agit d'un processus hiérarchique, deux arcs
  234. de synchronisation avec le processus parent sont présents : l'un venant de la
  235. transition $P_{t_{start}}$ de l'image du processus parent et pointant sur la
  236. place $WD_{p_{ready}}$, l'autre partant de $WD_{p_{finished}}$ et pointant sur
  237. la transition $P_{t_{finish}}$ de l'image du \emph{Process} parent.
  238. Cette \emph{définition} est implémentée par le bloc \texttt{definition}
  239. \texttt{WD2PN}, comprenant une règle similaire à celle de la \emph{définition}
  240. \texttt{P2PN}, la différence étant que nous filtrons des éléments de type
  241. \emph{WorkDefinition} et non plus \emph{Process} (ligne 2). Les places et les
  242. transitions sont créées grâce à la construction \lex{backquote} (lignes 3 et 5)
  243. ou {\via} \lex{\%tracelink} (lignes 4, 6, 7 et 8). Tous ces termes ---~tracés ou non~--- sont immédiatement
  244. utilisés pour construire les arcs du réseau de Petri résultant (lignes 10 à
  245. 14).
  246. En fin de bloc \texttt{definition} (lignes 16 à 25), les éléments
  247. intermédiaires \emph{resolve} représentés dans la
  248. figure~\ref{fig:PNWorkDefinition} par les deux carrés bleus avec les bords
  249. pointillés sont créés (lignes 19 et 23). Ils sont utilisés respectivement comme
  250. source et destination des arcs de synchronisation avec le processus parent
  251. créés lignes 23 et 27.
  252. \begin{figure}[h]
  253. \begin{center}
  254. \input{code/defWD2PN}
  255. \end{center}
  256. % \caption{\texttt{WD2PN :} Code de la définition \emph{WorkDefinitionToPetriNet}.}
  257. % \label{code:wd2pn}
  258. \end{figure}
  259. Le fait de tracer quatre éléments dans cette \emph{définition} aura pour
  260. conséquence de générer à la compilation une \emph{ReferenceClass} ayant quatre
  261. champs correspondants.
  262. \FloatBarrier
  263. \paragraph{WorkSequenceToPetriNet.} Une \emph{WorkSequence} SimplePDL est
  264. traduite par un réseau de Petri constitué d'un arc, comme illustré par la
  265. figure~\ref{fig:PNWorkSequence}. Cette transformation élémentaire est
  266. implémentée par la \emph{définition} \texttt{WS2PN} donnée par le
  267. listing~\ref{code:ws2pn}.
  268. \begin{figure}[h]
  269. \begin{center}
  270. \input{figures/PNWorkSequence}
  271. \end{center}
  272. \caption{Réseau de Petri résultant de la transformation d'une \emph{WorkSequence}.}
  273. \label{fig:PNWorkSequence}
  274. \end{figure}
  275. Dans cette \emph{définition}, seul un arc est créé à partir de l'élément source
  276. filtré (\emph{WorkSequence}). Cependant, tout arc ayant deux extrémités et ces
  277. deux extrémités étant des éléments obtenus lors de l'application d'autres
  278. transformations élémentaires, il est nécessaire de construire des éléments
  279. \emph{resolve}. Les extrémités de l'arc image dépendent du type de la
  280. \emph{WorkSequence} filtrée. Nous filtrons donc sur \texttt{linkType} (ligne 5)
  281. et, compte tenu des règles écrites et du fait que {\tom} donne toutes les
  282. solutions possibles du filtrage, nous avons la garantie que pour un type de
  283. contrainte de précédence donné, deux règles seront déclenchées (une parmi
  284. celles des lignes 6 et 9, l'autre parmi celles des lignes 13 et 16). Après
  285. exécution de ce bloc, les variables \texttt{source} et \texttt{target} sont
  286. bien initialisées et peuvent être utilisées pour construire l'arc image
  287. \texttt{wsImage} (ligne 23) de la séquence filtrée.
  288. \begin{figure}[h]
  289. \begin{center}
  290. \input{code/defWS2PN}
  291. \end{center}
  292. % \caption{\texttt{WS2PN :} code de la définition \emph{WorkSequenceToPetriNet}.}
  293. % \label{code:ws2pn}
  294. \end{figure}
  295. \FloatBarrier
  296. \paragraph{Transformation globale.}Ces blocs \texttt{definition} s'intègrent
  297. dans une transformation {\tom}+ {\java}
  298. dont la forme générale du code est donnée par le
  299. listing~\ref{code:transfoLightSimplePDL2PN}. Le code complet de la
  300. transformation est quant à lui donné dans l'annexe~\ref{annexe:pdl2pn} et est
  301. directement accessible dans le dépôt du
  302. projet\footnote{\url{https://gforge.inria.fr/scm/?group_id=78}}. Notons que
  303. cette transformation sert aussi de support pour la documentation sur le site
  304. officiel de
  305. {\tom}\footnote{\url{http://tom.loria.fr/wiki/index.php5/Documentation:Playing_with_EMF}}. Expliquons le reste du code de la transformation dans ses grandes lignes :
  306. \begin{itemize}
  307. \item[\textbf{début :}] Les points de suspension de la ligne 1 représentent
  308. du code java classique (\texttt{package} et \texttt{import}).
  309. \item[\textbf{ancrages :}] Au sein de la classe \texttt{SimplePDLToPetriNet},
  310. nous notons l'usage de plusieurs constructions \texttt{\%include}. Celle de
  311. la ligne 3 sert à charger les ancrages formels de la bibliothèque de
  312. stratégies, celle de la ligne 4 charge l'ancrage du modèle de lien (fourni
  313. comme bibliothèque) et celle de la ligne 5 permet de charger les types
  314. {\ecore}, eux aussi fournis sous la forme d'une bibliothèque. Les deux
  315. ancrages chargés lignes 7 et 8 ont été générés par {\tomemf}. Le bloc de
  316. code suivant montre des déclarations de variables et l'écriture d'un
  317. \emph{mapping} minimal permettant d'utiliser la classe
  318. \texttt{SimplePDLToPetriNet} comme un type {\tom}. Les points de suspension
  319. suivants représentent du code {\java} (déclarations de variables, {\etc}).
  320. \item[\textbf{transformation :}] Les trois \emph{définitions} constituent le
  321. corps d'un bloc \texttt{\%transformation} (lignes 18 à 29). Nous avons
  322. choisi de les écrire dans l'ordre dans lequel nous les avons présentées,
  323. cependant nous rappelons que \textbf{cet ordre n'a aucune importance} avec
  324. notre approche.
  325. \item[\textbf{main :}] Nous avons extrait une partie de \texttt{main()}.
  326. Avant l'extrait, il s'agit de contrôles ainsi que du code permettant de
  327. charger un modèle ou créer un modèle en {\tom} dans le cas où aucun fichier
  328. n'est passé en paramètre. L'extrait comprend quant à lui la création de la
  329. stratégie de transformation (ligne 38) ainsi que son appel (ligne 40). La
  330. \emph{stratégie de résolution} est appelée à la ligne 42. Étant générée, son
  331. nom est construit de manière prédictible pour l'utilisateur, à partir du
  332. nom de la transformation ainsi que d'un préfixe explicite
  333. (\texttt{tom\_StratResolve\_}). La stratégie appelée à la ligne 44 sert
  334. pour l'affichage du résultat de la transformation.
  335. \item[\textbf{fin :}] Le reste du code qui n'est pas montré dans le
  336. listing~\ref{code:transfoLightSimplePDL2PN} consiste en des méthodes
  337. d'affichage et de sérialisation pour obtenir un réseau de Petri compatible
  338. avec le format d'entrée du \emph{model-checker}
  339. {\tina}\footnote{\url{http://projects.laas.fr/tina}}~\cite{Berthomieu2004}.
  340. \end{itemize}
  341. \begin{figure}[h]
  342. \begin{center}
  343. \input{code/transfoLightSimplePDL2PN}
  344. \end{center}
  345. % \caption{Forme générale du code de la transformation \emph{SimplePDLToPetriNet}.}
  346. % \label{code:transfoLightSimplePDL2PN}
  347. \end{figure}
  348. \paragraph{Usage de cette transformation.}Cette transformation étant bien
  349. connue, elle nous a servi de support pour le développement de nos outils. Son
  350. intérêt étant de pouvoir vérifier formellement des propriétés de son résultat,
  351. nous avons dépassé le simple développement de la transformation pour vérifier
  352. nos résultats. C'est pour cette raison que le modèle cible est généré par
  353. défaut au format d'entrée de {\tina}. Cela nous permet de le visualiser et d'en
  354. vérifier des propriétés avec le \emph{model-checker}.
  355. Ainsi, nous avons pu exprimer une formule ainsi que des propriétés en logique
  356. temporelle linéaire (LTL) telles que la terminaison. Nous les avons ensuite
  357. vérifiées avec {\tina} sur le réseau de Petri résultant de la transformation.
  358. La formule, les propriétés ainsi que les résultats sont donnés en
  359. annexe~\ref{annexe:pdl2pn:mc} de ce document.
  360. \FloatBarrier
  361. \section{Aplatissement d'une hiérarchie de classes}
  362. \label{sec:aplatissement}
  363. Cette deuxième étude de cas avait pour but d'évaluer l'intérêt et les limites
  364. éventuelles des nouvelles constructions intégrées au langage {\tom}. Il s'agit
  365. d'une transformation endogène très simple : l'aplatissement d'une hiérarchie de
  366. classes. Nous disposons de classes, dont certaines héritent d'autres. Nous
  367. souhaitons aplatir cette hiérarchie en reportant les attributs des surclasses
  368. dans les classes qui sont les feuilles de l'arbre hiérarchique. Nous
  369. choisissons aussi de nommer les nouvelles classes reprenant tous les attributs
  370. hérités. Les classes qui ne sont pas impliquées dans une relation d'héritage ne
  371. changent pas.
  372. %\todo{Cet exemple a été implémenté, quelques remarques :
  373. %\begin{itemize}
  374. % \item implémentations : v1, v2, v3, v4
  375. %% \begin{enumerate}
  376. %% \item version récursive triviale (c'est tout de même en Tom+Java pour des
  377. %% raisons pratiques, mais sans \lex{\%transfo} et avec les mappings EMF)
  378. %% \item version avec une stratégie Tom, adaptation de la version
  379. %% précédente, mini-gain de lisibilité, je fais toujours appel à une
  380. %% fonction récursive écrite précédemment)
  381. %% \item version \lex{\%transfo} : pas intéressante dans le sens où elle est
  382. %% plus compliquée que les versions précédentes. Plus de code, pas de
  383. %% resolve nécessaire
  384. %% \end{enumerate}
  385. % \item Mais ce n'est pas pour autant que l'implémentation a été inutile, elle
  386. % m'a permis de faire plusieurs constats :
  387. % \begin{enumerate}
  388. % \item du point de vue du développeur, actuellement les constructions
  389. % haut-niveau ne sont vraiment utiles que si la transformation est
  390. % suffisamment complexe (comprendre « s'il faut du \emph{resolve} »).
  391. % Sans \emph{resolve}, je déconseille \lex{\%transformation}
  392. % \item Tom-EMF reste utile et intéressant même sans
  393. % \lex{\%transformation}. En fait j'ai peur que ce soit la partie là plus
  394. % utile et intéressante du code lié à ma thèse :$\backslash$ Finalement,
  395. % peut-être qu'il mériterait bien d'être vraiment revu et écrit
  396. % proprement.
  397. % \item Comment trouver de l'intérêt à ces constructions haut-niveau pour
  398. % une transfo peu complexe ? La traçabilité ! C'est un point intéressant
  399. % si j'arrive à l'implémenter.
  400. % \item il y a un gros problème d'implémentation dans mon transformer. Je
  401. % suis tombé sur des erreurs que je pensais
  402. % impossibles/absentes/corrigées.
  403. % \end{enumerate}
  404. %\end{itemize}
  405. %}
  406. Nous présentons un exemple de transformation dans la
  407. section~\ref{flattening:subsec:model} et le métamodèle dans la
  408. section~\ref{flattening:subsec:mm}. Pour évaluer et comparer, nous avons écrit
  409. plusieurs implémentations de cet exemple, que nous décrivons dans la
  410. section~\ref{flattening:subsec:impl}.
  411. \subsection{Exemple de transformation}
  412. \label{flattening:subsec:model}
  413. Nous considérons comme modèle source la hiérarchie de classes donnée par le
  414. membre gauche de la figure~\ref{fig:transfohierarchieclasses}. La classe
  415. \emph{C} possède un attribut \emph{attrC} de type \emph{C} et n'est dans aucune
  416. hiérarchie de classes. La classe \emph{B} est quant à elle dans une hiérarchie
  417. de classes : elle hérite de \emph{A} qui hérite elle-même de \emph{D},
  418. surclasse de toute la hiérarchie. La classe \emph{B} a deux attributs
  419. \emph{attrB1} et \emph{attrB2} de types \emph{C}. Cette transformation aplatit
  420. la hiérarchie et doit donc produire le modèle cible illustré par le membre
  421. droit de la figure~\ref{fig:transfohierarchieclasses}. Il s'agit d'un modèle
  422. constitué de deux classes : la classe \emph{C} ---~qui reste inchangée par
  423. rapport au modèle source~--- ainsi qu'une classe \emph{DAB} qui rassemble tous
  424. les attributs de la hiérarchie de classe aplatie.
  425. %figure~\ref{fig:hierarchieclassesIN}.
  426. %\begin{figure}[!h]
  427. % \begin{center}
  428. % \input{figures/hierarchieclassesIN}
  429. % \caption{Hiérarchie de classes.}
  430. % \label{fig:hierarchieclassesIN}
  431. % \end{center}
  432. %\end{figure}
  433. %
  434. %\begin{figure}[!h]
  435. % \begin{center}
  436. % \input{figures/hierarchieclassesOUT}
  437. % \caption{Hiérarchie de classes aplatie.}
  438. % \label{fig:hierarchieclassesOUT}
  439. % \end{center}
  440. %\end{figure}
  441. \begin{figure}[h]
  442. \begin{center}
  443. \begin{tabular}{m{0.4\linewidth}m{0.1\linewidth}m{0.4\linewidth}}
  444. \input{figures/hierarchieclassesIN} & \textbf{$\longrightarrow$} &
  445. \input{figures/hierarchieclassesOUT}\\
  446. \centering{(a)} && \centering{(b)}\\
  447. \end{tabular}
  448. \caption{Aplatissement d'une hiérarchie de classes.}
  449. \label{fig:transfohierarchieclasses}
  450. \end{center}
  451. \end{figure}
  452. \FloatBarrier
  453. \subsection{Métamodèle}
  454. \label{flattening:subsec:mm}
  455. S'agissant d'une transformation endogène, le métamodèle source est identique au
  456. métamodèle cible. Pour cette transformation, nous utilisons le métamodèle
  457. simplifié d'{\uml} donné par la figure~\ref{fig:simplifiedumlmmodel}.
  458. \begin{figure}[h]
  459. \begin{center}
  460. \input{figures/simplifiedumlmmodel}
  461. \caption{Métamodèle d'{\uml} simplifié.}
  462. \label{fig:simplifiedumlmmodel}
  463. \end{center}
  464. \end{figure}
  465. Les \emph{Classifiers} sont des éléments ayant un nom et étant de type
  466. \emph{DataType} ou de type \emph{Class}. Un élément \emph{Class} peut avoir des
  467. attributs (\emph{Attribute}), qui sont eux-mêmes des \emph{Classifiers}. Dans
  468. notre contexte technique, nous avons besoin d'une racine afin d'obtenir un
  469. arbre de recouvrement. Nous avons donc ajouté une racine virtuelle dans le
  470. métamodèle ---~élément \emph{VirtualRoot}~--- qui contient tous les
  471. \emph{Classifiers} (relation de composition).
  472. Pour les besoins de l'étude et afin de simplifier les explications et le
  473. développement, nous avons considéré une version épurée du métamodèle
  474. %extrait l'essentiel du métamodèle ce qui le réduit au métamodèle
  475. illustré par la figure~\ref{fig:verysimplifiedumlmmodel}.% : dans ce
  476. %métamodèle, nous supprimons \emph{Classifier} et \emph{DataType}, nous obtenons
  477. %un métamodèle minimaliste suffisant pour notre exposé.
  478. %Il s'agit du métamodèle minimal pour notre exposé.
  479. %\todo{insert MM flatening.ecore}
  480. \begin{figure}[h]
  481. \begin{center}
  482. \input{figures/verysimplifiedumlmmodel}
  483. \caption{Métamodèle considéré pour l'étude de cas.}
  484. \label{fig:verysimplifiedumlmmodel}
  485. \end{center}
  486. \end{figure}
  487. \FloatBarrier
  488. \subsection{Implémentation utilisant les outils développés}
  489. \label{flattening:subsec:impl}
  490. %\todo{Comparaison : Java récursif (avec un peu de Tom), Tom+Java stratégie +
  491. %récursion, Tom+Java \lex{\%transformation} $\rightarrow$ ok}
  492. Nous avons implémenté cet exemple de plusieurs manières afin de comparer
  493. l'intérêt d'utiliser les outils développés durant cette thèse pour la
  494. transformation de modèles :
  495. \begin{enumerate}
  496. %V1_notom_UMLClassesFlattening.java
  497. \item La première version de cette implémentation est écrite en pur {\java}
  498. (+{\emf}), sans l'aide de {\tom}, des nouvelles constructions et des outils
  499. liés tels que {\tomemf}. Il s'agit d'une version mêlant récursivité et
  500. itération ;
  501. %V2_nostrat_UMLClassesFlattening.t
  502. \item la deuxième version est écrite en {\tomjava} mais sans user des
  503. stratégies ni de la nouvelle construction \lex{\%transformation}. En
  504. revanche, nous avons utilisé {\tomemf} pour générer les \emph{mappings} ;
  505. %V3_stratnotransfo_UMLClassesFlattening.t
  506. \item la troisième implémentation est une application de la méthode présentée
  507. dans~\cite{Bach2012}, à savoir l'écriture d'une transformation en utilisant
  508. les stratégies de réécriture, mais sans la construction haut niveau
  509. \lex{\%transformation} ;
  510. %V4_transfo_UMLClassesFlattening.t
  511. \item la quatrième et dernière version utilise les outils développés dans le
  512. cadre de cette thèse.
  513. \end{enumerate}
  514. Pour des raisons de lisibilité, nous faisons uniquement apparaître des extraits
  515. significatifs de code de cette transformation dans cette section. Le code
  516. complet des implémentations est donné dans l'annexe~\ref{annexe:flattening}.
  517. %\begin{description}
  518. % \item[Version 0 :] transformation en Java EMF pur, de manière récursive
  519. % \item[Version 1 :] intégration d'un peu de code Tom (\emph{mappings} et
  520. % \lex{\%match})
  521. % \item[Version 2 :] utilisation d'une stratégie Tom en plus du code Tom de la
  522. % version précédente
  523. % \item[Version 3 :] utilisation de la construction dédiée aux transformations
  524. % de modèles \lex{\%transformation}
  525. %\end{description}
  526. \paragraph{Version 1 : {\java-\emf}.}
  527. L'implémentation en {\java}-{\emf} d'une telle transformation se révèle sans
  528. véritable difficulté. Le principe est de parcourir les classes du modèle source
  529. et d'appliquer un aplatissement récursif sur celles qui sont les feuilles de
  530. l'arbre d'héritage. Cette transformation peut être implémentée en environ 40
  531. lignes de code, comme le montre le listing~\ref{code:v1flattening} (code
  532. complet en annexe~\ref{annexe:flattening:v1}).
  533. \begin{figure}[h]
  534. \begin{center}
  535. \input{code/v1flattening}
  536. \end{center}
  537. % \caption{Implémentation de la transformation d'aplatissement de hiérarchie de classes en Java.}
  538. % \label{code:v1flattening}
  539. \end{figure}
  540. Les pré-requis pour cette version de la transformation sont de maîtriser
  541. {\java} et de connaître un minimum {\emf} afin d'être en mesure d'écrire les
  542. appels adéquats pour créer un élément. Un défaut de cette implémentation est la
  543. lisibilité du code, le langage {\java} ainsi que le \emph{framework} {\emf}
  544. étant particulièrement verbeux.
  545. \paragraph{Version 2 : {\tomjava-\emf}.}
  546. Pour remédier à ce désagrément ---~qui peut devenir un enjeu fort dans le cadre
  547. de la maintenance logicielle industrielle~--- nous avons modifié
  548. l'implémentation initiale avec {\tom}, afin d'user de ses facilités d'écriture.
  549. L'utilisation de la construction \lex{\%match} (filtrage de motif) ainsi que du
  550. \emph{backquote} (création et manipulation de termes) permettent notamment
  551. d'améliorer la lisibilité du programme. Le listing~\ref{code:v2flattening} est
  552. le code résultant de l'évolution du précédent listing, intégrant du code {\tom}
  553. simple (le code complet est donné dans l'annexe~\ref{annexe:flattening:v2}).
  554. \begin{figure}[h]
  555. \begin{center}
  556. \input{code/v2flattening}
  557. \end{center}
  558. % \caption{Implémentation de la transformation d'aplatissement de hiérarchie de classes en Tom+Java.}
  559. % \label{code:v2flattening}
  560. \end{figure}
  561. Cet extrait de code est plus concis que la version en pur {\java} et
  562. {\emf} (moins de 25 lignes pour la transformation elle-même), mais il est
  563. surtout plus lisible. Pour utiliser la construction \lex{backquote} (\lex{`})
  564. comme nous le faisons dans ce listing, des ancrages algébriques sont
  565. nécessaires. Nous avons bien évidemment utilisé notre générateur d'ancrages
  566. formels {\tomemf} plutôt que de les écrire manuellement. L'utilisateur n'a
  567. donc pas de travail additionnel à fournir par rapport à une transformation en
  568. pur {\java} et {\emf} autre que la commande de génération (dans la précédente
  569. version, l'utilisateur doit aussi écrire le métamodèle et générer le code
  570. {\emf} avec {\eclipse}).
  571. %\todo{(implémentation Tom+Java \%strategy)}
  572. \paragraph{Version 3 : {\tomjava-\emf} avec stratégies.}
  573. Les stratégies étant un aspect important de {\tom}, nous écrivons une autre
  574. version de cette transformation les utilisant. C'est l'occasion de mettre en
  575. œuvre la méthode présentée dans~\cite{Bach2012}. Dans cette nouvelle
  576. implémentation (extrait dans le listing~\ref{code:v3flattening}, code complet
  577. en annexe~\ref{annexe:flattening:v3}), nous utilisons toujours les ancrages
  578. algébriques générés par {\tomemf} et nous ajoutons une stratégie {\tom}.
  579. L'usage des stratégies avec des modèles {\emf \ecore} implique aussi
  580. l'utilisation de l'outil \emph{EcoreContainmentIntrospector} présenté
  581. dans~\ref{ch:outils:subsec:tomemf}. Pour rappel, il permet le parcours des
  582. modèles {\emf \ecore} vus sous leur forme de termes.
  583. \begin{figure}[h]
  584. \begin{center}
  585. \input{code/v3flattening}
  586. \end{center}
  587. % \caption{Version 3 : Implémentation de la transformation d'aplatissement de hiérarchie de classes en Tom+Java avec stratégies.}
  588. % \label{code:v3flattening}
  589. \end{figure}
  590. Habituellement, l'utilisation des stratégies {\tom} simplifie systématiquement
  591. et grandement l'écriture de code ainsi que sa lisibilité, le parcours
  592. ---~traité par les bibliothèques que nous fournissons~--- étant séparé du
  593. traitement. Cependant, après écriture et exécution de la transformation, nous
  594. nous apercevons que la transformation n'est ni véritablement plus courte, ni
  595. plus lisible, ni plus efficace que les implémentations précédentes.
  596. C'est en observant plus précisément le métamodèle de notre exemple, la
  597. transformation attendue ainsi que l'outil permettant l'utilisation des
  598. stratégies que l'on identifie la raison. Un modèle {\emf} a une racine unique
  599. par la relation de composition et peut donc être représenté sous la forme d'un
  600. arbre, comme nous le faisons dans {\tom}. La figure~\ref{fig:treeexamples}
  601. illustre ce mécanisme appliqué aux modèles sources des deux exemples que nous
  602. présentons dans ce chapitre.
  603. %\begin{figure}[h!]
  604. % \begin{center}
  605. % \begin{tabular}{m{0.45\linewidth}m{0.45\linewidth}}
  606. % \input{figures/treeexample1} & \input{figures/treeexample2} \\
  607. % \centering{(a)} & \centering{(b)} \\
  608. % \end{tabular}
  609. % \caption{Arbres représentant les modèles source des exemples
  610. % \emph{SimplePDLToPetriNet} (a) et \emph{ClassFlattening} (b).}
  611. % \label{fig:treeexamples}
  612. % \end{center}
  613. %\end{figure}
  614. \begin{figure}[!h]
  615. \begin{center}
  616. %\begin{subfigure}[]{0.45\textwidth}
  617. \begin{subfigure}{0.45\linewidth}
  618. \input{figures/treeexample1}
  619. %\caption{Arbre représentant le modèle source de l'exemple \emph{SimplePDLToPetriNet}.}
  620. \caption{\emph{SimplePDLToPetriNet}.}
  621. \label{fig:treeexample1}
  622. \end{subfigure}
  623. \qquad %\qquad
  624. \begin{subfigure}{0.45\linewidth}
  625. \input{figures/treeexample2}
  626. %\caption{Arbre représentant le modèle source de l'exemple \emph{ClassFlattening}.}
  627. \caption{\emph{ClassFlattening}.}
  628. \label{fig:treeexample2}
  629. \end{subfigure}
  630. \caption{Arbres représentant les modèles source des exemples \emph{SimplePDLToPetriNet} (a) et \emph{ClassFlattening} (b).}
  631. \label{fig:treeexamples}
  632. \end{center}
  633. \end{figure}
  634. Dans cette figure, les deux termes sont représentés de manière classique : la
  635. racine est en haut, les feuilles en bas. Un losange noir ---~le symbole de la
  636. relation de composition en modélisation~--- a été ajouté à chaque endroit où la
  637. relation est une relation de composition, c'est-à-dire à chaque relation
  638. père-fils. L'arbre est bien un arbre par la relation de composition.
  639. Si l'on examine la figure~\ref{fig:treeexample1}, nous nous apercevons que les
  640. relations de sa structure correspondent à celles qui nous intéressent dans
  641. l'exemple, à savoir les relations de composition. En revanche, dans le cas de
  642. l'exemple de l'aplatissement d'une hiérarchie de classes, la relation entre
  643. éléments qui nous intéresse véritablement est la relation d'héritage, modélisée
  644. par une relation bidirectionnelle \emph{subclass}--\emph{superclass} et non par
  645. une relation de composition. Nous représentons ces relations \og intéressantes
  646. \fg dans la figure~\ref{fig:treeexample2} par des flèches rouges. La seule
  647. relation de composition de cet exemple est une relation de composition
  648. artificielle que nous avons créée (ainsi que l'élément de type
  649. \emph{VirtualRoot}) afin d'avoir une racine et donc de pouvoir écrire ce modèle
  650. {\emf} {\ecore}. Notre outil \emph{EcoreContainmentIntrospector} descendra
  651. bien dans les arbres, mais dans le cas du second exemple, il ne servira qu'à
  652. obtenir tous les fils de cette racine virtuelle qui sont à plat. Ensuite, pour
  653. l'aplatissement en lui-même, nous faisons tout de même appel à une fonction
  654. \texttt{flattening()} récursive, que nous utilisions ou non des stratégies.
  655. %\todo{(implémentation Tom+Java \%transformation)}
  656. Passé ce constat, la dernière version de l'implémentation reposant elle aussi
  657. sur les stratégies de réécriture mais avec les nouvelles constructions, nous
  658. pouvons supposer qu'elle ne sera pas meilleure (plus lisible, plus concise et
  659. plus efficace). Nous constatons effectivement que l'implémentation est moins
  660. lisible et moins concise, avec une efficacité similaire. Différents facteurs
  661. permettent d'expliquer ce résultat : d'une part, comme pour la version
  662. précédente, les relations nous intéressant ne sont pas celles constituant
  663. l'arbre de recouvrement, d'autre part, cette transformation est trop simple pour
  664. tirer parti de nos outils. Expliquons plus en détail cet aspect. Dans cette
  665. transformation, nous ne pouvons extraire plusieurs transformations
  666. élémentaires. La transformation globale sera donc constituée d'une seule
  667. \emph{définition}, encodée par une stratégie de réécriture, comme dans la
  668. version précédente de l'implémentation. Ainsi, le gain habituellement apporté
  669. par la construction \lex{\%transformation} est complètement absent. Outre ce
  670. point, nous constatons qu'aucun élément en cours de transformation
  671. ne nécessite le résultat d'un autre élément devant être transformé. Il n'y a
  672. donc pas besoin d'introduire d'élément \emph{resolve} dans la transformation.
  673. L'un des apports de nos outils étant de gérer l'ordonnancement des pas
  674. d'exécution en générant une stratégie de résolution, son intérêt reste limité
  675. pour cette transformation.
  676. Finalement, nous pouvons donc déduire de cet exemple que nos outils ne sont pas
  677. pleinement adaptés à toutes les transformations. Dans ces quatre
  678. implémentations, la deuxième version semble être le compromis le plus
  679. judicieux. Le générateur de \emph{mappings} y joue un rôle majeur, nous
  680. utilisons une partie du langage {\tom}, en revanche nous nous passons des
  681. constructions plus complexes telles que les stratégies ainsi que les nouvelles
  682. constructions intégrées durant cette thèse. Cependant, les nouvelles
  683. constructions pour de tels exemples ne sont pas pour autant inintéressantes :
  684. en effet, si la résolution (et sa construction associée \lex{\%resolve})
  685. n'apporte pas de gain, il subsiste le second aspect de nos travaux, à savoir la
  686. traçabilité. L'utilisation de la construction \lex{\%tracelink} afin de générer
  687. un modèle de lien reste possible.
  688. Une autre conclusion de l'étude de cet exemple est que nous avons
  689. développé nos outils en visant la couverture d'un grand nombre de
  690. transformations, notamment celles où les relations de composition sont au cœur.
  691. Une perspective serait maintenant de travailler à l'élaboration d'outils gérant
  692. d'autres relations ou étant plus génériques. Nous pensons notamment à des
  693. stratégies de réécriture que nous pourrions paramétrer par des types de
  694. relations à suivre.
  695. %point, nous constatons que cette transformation ne nécessite pas du tout
  696. %d'éléments \emph{resolve}. En effet, aucun élément en cours de transformation
  697. \section{Synthèse}
  698. Dans ce chapitre, nous avons présenté deux cas d'étude pour deux objectifs
  699. distincts : \emph{SimplePDLToPetriNet} et \emph{UMLHierarchyFlattening}. La
  700. transformation \emph{SimplePDLToPetriNet} nous a permis de présenter
  701. l'utilisation des outils que nous avons développés durant cette thèse en
  702. déroulant complètement une transformation. La seconde étude de cas nous a
  703. permis de donner une première évaluation de nos outils dans un contexte où ils
  704. ne peuvent donner leur pleine mesure.
  705. L'objectif de cette seconde étude de cas était de repérer les points
  706. d'amélioration de nos outils, tant dans leur mise en œuvre actuelle
  707. qu'envisagée, et de nous donner de nouvelles perspectives techniques et
  708. scientifiques. En effet, si cette étude de cas nous a montré que nos outils
  709. n'étaient pas tous adaptés dans toutes les situations, elle nous a permis en
  710. revanche de relever un point intéressant. La relation de composition dans les
  711. modèles est centrale et se retrouve bien souvent au cœur des transformations de
  712. modèles. Dans notre contexte, elle nous permet d'avoir la vision arborescente
  713. des modèles que nous pouvons parcourir. Cependant, pour certaines
  714. transformations comme celle d'aplatissement d'une hiérarchie de classes, la
  715. relation d'intérêt n'est pas celle de composition. Partant de ce constat, il
  716. est intéressant de se poser la question de la généralisation des stratégies
  717. pour les transformations de modèles. Une piste est la paramétrisation des
  718. stratégies par le type de relation à suivre lors de la traversée des termes.
  719. Dans un premier temps, pour tester la validité de ce principe, on pourrait
  720. implémenter un \emph{introspecteur} dédié à d'autres types de relations
  721. (héritage notamment). Cette extension lèverait la limitation révélée par la
  722. seconde étude de cas. Ensuite, une seconde question d'intérêt serait de
  723. travailler sur la possibilité de paramétrer dynamiquement une stratégie :
  724. est-il possible de changer le type de lien à suivre en cours de parcours ? %,
  725. %et donc de changer de
  726. %stratégie de réécriture selon le contexte ? cas d'application : réécriture
  727. %conditionnelle Un cas d'application serait alors la réécriture con
  728. Ce type de mécanisme permettrait de déclencher localement une stratégie avec un
  729. autre type de parcours, et donc d'adopter une stratégie de réécriture en
  730. fonction du contexte.
  731. Le premier exemple nous a aussi servi de support pour le développement de nos
  732. outils, et notre confiance en notre implémentation de cette transformation
  733. étant forte, nous nous en sommes aussi servi pour mener des expériences que
  734. nous présentons dans le chapitre suivant.%~\ref{ch:evaluation}.
  735. % vim:spell spelllang=fr