Spezifikationsmodule - Software and Systems Engineering - TUM
Spezifikationsmodule - Software and Systems Engineering - TUM
Spezifikationsmodule - Software and Systems Engineering - TUM
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
5.4 Umsetzung der Dialogführung in ODL<br />
Nachdem wir nun den Ablauf der Dialogführung illustriert und beschrieben,<br />
und die für das Ablaufdesign relevanten Fragen skizziert haben, wenden wir uns<br />
nun der technischen Seite zu. In diesem Abschnitt werden wir die Dialogschritte<br />
als ODL Ausdrücke formulieren. Dabei konzentrieren wir uns hier nur auf die<br />
Besonderheiten ausgewählter Schrittes. Das komplette Programmlisting findet<br />
sich im Anhang A. Es ist gegenüber den hier gemachten Ausführungen noch<br />
erweitert worden, damit es zu dem Beispiel aus Kapitel 2 passt.<br />
5.4.1 Komponentendialog<br />
Der Komponentendialog ist durch einen sehr einfachen ODL-Ausdruck definiert:<br />
context component_pair:(one:Component, two:Component) .<br />
Wir erhalten vom Benutzer ein 2-Tupel von Komponenten, dessen Elemente<br />
wir über die Tupelselektoren one und two erreichen. Diese Konvention für Tupelselektoren<br />
werden wir im Folgenden auch für die <strong>and</strong>eren Datenstrukturen<br />
beibehalten.<br />
5.4.2 Vorberechnung für Schnittstellendialog<br />
Für den Dialog zur Vereinigung der Schnittstellen (Port-Elemente) führen wir<br />
eine Vorberechnung durch. Dazu definieren wir zunächst ein Prädikat, das die<br />
externe Abhängigkeit von Port zu Component und die interne Abhängigkeit in<br />
Bezug auf das Direction-Attribut, wie in Kapitel 4 gezeigt, kapselt.<br />
define Consistent_Component_Port(<br />
component_pair:(one:Component, two:Component),<br />
pm_elem:(one:Port, two:Port)<br />
) := (<br />
pm_elem.one.Direction.IsEntry =<br />
pm_elem.two.Direction.IsEntry <strong>and</strong><br />
component_pair.one = pm_elem.one.Component <strong>and</strong><br />
component_pair.two = pm_elem.two.Component<br />
) .<br />
Mit diesem Prädikat können wir nun alle Kombinationen von Port-Elementen<br />
der zwei gewählten Komponenten auf Vereinbarkeit mit den Abhängigkeiten<br />
prüfen. Wir setzen hier den Fixpunktoperator ein, um die entsprechenden Tupel<br />
in der Menge port map possible aufzusammeln.<br />
exists port_map_possible: lfp FP1 set<br />
fp1_it:(one:(component_pair.one.Ports),<br />
two:(component_pair.two.Ports)<br />
) with (<br />
call Consistent_Component_Port(component_pair, fp1_it)<br />
) .<br />
48