|
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843288 is a reply to message #1843276] |
Thu, 22 July 2021 16:12 |
|
Hi,
Was mit unklar in deinem snippet ist
Complextypes
Sequences
Innerelements
Sind alles Listen,
Du möchtest aber nur 1 Typ ausgeben ?!?
Wenn du mehrere ausgeben möchtest mache einfach verschachtelte for loops
«FOR o : outerelements»
<xs:element name="«o.name»">
<xs:complexType>
<xs:sequence>
«FOR c : o.complextypes»
«FOR s : c.sequences»
«FOR i : s.innerelements»
<xs:element
name="«i.name»" type="«i.type»" />
«ENDFOR»
«ENDFOR»
«ENDFOR»
</xs:sequence>
</xs:complexType>
</xs:element>
«ENDFOR»
'''
Or alternativ eine for loop über mit einer flatten/map combi
«FOR o : outerelements»
<xs:element name="«o.name»">
<xs:complexType>
<xs:sequence>
«FOR i : o.complextypes.map[sequences.map[innerelements].flatten].flatten»
<xs:element
name="«i.name»" type="«i.type»" />
«ENDFOR»
</xs:sequence>
</xs:complexType>
</xs:element>
«ENDFOR»
'''
or using guava
import static extension com.google.common.collect.Iterables.*;
...
«FOR o : outerelements»
<xs:element name="«o.name»">
<xs:complexType>
<xs:sequence>
«FOR i : o.complextypes.transform[sequences].flatten.transform[innerelements].flatten»
<xs:element
name="«i.name»" type="«i.type»" />
«ENDFOR»
</xs:sequence>
</xs:complexType>
</xs:element>
«ENDFOR»
'''
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
[Updated on: Thu, 22 July 2021 16:33] Report message to a moderator
|
|
|
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843291 is a reply to message #1843288] |
Thu, 22 July 2021 20:08 |
Pol Ek Messages: 7 Registered: July 2021 |
Junior Member |
|
|
Hallo Herr Dietrich,
vielen, vielen Dank für die Antwort - das hat sehr geholfen! Ich iteriere also einfach über jede der Listen und greife die entsprechenden Typen ab. Können Sie mir erklären, wie genau das bei Vererbung funktioniert? Das Beispiel im Anhang zeigt beispielhaft ein UML-Klassendiagramm einer vereinfachten Teilmenge einer Programmiersprache. Ich versuche jetzt, eine Map Fusion Funktion zu schreiben, die zwei Funktionen merged und dabei alle Statements der ersten Funktion als Input für die zweite Funktion nutzt. Der "Rohbau" für die Xtend-Funktion könnte in etwa wie folgt aussehen:
public def Function fuse(Function f1, Function f2)'''
...
'''
Beispiel:
Wir haben eine erste Funktion F1 addOne, die einfach einen Parameter um eins erhöht:
function addOne(int p){int x; x=p+1;return x;}
Daneben haben wir eine zweite Funktion F2 square, die einen Parameter quadrieren soll:
function square(int num){int y; y=num*num;return y;}
Mit der Xtend-Funktion fuse versuche ich nun unter Zuhilfename des UML-Klassendiagramms im Anhang, zwei Funktionen dieser Art zu "mergen". Sprich F1 und F2 würden kombiniert folgendes ergeben:
function addOne(int p){
int x;
x=p+1;
int y;
y=x*x;
return y;
}
Wie genau kann ich jetzt das UML-Klassendiagramm nutzen, um diesen gewünschten Output zu erzeugen?
Haben Sie vielen Dank im Voraus.
Liebe Grüße!
[Updated on: Thu, 22 July 2021 20:13] Report message to a moderator
|
|
|
|
|
|
|
|
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843307 is a reply to message #1843304] |
Fri, 23 July 2021 07:59 |
|
wie schon gesagt, entweder mit ifElse oder dispatch,
'''
«IF s instanceof VarDef»
...
«ELSEIF s instanceof Assignment»
«ELSEIF s instanceof Return»
«ELSE»
Hier geht was schief oder fehlt was
«ENDIF»
'''
def xxxx(Statement s) {
'''
«s.compile»
'''
}
def dispatch StringConcatenation compile(VarDef v) {
''''''
}
def dispatch StringConcatenation compile(Assignment a) {
''''''
}
def dispatch StringConcatenation compile(Return r) {
''''''
}
leider habe ich keine zeit 15 minuten die eclasses nachzubauen, so dass ich konkreten code pasten call
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
Re: Umsetzung von Xtend-Funktionen basierend auf einem UML-Klassendiagramm [message #1843319 is a reply to message #1843307] |
Fri, 23 July 2021 12:56 |
Pol Ek Messages: 7 Registered: July 2021 |
Junior Member |
|
|
Hallo Herr Dietrich,
vielen Dank für die Rückmeldung. Der "instanceof"-Ansatz hat auf jeden fall schon weitergeholfen! Gar kein Problem und völlig verständlich, dass Sie für diese Dinge wenig Zeit haben - ich bin Ihnen wirklich über jeden Input sehr dankbar. Ich stolpere nach wie vor über ein paar Kleinigkeiten - anstelle dass Sie die EClasses nachbauen, wäre es Ihnen vielleicht möglich, die Lösung mit ein paar Zeilen Xtend näherungsweise zu beschreiben? Ich brauche keine Lösung, die ich 1:1 kopieren kann. Mir geht es vielmehr um das Verständnis dahinter und best-practices, mit denen Profis solche Herausforderungen lösen.
Liebe Grüße!
[Updated on: Fri, 23 July 2021 12:57] Report message to a moderator
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.08914 seconds