Modellierung mit
UML
Loading

6.2 OCL in Sequenzdiagrammen

Wie Abbildung 6.1 zeigt, können in einem Sequenzdiagramm zusätzlich nur zu bestimmten Zeitpunkten des Ablaufs geltende Bedingungen angegeben werden. In diesen OCL-Bedingungen werden die im Sequenzdiagramm auftretenden Objekte und Werte in Beziehung gesetzt. Dazu ist der Zugriff auf benannte Objekte und Variablen möglich, die als Argumente in Methodenaufrufen eingesetzt sind. Abbildung 6.1 beinhaltet mehrere solche Variablen. Der Bindungsbereich jeder Variable erstreckt sich von der Stelle des ersten Auftretens über das gesamte Sequenzdiagramm. Das heißt zum Beispiel, das Auktionsobjekt kupfer912 kann auch als Methodenargument und in OCL-Bedingungen eingesetzt werden. In Abbildung 6.1 sind insgesamt die Variablen kupfer912, bidPol, timePol, theo, bid, t und bm verfügbar. Anonyme Objekte werden in Sequenzdiagrammen wie in Objektdiagrammen behandelt, als ob sie einen eindeutigen, nach außen nicht bekannten Namen hätten.

Wie bereits diskutiert, werden Variablen wie bm und t, die als Argumente eines Methodenaufrufs beziehungsweise eines Returns das erste Mal auftreten, an dieser Stelle gebunden. Ihr Typ ergibt sich aus der entsprechenden Signatur, die aus einem Klassendiagramm abgelesen werden kann. So ist bid vom Typ Bid, t vom Typ Time und von Objekt bm ist bekannt, dass es vom Typ Message ist.

Eine OCL-Bedingung kann die auftretenden Objekte und Parameter sowie den Effekt einer Nachricht auf einem Objekt genauer beschreiben, wobei sich der Kontext aus dem Sequenzdiagramm ergibt. Die untere Bedingung in Abbildung 6.1 kann unter expliziter Angabe des Kontexts wie folgt dargestellt werden:

context Auction kupfer 912, BiddingPolicy bidPol,
  TimingPolicy timePol, Person theo, Bid bid,
  Time t, Message bm inv:
  kupfer912.currentClosingTime == t &&
  theo.message.last == bm &&
  typeif bm instanceof BidMessage then
    bm.auction == kupfer912
  else false

In dieser Bedingung wird unter anderem gefordert, dass bm ein Objekt des Typs BidMessage ist und dann dessen Inhalt teilweise überprüft.

Diese Festlegung des Kontexts zeigt, dass ein Zugriff auf Attribute durch Qualifizierung mit dem Objekt möglich ist. Ist ein OCL-Ausdruck allerdings ausschließlich einer Zeitlinie zugeordnet, so kann auf die Attribute dieses Objekts direkt zugegriffen werden. Zur besseren Lesbarkeit ist es allerdings sinnvoll, dennoch eine Qualifizierung zu verwenden. Der Kontext der ersten OCL-Bedingung in Abbildung 6.1 sieht damit wie folgt aus, wobei gegenüber obiger Kontextdefinition auch die noch nicht eingeführte BidMessagebm fehlt:

context Auction kupfer 912, BiddingPolicy bidPol,
  TimingPolicy timePol, Person theo,
  Bid bid, Time t inv:
  let TimingPolicy timePol = this
  in
    t.timeSec == bid.time.timeSec + extensionTime

Die Gültigkeit einer OCL-Bedingung bezieht sich auf den Zeitpunkt unmittelbar nach der letzten aufgetretenen Interaktion beziehungsweise dem letzten aufgetretenen Aktivitätsbalken. Das bedeutet, die OCL-Bedingung ist nur unmittelbar nach dieser Interaktion einzuhalten, nicht jedoch während des gesamten „Zeitraums“, in den die OCL-Bedingung eingebettet ist. Abbildung 6.7 illustriert dies anhand zweier Sequenzdiagramme.

Lädt...
Abbildung 6.7: Gültigkeit von OCL-Bedingungen in Sequenzdiagrammen

Da ein Sequenzdiagramm zeitliche Abläufe modelliert, steht anders als in der OCL-Methodenspezifikation ein @pre-Operator nicht zur Verfügung. Soll auf einen früheren Wert eines Attributs zugegriffen werden, so ist dieser explizit in einer Zwischenvariable abzulegen. Dazu wird ein an OCL angelehntes let-Konstrukt verwendet, das neue Variablen einführt, die nur innerhalb des Sequenzdiagramms zugreifbar sind. Diese Hilfsvariablen sind nicht Teil der Implementierung, sondern dienen ausschließlich zur Spezifikation von Effekten, die während des Ablaufs der Interaktion eintreten. Abbildung 6.8 zeigt eine Verwendungsform dieser Variablen.

Lädt...
Abbildung 6.8: Hilfsvariablen speichern Werte


Bernhard Rumpe. Agile Modellierung mit UML. Springer 2012