Metamodellbasierte und hierarchieorientierte ... - RosDok
Metamodellbasierte und hierarchieorientierte ... - RosDok
Metamodellbasierte und hierarchieorientierte ... - RosDok
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
3.2 Workflow-Metamodell 39<br />
hungen anhand von OCL definiert, die von Workflow Patterns nicht abgedeckt sind, aber Bestandteile des<br />
Metamodells <strong>und</strong> damit der neuen Sprache sind. Eine detaillierte Analyse der Elemente, die die Workflow<br />
Patterns abdecken wird in Abschnitt 3.2.4 folgen.<br />
3.2.3.1 Angabe der Objektlebenszyklen mit OCL<br />
Die Lebenszyklen von Aktivitätsobjekten sind mit Hilfe von UML-Zustandsautomaten in Abbildung 3.3<br />
spezifiziert. Die Transitionen werden durch Operationsaufrufe repräsentiert. Diese Art der Spezifikation<br />
von Objektlebenszyklen ist in der UML Spezifikation [UML10, Kap. 15.1] mit Protocol State Machines<br />
bezeichnet.<br />
Die State Charts können über OCL Vor- <strong>und</strong> Nachbedingungen ausgedrückt werden. Der Zustand des<br />
Objekts ist durch das Attribut state im Zusammenhang mit der Enumeration State im Klassendiagramm<br />
angegeben. In Listing 3.3 ist anhand der angegebenen OCL Vor- <strong>und</strong> Nachbedingung die Transition mit<br />
dem Operationsaufruf start() aus Abbildung 3.3(a) angegeben. Die Vorbedingung isActivityWaiting gibt an,<br />
dass der Zustand des Aktivitätobjekts waiting sein muss. Die Nachbedingung isActivityRunning spezifiziert<br />
die Zustandsänderung auf Zustand running. Zusätzlich ist in Listing 3.3 noch die OCL-Spezifikation für die<br />
Operation finish() angegeben. Analog werden die weiteren Transitionen für die Operationsaufrufe skip(),<br />
fail() <strong>und</strong> cancel() von Abbildung 3.3(a) mit Hilfe von OCL gebildet. Diese werden hier jedoch nicht weiter<br />
angegebenen.<br />
✞<br />
1 context Activity::start()<br />
2 pre isActivityWaiting: state=#waiting<br />
3 post isActivityRunning: state=#running<br />
4<br />
5 context Activity::finish()<br />
6 pre isActivityRunning: state=#running<br />
7 post isActivityDone: state=#done<br />
8<br />
9 context IterationGroup::nextIteration()<br />
10 pre isDoneSkippedOrCanceled: self.activity−>forAll(state=#done or state=#skipped or state=#canceled)<br />
11 post isIGWaiting: self.activity−>forAll(state=#waiting)<br />
✝<br />
Listing 3.3: OCL-Vor- <strong>und</strong> Nachbedingungen für Transitionen im Zustandsdiagramm der Klasse Activity<br />
☎<br />
✆<br />
In Listing 3.3 ist noch die Spezifikation für die Operation nextIteration() spezifiziert. Diese Operation ist wie<br />
im Abschnitt 3.2.1 erwähnt der Klasse IterationGroup zugeordnet. Entsprechend der Zustandsdiagramme<br />
von Abbildung 3.3 besagt die Vorbedingung, dass alle zur Gruppe gehörende Aktivitäten im Zustand<br />
done, skipped oder canceled sein müssen. Die Nachbedingung besagt, dass die Aktivitäten auf waiting<br />
zurückzusetzen sind.<br />
Im Gegensatz zum Automaten von normalen Aktivitäten in Abbildung 3.3(a) haben Iterationsaktivitäten den<br />
Objektlebenszyklus von Abbildung 3.3(b). Vergleicht man die Automaten, können die Vor- <strong>und</strong> Nachbedingungen<br />
für die start()-Operation für die Iteration Klasse gleich bleiben. Die Vor- <strong>und</strong> Nachbedingungen<br />
werden vererbt, so dass für diese Operation keine neuen Bedingungen angegeben werden müssen. Für die<br />
Operation finish() sieht es da anders aus. Setzt man den Automaten in OCL-Vor- <strong>und</strong> Nachbedingungen um,<br />
ergibt sich eine Spezifikation von Listing 3.4.<br />
Schließlich sei hier noch das Design by contract Prinzip [Mey92] im Zusammenhang mit dem Substitutionsprinzip<br />
[LW94] erwähnt. Dieses besagt, dass Objekte der Unterklassen Objekte der Oberklassen<br />
ersetzen können <strong>und</strong> dieses auch für Verhaltenspezifikation gelten soll. Objekte der Unterklassen sollen