Skip navigation

Salut à toutes et à tous,

Ce petit billet pour vous introduire à la transformation de modèle à modèle.

D’abord concernant le titre, une génération de code depuis un modèle est une autre sorte de transformation.

Il y a deux sortes de transformations à la base des modèles : transformation de modèle à modèle et transformation de modèle à texte.

Concernant le texte, il y a aussi des transformations possibles (à l’aide de l’outil ANTLR, notamment) : transformation de code à modèle et transformation de code à code.

Il est très utile de savoir manier les deux pour créer un outil intégrant la notion de « round-trip model-code », permettant à l’utilisateur de réaliser des modifications en n’importe quel point de ses artefacts et de les répercuter là ou nécessaire : on modifie le code brut, on veut modifier le modèle en conséquence; on modifie le modèle, on veut modifier le code en conséquence. Tout ça au sein d’un même outil ! Oui c’est ça le futur du développement logiciel LIBRE et GRATUIT ! C’est déjà en route, et depuis de nombreuses années, notamment gràce à Eclipse et ANTLR (qui est du reste LE meilleur outil de création de logiciels de syntax parsing à l’aide de grammaire).

Revenons-en à nos mêêêêêêh :

Nous allons ici nous asseoir sur le modéleur graphique de modèle eCore fourni avec les Ecore Tools (plug-in Eclipse) pour pouvoir modéliser des modèles sfDoctrine. En effet, et de manière simple, nous pouvons réaliser un « mapping » ou une « corrélation » entre ces deux univers.

Une EClass peut être vu comme une Class. Un Attribut peut être vu comme une Column et une Relation peut être vu comme une Relation. Bizarre ? Non, il en est ainsi dans TOUS les domaines : c’est l’analogie. Faire des analogies, c’est ça ! C’est « relativiser » aussi, car une chose distincte en un endroit peut être abstraite en un autre endroit !

Pour que ça marche, il faut réaliser un « launcher », comme dit dans le dernier billet, je vous laisse découvrir par vous même comment réaliser des launchers pour exécuter tout ça, ça vous mettra dans le bain ! Pour les autres, qui ne voudront prendre le temps, ça effectuera un trie séléctif quant à votre intuition sur ces phénomènes. Si vous sentez que c’est une bonne chose qui va dans le bon sens, n’attendez pas : FONCEZ !

Voici donc un script simple et assez idiot qui permet de transformer un Ecore!EPackage (comprendre un EPackage du méta-modèle ECore) en un sfDoctrine!Model (je vous laisse ;-) :

rule ePackage2Model
transform i : ecore!EPackage
to o : sfDoctrine!Model {

o.name = i.name;

if(i.eClassifiers.isDefined() and i.eClassifiers.size()>0){
for( eclass in i.eClassifiers.select(e|e.isTypeOf(EClass)) ){
var class = sfDoctrine!Class.createInstance();
class.name = eclass.name;
o.defines.add(class);
}
}

}

Comme dit plus haut, c’est simple et idiot, car il n’y a pas de gardes-fous, il n’y a pas d’abstraction, il n’y a pas de création des colonnes ni des relations, bref, c’est simple voir tordu ! Mais c’est pour vous donner le squelette d’application du bouzin, pas pour vous mâcher le travail !

Le mâchage se fait par l’implémentation que je réalise d’outils pour Symfony, sfDoctrine, etc. Non que s’en soit assez, c’est juste énorme comme boulot pour un seul homme ! Bien sûr, il y a bien plus gros ! :-)

Je ne suis pas là pour vous faire un cours en profondeur, seul vous le pouvez ! Il y a pour ça de nombreux outils à votre disposition : livre (EpsilonBook disponible sur http://eclipse.org/gmt/epsilon), les newsgroups, etc. Cependant, si vous êtes dans cette perspective, je peux vous aider, comme Dimitris du reste (sur les newsgroups accessibles depuis la page d’accueil d’Epsilon !).

Le plus important reste de bien comprendre les choses mises en jeu, le reste n’est que formalisation (comment écrire une règle de transformation, comment en faire une abstraction et ce qui en découle en terme d’implémentation, etc).

J’arrête donc là les petits tutoriaux de mise en perspective de ces outils pour revenir vers ce qui m’est le plus important dans ce domaine qu’est mon métier : réaliser tout l’outillage nécessaire pour pouvoir réaliser des applications web à l’aide du cadre applicatif Symfony et de son plug-in sfDoctrine au travers de modèles par leur transformation en code.

Pour ceux qui connaissent Symfony, cela implique de réaliser tous les générateurs (symfony generate:project, generate:app, generate:module, etc), car je ne peux me contenter de générer un simple script du genre « php symfony generate:app $arg1 $arg2 $arg3″ car je n’aurai alors aucune visibilité en terme de modulation de toute la profondeur que permet Symfony (en terme de configurabilité, etc) réalisé sur un modèle, donc pas de vérificabilité, pas de tracabilité, rien. Réduisant le projet à un mini-tool particulier alors qu’il se veut être plus englobant.

Plus englobant, oui, parce qu’au travers de la technologie EMF, tous les méta-modèles peuvent se lier les uns aux autres, même si ce n’est pas encore réalisé.

Par exemple, de manière abstraite, Apache défini un modèle, un langage, qui est réalisé de différentes manières : httpd.conf, etc. Cela peut aussi changer selon les systèmes d’exploitation, qu’il y ait des nécessités de configuration particulières.

Bref, il faut donc pouvoir lier les problèmes de configuration particuliers avec les instances de systèmes d’exploitation qui les supportent, pour pouvoir en valider la cohérence et ainsi être à même de générer du code dont on est sûr qu’il va fonctionner (oui, car on « debug » aussi des modèles et des génération et des transformations, bref, dans un domaine comme dans l’autre tout se répète ! Patterns ! ).

Amusez-vous bien !

About these ads

Laisser un commentaire

Choisissez une méthode de connexion pour poster votre commentaire:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Suivre

Recevez les nouvelles publications par mail.

%d blogueurs aiment cette page :