XPand und EMF

G

Gast2

Gast
Hallo zusammen,

ich verstehe noch nicht ganz den Unterschied zwischen EMF und XPand und deren Verwendung.
EMF generiert aus xml,Annotations oder dem Ecore MetaModel Code.
XPand generiert aus bestimmten MetaModel auch Code, wobei man hier durch Templates definieren kann wie wie der Aufbau der Klassen aussehen soll. Außerdem kann das MetaModel mit Extension(.ext) erweitert werden und mit Checks(.chk) überprüft werden. Somit kann man mit Xpand auf die Codegenerierung eingreifen und den Aufbau seiner Klassen selber bestimmen, was bei EMF nicht geht?

Man kann das MetaModel (ecore) mit EMF erstellen und dann mit XPand generieren lassen.
Aber was genau ist der Vorteil von XPand, weil mit EMF kann mit dem genModel auch schon Code erzeugt werden? Also für was ist der zusätzliche Schritt über XPand gut?(Vorteil gegenüber dem genModel)?

Welche Vorteile ergeben sich wenn man das Ecore MetaModel verwendet anstatt eines anderen MetaModel?
Mir fällt der Undo/Redo Support und das Notification Framework ein. Gibt es noch weitere Argumente um ein bestehendes MetaModel auf das Ecore Model umzustellen, welches dann mit Xpand generiert wird?

Vielen Dank ziemlich theoretisch alles =)
 

Wildcard

Top Contributor
Mir ist nicht ganz klar wie man EMF mit XPand verwechseln kann, weil das wirklich Äpfel und Birnen sind.
XPand und Jet, da kommen wir der Sache näher, aber EMF und XPand?
Das EMF Tooling verwendet Jet um aus einem genmodel und dem ecore Java Klassen zu generieren. Jet ist eine Templatesprache wie JSP.
Bestimmte Tools (GMF, Xtext, usw.) generieren ebenfalls Code aus EMF Modellen (meistens jedoch nicht aus ecore selbst, sondern aus eigenen Modellen die als ecore beschrieben sind) und verwenden dafür Xpand statt Jet, weil Xpand mächtiger als Jet ist.
Der Grund warum der EMF Code Generator trotzdem Jet verwendet liegt wohl einfach daran das der generierte Code ja nicht besser wird wenn man eine andere Templatesprache verwendet. Man müsste also alle Templates neu schreiben nur um wieder zum gleichen Ergebnis wie vorher zu kommen.

Somit kann man mit Xpand auf die Codegenerierung eingreifen und den Aufbau seiner Klassen selber bestimmen, was bei EMF nicht geht?
EMF sieht ebenfalls vor das du den Aufbau der Klassen selbst bestimmen kannst, dazu verwendest aber nicht Xpand, sondern ein eigenes JET Template, da der EMF Code Generator wie oben beschrieben Jet als Templatesprache verwendet.

Welche Vorteile ergeben sich wenn man das Ecore MetaModel verwendet anstatt eines anderen MetaModel?
Auch wenn mir das 'Meta' nicht wirklich gefällt, welche anderen Metamodelle kennst du denn die ähnliche Features wie EMF bieten? EMF ist die Referenzimplementierung von EMOF. Das ist ein Weg, aber sicher nicht der einzige. Ich kenne nur nicht wirklich viele andere ausgereifte Modellierungswerkzeuge die man stattdessen verwenden könnte.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Mir ist nicht ganz klar wie man EMF mit XPand verwechseln kann, weil das wirklich Äpfel und Birnen sind.
XPand und Jet, da kommen wir der Sache näher, aber EMF und XPand?
Das EMF Tooling verwendet Jet um aus einem genmodel und dem ecore Java Klassen zu generieren. Jet ist eine Templatesprache wie JSP.
Bestimmte Tools (GMF, Xtext, usw.) generieren ebenfalls Code aus EMF Modellen (meistens jedoch nicht aus ecore selbst, sondern aus eigenen Modellen die als ecore beschrieben sind) und verwenden dafür Xpand statt Jet, weil Xpand mächtiger als Jet ist.
Der Grund warum der EMF Code Generator trotzdem Jet verwendet liegt wohl einfach daran das der generierte Code ja nicht besser wird wenn man eine andere Templatesprache verwendet. Man müsste also alle Templates neu schreiben nur um wieder zum gleichen Ergebnis wie vorher zu kommen.


EMF sieht ebenfalls vor das du den Aufbau der Klassen selbst bestimmen kannst, dazu verwendest aber nicht Xpand, sondern ein eigenes JET Template, da der EMF Code Generator wie oben beschrieben Jet als Templatesprache verwendet.

Ah okay ich wusste nicht das EMF Jet verwendet das ist eine Information die mir noch gefehlt. Okay die Informationen waren sehr hilfreich danke. Jetzt versteh ich den zusammenhang besser, bis jetzt war da noch ein Loch wie EMF das macht.

Auch wenn mir das 'Meta' nicht wirklich gefällt, welche anderen Metamodelle kennst du denn die ähnliche Features wie EMF bieten? EMF ist die Referenzimplementierung von EMOF. Das ist ein Weg, aber sicher nicht der einzige. Ich kenne nur nicht wirklich viele andere ausgereifte Modellierungswerkzeuge die man stattdessen verwenden könnte.

Modellierungswerkzeug ist Enterprise Architecture(EA) daraus wird ein xml MetaModel generiert. Woraus XPand dann Java Code erzeugt. Die Frage war/ist welcher Vorteil es jetzt hätte das xml MetaModel und EA durch EMF auszutauschen.
 

Wildcard

Top Contributor
Modellierungswerkzeug ist Enterprise Architecture(EA) daraus wird ein xml MetaModel generiert. Woraus XPand dann Java Code erzeugt. Die Frage war/ist welcher Vorteil es jetzt hätte das xml MetaModel und EA durch EMF auszutauschen.
Dazu müsstest du die Features beider Werkzeuge vergleichen und dann das wählen was besser passt, das kann ich dir nicht beantworten.
 
G

Gast2

Gast
Dazu müsstest du die Features beider Werkzeuge vergleichen und dann das wählen was besser passt, das kann ich dir nicht beantworten.

Okay vielleicht zum besseren Verständniss nochmal kleine Zusammenfassung wie ich das alles verstanden hab.
Mit EMF kann man z.B. das ecore Model modellieren also ist es ein Werkzeug zur Modellierung.
Aus dem genModel (Kontextmenü) macht die JET Templatesprache dann die Java Klassen d.h. die Default JET Templates sind dafür verantwortlich, dass das Notfication Framework, Undo/Redo Support usw. generiert wird, das hat ansich nichts mit dem EMF Metamodel zu tun sondern das liegt an den JET Templates, richtig?

Das heißt wenn ich das EMF Metamodel hernehme, und die Codegenierung mit XPand mache, werden mir genau diese schönen Feature nicht mit generiert?


Edit: Bisher dachte ich immer durch das Ecore Model habe ich die Features mit dem Notfication Framework usw. Auch wenn ich XPand nehme, darum hab ich oben gefragt welche Vorteile sich ergeben ob Ecore Model oder ein anderes Metamodel für die Codegenerieung
 
Zuletzt bearbeitet von einem Moderator:

Wildcard

Top Contributor
Okay vielleicht zum besseren Verständniss nochmal kleine Zusammenfassung wie ich das alles verstanden hab.
Mit EMF kann man z.B. das ecore Model modellieren also ist es ein Werkzeug zur Modellierung.
Aus dem genModel (Kontextmenü) macht die JET Templatesprache dann die Java Klassen d.h. die Default JET Templates sind dafür verantwortlich, dass das Notfication Framework, Undo/Redo Support usw. generiert wird, das hat ansich nichts mit dem EMF Metamodel zu tun sondern das liegt an den JET Templates, richtig?

Das heißt wenn ich das EMF Metamodel hernehme, und die Codegenierung mit XPand mache, werden mir genau diese schönen Feature nicht mit generiert?
Ja und nein. Undo/Redo Support, Notifications, usw. funktionieren mit dynamic EMF sogar ganz ohne Code zu generieren.
Ausserdem ist die Hauptfunktionalität in den Library Klassen von EMF, deine Klassen müssen deine Funktionalität nur nutzen. Wenn du also XPand verwenden möchtest, dann muss dein Template Code generieren der all die Funktionalität nutzt und zur Verfügung stellt.

Edit: Bisher dachte ich immer durch das Ecore Model habe ich die Features mit dem Notfication Framework usw. Auch wenn ich XPand nehme, darum hab ich oben gefragt welche Vorteile sich ergeben ob Ecore Model oder ein anderes Metamodel für die Codegenerieung
Die VM führt keine Modelle aus, sondern Java Code. Auch EMF kocht nur mit Wasser. Der Großteil der EMF Funktionalität wird durch das extends EObjectImpl weggekappselt.
Du siehst im Code ja genau was die konkrete Klasse noch tun muss um davon zu profitieren.
Die eGet, eSet, eUnset,... für die Reflection API, die ContainmentELists um Containment abzubilden, die resolve Proxy aufrufe in den Lazy Loading Gettern, die ENotification in den settern,...
Wenn du mit XPand Code dieser Art erzeugt, funkioniert das natürlich auch alles, völlig egal welche Template Sprache verwendet wurde.
 
G

Gast2

Gast
Die Funktionalitäten sind in den EMF Klassen. Aber um die Funktionalitäten noch zu benutzen muss ich z.B. in meinen setMethoden (im xpand template) noch die notifys selber einbauen?
 

Wildcard

Top Contributor
Ja.
Um was genau geht es dir eigentlich? Möchtest du anderen Code generieren? In den meisten Fällen dürfte es einfacher sein die EMF Jet Templates anzupassen anstatt komplett neue Templates mit XPand zu schreiben.
 

Ähnliche Java Themen


Oben