Spezifikationsmodule - Software and Systems Engineering - TUM
Spezifikationsmodule - Software and Systems Engineering - TUM
Spezifikationsmodule - Software and Systems Engineering - TUM
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
5.5.3 Konstruktion der Komponente<br />
Da wir im interaktiven Ablauf nur ein Paar von Komponenten betrachten, gestaltet<br />
sich das Generieren der Vereinigungskomponente denkbar einfach.<br />
exists new_comp: new Component . (<br />
context new_comp_name:String .<br />
result has Name(new_comp, new_comp_name)<br />
<strong>and</strong> result has<br />
SubComponents(component_pair.one.SuperComponent, new_comp)<br />
<strong>and</strong> ...<br />
Über den Namen der neuen Komponente lassen wir den Nutzer durch den<br />
entsprechenden context-Ausdruck entscheiden. Die neue Komponente wird anschließend<br />
parallel zur ersten unifzierten Komponente in das Modell eingefügt.<br />
5.5.4 Konstruktion der Schnittstellenelemente<br />
Für die Konstruktion der Port-Elemente benutzen wir den map-Operator. Wir erzeugen<br />
eine bijektive Abbildung, sodass zu jedem Tupel von unifizierten Schnittstellenelementen<br />
genau ein neues Element entsteht.<br />
exists new_port_map:map orig:port_map to copy:new Port . (<br />
/* bijective mapping */<br />
forall npm1:new_port_map . forall npm2:new_port_map . (<br />
npm1.orig = npm2.orig equiv npm1.copy = npm2.copy<br />
) <strong>and</strong><br />
/* build associations */<br />
run makePorts(new_comp, new_port_map, new_tconst_map) <strong>and</strong><br />
...<br />
Die Anbindung und Verknüpfung der neuen Elemente haben wir hier der<br />
Übersichtlichkeit halber in ein Unterprogramm ausgelagert. Hier wird für jedes<br />
neue Schnittstellenelement die Anbindung an die neue Komponente, die Namensgebung<br />
und das Setzen der Port-Attribute durchgeführt. Im Gesamtablauf<br />
müssen wir die Datentypdefinitionen bereits generiert haben, da wir sie, wie im<br />
folgenden Programmausschnitt ersichtlich, korrekt verknüpfen müssen.<br />
define makePorts(<br />
new_comp:Component,<br />
new_port_map:set(orig:(one:Port, two:Port),copy:Port),<br />
new_tconst_map:set (<br />
orig:(one:DataDef, two:DataDef),<br />
copy:AbstractType<br />
)<br />
) as (<br />
forall mk_prt:new_port_map . (<br />
/* link port to new component */<br />
result has Ports(new_comp, mk_prt.copy) <strong>and</strong><br />
/* generate name for the port */<br />
55