Das Se­quenz­dia­gramm ist ein Dia­gramm­typ der Unified Modeling Language (UML). UML wiederum ist eine ob­jekt­ori­en­tier­te Mo­del­lie­rungs­spra­che. Solch eine Sprache besteht aus gra­fi­schen Elementen. UML mo­del­liert Systeme und Prozesse der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung sowie Ge­schäfts­pro­zes­se. Ziel ist es, komplexe Sach­ver­hal­te über­sicht­lich dar­zu­stel­len. UML legt zu diesem Zweck eine stan­dar­di­sier­te Notation fest. Eine Form steht stets für einen be­stimm­ten Be­stand­teil oder eine bestimmte Ver­hal­tens­wei­se. Die so­ge­nann­te Me­ta­mo­del­lie­rung legt Sprach­ein­hei­ten und deren Bedeutung innerhalb der UML fest. Dazu gehört auch die Fest­le­gung, wie bestimmte Elemente mit­ein­an­der in­ter­agie­ren können und welche Hier­ar­chien zwischen den je­wei­li­gen Sprach­ein­hei­ten bestehen.

Elemente und Be­zie­hun­gen stellt UML in Form von Dia­gram­men dar. UML2 un­ter­schei­det 14 un­ter­schied­li­che Dia­gramm­ty­pen. Diese ordnet es einer von drei ver­schie­de­nen Ka­te­go­rien zu: Struk­tur­dia­gram­men, Ver­hal­tens­dia­gram­men und In­ter­ak­ti­ons­dia­gram­men.

  • Struk­tur­dia­gram­me (Englisch: structure diagrams) stellen ein System und dessen Be­stand­tei­le in einem sta­ti­schen Zustand dar. Sie ver­deut­li­chen, welche Be­zie­hun­gen zwischen einzelnen Elementen oder zwischen Elementen und über­ge­ord­ne­ten Konzepten bestehen. Ein Beispiel dafür ist das Klas­sen­dia­gramm.
  • Ver­hal­tens­dia­gram­me (Englisch: behavior diagrams) stellen Prozesse und das Verhalten eines Systems dynamisch dar. Anders als bei den Struk­tur­dia­gram­men spielt auch die Rei­hen­fol­ge von Prozessen und somit Zeit eine Rolle bei der Dar­stel­lung. Ein Beispiel hierfür ist das Ak­ti­vi­täts­dia­gramm.
  • In­ter­ak­ti­ons­dia­gram­me (Englisch: in­ter­ac­tion diagrams) gehören zu den Ver­hal­tens­dia­gram­men. Sie werden gesondert auf­ge­führt, weil sie ein spe­zi­fi­sches Verhalten mo­del­lie­ren – nämlich In­ter­ak­tio­nen zwischen Sys­tem­ele­men­ten. Die Grund­bau­stei­ne von In­ter­ak­tio­nen sind die so­ge­nann­ten Le­bens­li­ni­en. Das sind Objekte (also die kleinsten ei­gen­stän­di­gen Bausteine der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung), die in­di­vi­du­el­le Teil­neh­mer einer In­ter­ak­ti­on dar­stel­len. Das meist genutzte In­ter­ak­ti­ons­dia­gramm ist das Se­quenz­dia­gramm.

Se­quenz­dia­gram­me: Nutzen und Be­son­der­hei­ten

Das UML-Se­quenz­dia­gramm stellt Er­eig­nis­auf­trit­te chro­no­lo­gisch geordnet dar. Deshalb wird es manchmal auch als Er­eig­nis­dia­gramm oder Er­eig­nis­sze­na­rio be­zeich­net. Die Ordnung (also die genaue Rei­hen­fol­ge) ist dabei wichtiger als spe­zi­fi­sche Zeit­punk­te. Sie können jedoch Be­schrän­kun­gen in Ihr Modell einbauen. Zum Beispiel kann eine Zeit­be­schrän­kung für einen be­stimm­ten Prozess (bei­spiels­wei­se die PIN-Eingabe am Bank­au­to­ma­ten) ein Ereignis bedingen (Kar­ten­aus­ga­be, falls nach einer be­stimm­ten Zeit keine Eingabe erfolgt).

Das Se­quenz­dia­gramm be­schreibt im Grunde, wie Objekte (und Instanzen) Nach­rich­ten in einer be­stimm­ten Rei­hen­fol­ge aus­tau­schen. Objekte sind der Grund­bau­stein von UML-Dia­gram­men. Je nach Dia­gramm­typ stellen sie bestimmte Aus­prä­gun­gen eines Sys­tem­ele­ments dar. Bei In­ter­ak­tio­nen sind die Objekte Le­bens­li­ni­en.

In einem System werden ständig Anfragen gestellt und Antworten versandt. Der Empfänger trifft dann aufgrund der spe­zi­el­len Anfrage und seiner eigenen vorher fest­ge­leg­ten Regeln eine Ent­schei­dung. Ein solches Geflecht möglicher Ent­schei­dun­gen und In­ter­ak­tio­nen stellt man meist durch ein Ak­ti­vi­täts­dia­gramm dar. Stellen Sie sich sämtliche möglichen Ent­schei­dun­gen (ja/nein) als Baum­dia­gramm vor, entsteht wahr­schein­lich das Bild eines stark ver­zweig­ten Netzes. Das Se­quenz­dia­gramm zeigt nur einen be­stimm­ten Pfad innerhalb dieses Netzes.

Das Se­quenz­dia­gramm un­ter­schei­det sich vom UML-An­wen­dungs­fall­dia­gramm ins­be­son­de­re durch seine de­tail­lier­te Ordnung. Soll ein Ge­schäfts­pro­zess neu ein­ge­führt werden, ver­schafft der An­wen­dungs­fall einen guten Überblick über die An­for­de­run­gen. Geht es hingegen darum, konkrete Fälle samt Zeitplan fest­zu­le­gen, erstellen Sie ein Se­quenz­dia­gramm. In diesem können Sie einzelne Teil­be­rei­che genauer dar­stel­len. Mit diesem so­ge­nann­ten An­wen­dungs­sze­na­rio prüfen Sie logische Zu­sam­men­hän­ge Ihres An­wen­dungs­falls auf Herz und Nieren.

UML-Se­quenz­dia­gram­me sind außerdem nützlich, wenn Sie kom­pli­zier­te Vorgänge zum besseren Ver­ständ­nis grafisch dar­stel­len wollen. Durch die über­sicht­li­che Mo­del­lie­rung erkennen Sie schnell, welche Stationen eine einzelne Aufgabe durch­lau­fen muss, um er­folg­reich ab­ge­schlos­sen zu werden. So können Sie Ihre Methoden planen und testen, noch bevor Sie sie im Ge­schäfts­all­tag oder in einem Com­pu­ter­sys­tem im­ple­men­tie­ren.

Um die Kon­troll­struk­tu­ren einer höheren Pro­gram­mier­spra­che dar­zu­stel­len, verbinden Sie mehrere Se­quenz­dia­gram­me mit­ein­an­der in einem kom­bi­nier­ten Fragment.

Hinweis

Se­quenz­dia­gram­me un­ter­stüt­zen logische Analysen für Teil­be­rei­che von Systemen. Spielt der zeitliche Ablauf von Prozessen eine wichtige Rolle, ist dieser Dia­gramm­typ dafür her­vor­ra­gend geeignet. Aber es ist nicht sinnvoll, ein ganzes System damit dar­zu­stel­len. Verweisen Sie statt­des­sen lieber an günstiger Stelle auf ein passendes Ver­hal­tens­dia­gramm wie das An­wen­dungs­fall­dia­gramm, das Zu­stands­dia­gramm oder das Ak­ti­vi­täts­dia­gramm. Diese il­lus­trie­ren auch größere Zu­sam­men­hän­ge über­sicht­lich und leicht ver­ständ­lich.

UML-Se­quenz­dia­gram­me: Notation und Beispiele

Ein UML-Diagramm soll dazu beitragen, dass alle in­vol­vier­ten Parteien komplexe Systeme besser verstehen. Dazu nutzt die Mo­del­lie­rungs­spra­che visuelle Symbole. Für Aus­nah­me­fäl­le und bestimmte An­wen­dungs­grup­pen lässt sich UML anpassen. Es ist jedoch sinnvoll, über­wie­gend den von der OMG (Object Ma­nage­ment Group) fest­ge­leg­ten Standard zu nutzen. An­dern­falls kann es leicht zu Ver­ständ­nis­pro­ble­men kommen. Die folgenden Spe­zi­fi­ka­tio­nen ent­spre­chen dem UML-Standard in der Version UML 2.5.

Le­bens­li­ni­en

Die Le­bens­li­nie re­prä­sen­tiert den Zeit­ver­lauf eines Prozesses. Ihr Kopf besteht aus einem Rechteck. Dieser be­inhal­tet im Regelfall den Ob­jekt­na­men und den Klas­sen­na­men. Fehlt der Ob­jekt­na­me, steht die Le­bens­li­nie für eine na­mens­lo­se Instanz des Objekts. In diesem Fall kann man davon ausgehen, dass alle Objekte derselben Klasse in dieser Sequenz gleich agieren. Die Le­bens­li­nie steht immer nur für einen einzelnen Operanden. Verfügt der Operand über mehrere Aus­prä­gun­gen, muss eine davon gewählt sein. Al­ter­na­tiv lässt sich auch sagen: Die Mul­ti­pli­zi­tät ist nie >1.

Fakt

Ein Operand in der Com­pu­ter­tech­nik ist ein Objekt, das durch einen Operator be­ein­flusst wird. Operanden können konstant oder variabel sein. Ein simpler Operand ist bei­spiels­wei­se die Variable X. Ope­ra­to­ren können simple arith­me­ti­sche Ope­ra­to­ren wie „+“ und „-“ sein. In der Pro­gram­mie­rung nutzt man diese Be­stand­tei­le für simple Funk­tio­nen wie „x = t * 4“ bis hin zu aus­ge­feil­ten Al­go­rith­men.

Vom recht­ecki­gen Kopf geht eine ge­stri­chel­te Linie nach unten ab. Diese Linie steht für den Zeit­ver­lauf. Nach unten hin ent­wi­ckelt sich die Zeit linear. Entlang der Zeit­schie­ne werden Nach­rich­ten gesendet und Antworten gegeben. Eine Nachricht, die zeitlich nach einer anderen Nachricht ver­schickt werden soll, steht weiter unten auf der Zeit­schie­ne. Bei der Notation geht es nie um ein­deu­ti­ge Zeit­punk­te, sondern stets um die Rei­hen­fol­ge. Nach­rich­ten werden immer un­ter­ein­an­der an­ge­ord­net, außer sie exis­tie­ren in parallel kom­bi­nier­ten Frag­men­ten.

Le­bens­li­ni­en zeigen an, wie lange ein Objekt aktiv an einem Prozess beteiligt ist. Das sieht man daran, wie lang eine Le­bens­li­nie im Vergleich zu den anderen ist. Manche Objekte werden zerstört, bevor der Prozess zu Ende ist. Nicht mehr benötigte Objekte markieren Sie auf deren Le­bens­li­nie mit einem X an der Stelle, an der Sie zerstört werden sollen.

Um die Ro­bust­heit Ihres Systems zu prüfen, eignet sich das Se­quenz­dia­gramm mit seinen de­tail­lier­ten Ansichten sehr gut. Es lassen sich drei Klassen-Ste­reo­ty­pe der Le­bens­li­nie nutzen:

  • Entität
  • Grenze
  • Kon­troll­ele­ment

Oben im Bild sehen Sie die drei Le­bens­li­ni­en samt Notation: Die Entität hat einen runden Kopf, der auf einer ho­ri­zon­ta­len Linie liegt. Bei der Grenze geht eine Linie mittig vom Kreis ab und verbindet sich mit einer ver­ti­ka­len Linie – wie ein um­ge­kipp­tes T, das seitlich vom Kopf abgeht. Der Kopf der Kontrolle besteht aus einem Pfeil, der sich im Kreis dreht. Von allen diesen Klassen-Ste­reo­ty­pen geht die ge­stri­chel­te Le­bens­dau­er-Linie vertikal nach unten ab.

Haben Sie bereits anhand eines An­wen­dungs­fall­dia­gramms ein Konzept aus­ge­ar­bei­tet, kann Ihnen das Se­quenz­dia­gramm zum Beispiel dabei helfen, die einzelnen Schritte unter Be­rück­sich­ti­gung der denkbaren Akteure und Objekte aus­zu­ar­bei­ten.

Dabei stehen Grenzen (Englisch: Boun­da­ries) für Schnitt­stel­len, die mit externen Akteuren in­ter­agie­ren. Diese Objekte können bei­spiels­wei­se Nut­zer­ober­flä­chen sein – wobei dann der Akteur eine Person wäre. Entitäten (Englisch: Entities) hingegen stehen für Daten-Container be­zie­hungs­wei­se Objekte, die Sys­tem­da­ten be­inhal­ten. Damit Grenzen und Entitäten kom­mu­ni­zie­ren können, benötigen Sie ein Kon­troll­ele­ment. Die Kontrolle muss nicht unbedingt ein Objekt sein. Eine Methode, die einer der beiden anderen Elemente zu­ge­schrie­ben wird, funk­tio­niert ebenso. Das Kon­troll­ele­ment verbindet Entität und Grenze als Ver­mitt­ler. Es überwacht die Signale der beiden Elemente und prüft sie hin­sicht­lich der Logik.

Die drei Ste­reo­ty­pe kom­mu­ni­zie­ren nach vier Regeln:

  • Grenz­Ob­jek­te sind als Schnitt­stel­le für die Kom­mu­ni­ka­ti­on mit Akteuren zuständig. Somit kom­mu­ni­zie­ren Akteure aus­schließ­lich mit Grenzen.
  • Im Gegensatz dazu ver­stän­di­gen sich Kon­troll­Ob­jek­te sowohl mit anderen Kontroll-Objekten als auch mit Entitäten und Grenzen. Dafür in­ter­agie­ren sie nicht mit Akteuren.
  • Grenzen kom­mu­ni­zie­ren also mit Kon­troll­Ob­jek­ten und mit Akteuren.
  • Entitäten sind als Da­ten­trä­ger am tiefsten im System ver­wur­zelt. Sie tauschen nur Daten mit Kon­troll­Ob­jek­ten aus.

Nach­rich­ten

Die Nachricht ist ein grund­le­gen­des Element des Se­quenz­dia­gramms. In der ob­jekt­ori­en­tier­ten Pro­gram­mie­rung besteht ein System aus Objekten. UML stellt diese Objekte als Knoten dar, die über so­ge­nann­te Kanten verbunden sind. In UML ver­rich­ten solche Kanten ver­schie­de­ne Aufgaben. Im UML-Se­quenz­dia­gramm mo­del­lie­ren sie die Me­ta­klas­se Nach­rich­ten. Die Notation schreibt als Grundform der Kante eine Linie vor. Pfeile sind eine spezielle Form von Kanten, die eine ge­rich­te­te Beziehung oder einen In­for­ma­ti­ons­fluss dar­stel­len. Im Se­quenz­dia­gramm sym­bo­li­sie­ren sie Nach­rich­ten. Un­ter­schied­li­che Nach­rich­ten­ty­pen werden also un­ter­schied­lich dar­ge­stellt, wie im un­ten­ste­hen­den Bild zu sehen ist.

Versehen Sie die Nachricht mit einem Label, das ihren Inhalt aufzeigt. Für simple Nach­rich­ten nutzen Sie folgende Form:

[Nach­rich­ten­na­me] : [attribute "="] Si­gnal­na­me oder Ope­ra­ti­ons­na­me [Argumente] [":" Rück­ga­be­wert]

Valide Argumente für Nach­rich­ten sind:

  • Kon­stan­ten
  • Wildcard-Werte (sym­bo­li­sche Werte, die einen im Diagramm legalen Wert X dar­stel­len)
  • Attribute des Senders
  • Parameter der um­schlie­ßen­den In­ter­ak­ti­on
  • Attribute der über­ge­ord­ne­ten Klasse

Nach­rich­ten haben eine Signatur. Diese spe­zi­fi­ziert den Inhalt der Nachricht. Die Signatur bezieht sich entweder auf ein Signal oder eine Operation und muss jeweils danach benannt sein. Das heißt, dass der Inhalt der Nachricht entweder eine Operation (also eine Aktivität) beim Empfänger anstößt oder ein Signal ver­schickt – also nur In­for­ma­tio­nen aus­tauscht. Außerdem un­ter­schei­den sich Nach­rich­ten da­hin­ge­hend, ob sie synchron oder asynchron sind. Bei asyn­chro­nen Nach­rich­ten wartet der Sender nicht auf Antwort, sondern nimmt sofort sein Verhalten wieder auf. Synchrone Nach­rich­ten warten auf eine Antwort und blo­ckie­ren solange den Kanal, auf dem sie senden.

Das sind die stan­dar­di­sier­ten Nach­rich­ten­ty­pen im UML-Se­quenz­dia­gramm:

  • Asyn­chro­ne Nach­rich­ten des Typs (Mes­sa­ge­Sort) asyn­ch­Call rufen eine Operation auf und stoßen ihre Aus­füh­rung an. Bei asyn­chro­nen Nach­rich­ten wartet das System nicht auf eine Antwort des Emp­fän­gers, sondern setzt seine Prozesse ohne Un­ter­bre­chung fort. Ope­ra­ti­ons­pa­ra­me­ter und Nach­rich­ten­at­tri­bu­te müssen zu­sam­men­pas­sen.
    • Der Typ asyn­ch­Si­gnal wird für Si­gnal­in­stan­zen genutzt. Er re­prä­sen­tiert Versand und Empfang asyn­chro­ner Nach­rich­ten. Solch eine Nachricht entsteht durch eine asyn­chro­ne Sen­de­ak­ti­on des Signals. Hier bestimmen die Si­gnal­at­tri­bu­te die Nach­rich­ten­ar­gu­men­te.
    • Notation: Asyn­chro­ne Nach­rich­ten mo­del­lie­ren Sie als Pfeil mit durch­ge­hen­der Linie und offener Pfeil­spit­ze.
  • Synchrone Nach­rich­ten rufen nur Ope­ra­tio­nen auf, keine Signale. Der Nach­rich­ten­typ heißt synchCall. Synchrone Nach­rich­ten warten auf eine Antwort der Operation, bevor sie ihr Verhalten wieder aufnehmen. Synchrone Nach­rich­ten stellen Sie als Pfeil mit einer gefüllten Pfeil­spit­ze dar.
  • Antworten sendet der Empfänger einer Nachricht zurück an den Absender, nachdem die Operation zu einem Ergebnis gekommen ist. Das Symbol dafür hat eine offene oder eine gefüllte Pfeil­spit­ze. Die ent­spre­chen­de Linie ist ge­stri­chelt.
  • Die crea­te­Mes­sa­ge ist ein Nach­rich­ten­typ, der eine neue Instanz einer Le­bens­li­nie si­gna­li­siert. Damit erschafft das System ein neues Objekt im Se­quenz­dia­gramm. Dieser Nach­rich­ten­typ ist der einzige, der direkt auf den Kopf der Le­bens­li­nie verweist. Andere Nach­rich­ten müssen auf die ge­stri­chel­te Le­bens­dau­er-Linie zeigen. crea­te­Mes­sa­ge hat einen Pfeil mit offener Spitze und ge­stri­chel­ter Linie wie die Antwort, sie zeigt aber in die ent­ge­gen­ge­setz­te Richtung.
  • Die de­le­te­Mes­sa­ge si­gna­li­siert den Punkt Laufzeit, an dem eine Le­bens­li­ni­en-Instanz zerstört wird. Die Lösch­nach­richt zeichnen Sie frei als Pfeil, optional mit dem Titel <<destroy>>. Sie muss immer auf eine De­s­truc­tion Oc­cur­rence Spe­ci­fi­ca­ti­on zeigen. Auch Zer­stö­rungs­er­eig­nis genannt, markiert diese Er­eig­nis­auf­tritts­spe­zi­fi­ka­ti­on die Zer­stö­rung eines Objekts auf der Laufzeit-Linie mit einem X.

Nach­rich­ten jeden Typs können Absender oder Empfänger fehlen – oder er ist unbekannt. Der UML-Standard geht dann davon aus, dass die jeweilige Instanz außerhalb des be­schrie­be­nen Diagramms liegt. Kennen Sie den Empfänger, aber nicht den Absender, handelt es sich um eine gefundene Nachricht. Dort, wo Sie sonst den Absender mo­del­lie­ren würden, si­gna­li­siert ein kleiner, gefüllter Kreis dessen Ab­we­sen­heit. Genau an­ders­her­um verhält es sich mit der ver­lo­re­nen Nachricht. Kennen Sie den Empfänger nicht, mo­del­lie­ren Sie einen gefüllten Kreis an die Pfeil­spit­ze.

Eine Son­der­form bilden solche Nach­rich­ten, die auf ihre eigene Le­bens­li­nie geschickt werden. Die Le­bens­li­nie sendet dann die Rekursion von einem Ak­ti­vi­täts­bal­ken ab. Noch während die Ak­ti­vie­rung läuft, setzt auf derselben Le­bens­li­nie eine neue Ak­ti­vie­rung ein. Deren Start­punkt nimmt die gesendete Nachricht an. Diese Art der Nachricht nutzen Sie bei­spiels­wei­se, wenn eine Operation mehrmals durch­ge­führt wird und das Objekt deshalb auf sich selber verweisen muss. Nach­rich­ten zwischen zwei Le­bens­li­ni­en können ebenfalls über­lap­pen­de Ak­ti­vie­run­gen her­vor­ru­fen. Weiter unten gehen wir genauer auf die Spe­zi­fi­ka­tio­nen von Ak­ti­vie­run­gen ein.

Ein weiterer wichtiger Be­stand­teil der Nachricht ist ihr Parameter. Parameter sind Wert­spe­zi­fi­ka­tio­nen. Das System wertet diese Größe aus, wenn es eine Nachricht mit Signatur ver­schickt. Das passiert an der Auf­tritts­spe­zi­fi­ka­ti­on, also an dem Punkt, an dem die Nachricht ab­ge­sen­det wird. Das Ergebnis gibt die Werte für Si­gnal­at­tri­bu­te oder Ope­ra­ti­ons-Input-Parameter vor – je nachdem, wer der Empfänger ist. Die Operation ver­ar­bei­tet dann den Wert weiter und pro­du­ziert einen Output-Parameter.

Eine Be­son­der­heit ist der Wildcard-Parameter. Fehlen der Nachricht sämtliche Parameter, erfordert die Syntax einen leeren String. Dieses Symbol si­gna­li­siert, dass der Pa­ra­me­ter­wert nicht fest­ge­legt ist. Trotzdem ist er im Sinne der Parameter oder Attribute des Emp­fän­gers valide. Er verhält sich also wie ein Joker. Wildcard-Zeichen sind Platz­hal­ter für einzelne Buch­sta­ben oder ganze Zei­chen­ket­ten. Viele kennen den Asterisk (*) als Platz­hal­ter. In UML steht der Bin­de­strich („-“) für den Wildcard-Parameter.

Ant­wort­nach­rich­ten dürfen pro Parameter nur einen Ausdruck mit höchstens einem Operanden haben. Wenn der Absender einer Antwort keine Werte ausgibt, hat auch die Nachricht keine spe­zi­fi­schen Werte, die sie ver­schickt. Nor­ma­ler­wei­se mo­del­liert die Nachricht die Output-Parameter eines Absenders (also Werte, die durch eine Operation entstehen) als Operanden. Ohne Output-Parameter muss der Operand leer bleiben. In diesem Fall mo­del­lie­ren Sie einfach keinen Rück­lauf­wert, sondern den Wildcard-Platz­hal­ter. Gibt es einen Operanden, wertet das System diesen wieder an der Auf­tritts­spe­zi­fi­ka­ti­on aus. Das Ergebnis der Aus­wer­tung gibt die Werte für die Parameter „out“, „inout“ und „return“ vor.

Fakt

Die Parameter IN, OUT und INOUT geben an, ob eine Instanz Werte annimmt oder abgibt. Der IN-Parameter si­gna­li­siert, dass eine Instanz Werte empfängt und ver­ar­bei­tet, aber nicht versendet. Der OUT-Parameter legt fest, dass sie keine Werte annimmt, sondern nur ausgibt. Der INOUT-Parameter lässt sowohl ein­ge­hen­de als auch aus­ge­hen­de Werte zu. De­fi­nie­ren Sie keinen dieser Werte, nimmt das System IN als Standard an.

UML spe­zi­fi­ziert drei Symbole, die als Pa­ra­me­ter­aus­druck den Empfänger der Nachricht angeben. Der Empfänger ist das so­ge­nann­te Auf­trags­ziel (Englisch: As­sign­ment Target) der Nachricht. Die Ant­wort­nach­richt weist ihm den Rück­lauf­wert aus dem aus­ge­ge­be­nen Parameter des Absenders zu. Das sind die stan­dar­di­sier­ten Symbole:

  • Unknown
  • In­ter­ac­tion Parameter
  • Attribute

Unknown (Unbekannt) ist ein leerer Parameter und steht für die Wildcard. Der In­ter­ak­ti­ons­pa­ra­me­ter (In­ter­ac­tion Parameter) ist ein ow­ned­Pa­ra­me­ter der In­ter­ak­ti­on, der er innewohnt. Das heißt, die In­ter­ak­ti­on besitzt den Parameter. Dieser verfügt über einen Namen. Ope­ra­ti­ons­pa­ra­me­ter und In­ter­ak­ti­ons­pa­ra­me­ter haben den gleichen Typ. Attribute können un­ein­ge­schränkt benannt werden. Sie stellen den Namen eines Kontext-Ver­hal­tens dar. Dieses Verhalten bestimmt entweder die Le­bens­li­nie, zu der die Nachricht zu­rück­kehrt, oder die umgebende In­ter­ak­ti­on. Legt die In­ter­ak­ti­on kein Verhalten fest, agiert sie selber als Kontext.

Gates, be­zie­hungs­wei­se Tore, sind einfach Punkte am Ende einer Nachricht. Sie gehören zum Typ Mes­sa­ge­End (Nach­rich­ten­en­de). Durch sie werden Sender und Empfänger einer Nachricht markiert. Gates ver­deut­li­chen den In­for­ma­ti­ons­fluss und zeigen auf, wie Nach­rich­ten zwischen zwei In­ter­ak­ti­ons­frag­men­ten wandern. Genauer gesagt stellen sie Ver­bin­dungs­punk­te für Nach­rich­ten zwischen In­ter­ak­ti­ons­nut­zen und In­ter­ak­tio­nen dar – sowie zwischen In­ter­ak­ti­ons­ope­ran­den innerhalb und außerhalb eines kom­bi­nier­ten Fragments. Man setzt sie auf den Rahmen des Diagramms.

Das UML-Se­quenz­dia­gramm kennt vier Arten von Gates. Sie un­ter­schei­den sich durch die In­ter­ak­ti­ons­frag­men­te, mit denen sie as­so­zi­iert werden:

  • Das faktische Tor: In­ter­ak­ti­ons­nut­zen verweisen von einem Diagramm auf ein anderes. Das faktische Tor öffnet die Ver­bin­dung am äußeren Rand des In­ter­ak­ti­ons­nut­zens für Nach­rich­ten aus der In­ter­ak­ti­on, auf die der In­ter­ak­ti­ons­nut­zen verweist. Das Tor hat also eine As­so­zia­ti­on zum In­ter­ak­ti­ons­nut­zen und ak­zep­tiert ein­ge­hen­de und aus­ge­hen­de Nach­rich­ten. (Englisch: Actual Gate)
  • Das formale Tor: Damit eine In­ter­ak­ti­on Nach­rich­ten mit einem In­ter­ak­ti­ons­nut­zen aus­tau­schen kann, braucht es ein formales Tor. Das Tor befindet sich auf der In­nen­sei­te des Rahmens. (Englisch: Formal Gate)
  • Das innere Tor für kom­bi­nier­te Fragmente: Innerhalb eines kom­bi­nier­ten Fragments sitzt ein Gate am Rahmen. Nach­rich­ten mit Nach­rich­ten­en­den aus dem kom­bi­nier­ten Fragment tauscht es mit Nach­rich­ten mit Nach­rich­ten­en­den außerhalb des kom­bi­nier­ten Fragments aus. (Englisch: Inner Com­bi­ned­Frag­ment Gate)
  • Das äußere Tor für kom­bi­nier­te Fragmente: Dieses Tor sitzt auf dem äußeren Rand eines kom­bi­nier­ten Fragments. Es bildet den Gegenpol zum inneren Tor. (Englisch: Outer Com­bi­ned­Frag­ment Gate)

Gates haben explizite oder implizite Namen, die paarweise über­ein­stim­men müssen. Faktische und formale Tore müssen über­ein­stim­men, genauso wie innere und äußere Tore für kom­bi­nier­te Fragmente. Außerdem müssen die Nach­rich­ten in die gleiche Richtung gehen und die gleichen un­ver­kenn­ba­ren Ei­gen­schafts­wer­te sowie dieselbe Mes­sa­ge­Sort haben.

Eine besondere Rolle spielen Nach­rich­ten in Kom­mu­ni­ka­ti­ons­dia­gram­men. Dieser Dia­gramm­typ ist eine simple Form des Se­quenz­dia­gramms. Kom­mu­ni­ka­ti­ons­dia­gram­me mo­del­lie­ren, wie Le­bens­li­ni­en in­ter­agie­ren. Anders als Se­quenz­dia­gram­me kon­zen­trie­ren sie sich auf die Sys­tem­ar­chi­tek­tur und darauf, wie diese den Nach­rich­ten­fluss bedingt. Zwar können Sie eine de­tail­lier­te Ar­chi­tek­tur aufzeigen, In­ter­ak­ti­ons­frag­men­te wie kom­bi­nier­te Fragmente nutzen sie aber nicht. Dadurch fehlt ein Struk­tur­ele­ment. Statt­des­sen num­me­rie­ren Sie die Nach­rich­ten. Manchmal können Nach­rich­ten andere überholen. Die Rei­hen­fol­ge der aus­ge­hen­den Nach­rich­ten weicht dann ab von der Rei­hen­fol­ge der ein­ge­hen­den Nach­rich­ten. Der UML-Standard rät aber von solchen nicht-se­quen­zi­el­len Nach­rich­ten im Kom­mu­ni­ka­ti­ons­dia­gramm ab.

Die UML-Notation für Kom­mu­ni­ka­ti­ons­dia­gram­me schreibt einen einfachen Se­quenz­dia­gramm-Rahmen vor: Ein Rechteck mit fünf­ecki­gen Label im Kopf. Im Label markiert die Be­zeich­nung „sd“ diesen Dia­gramm­typ. Daneben notieren Sie den In­ter­ak­ti­ons­na­men. Nach­rich­ten erhalten hier eine andere Form: Sie verbinden die recht­ecki­gen Le­bens­li­ni­en (UML: Ob­jekt­kno­ten) als einfache Geraden (UML: Kanten).

Darüber notieren Sie die Se­quenz­be­zeich­nung (Englisch: Sequence Ex­pres­si­on) zusammen mit einem Pfeil, der in Richtung Empfänger zeigt. Die Se­quenz­be­zeich­nung hat folgende Form: [Integer|Name] [Wie­der­ho­lung]. Der Integer gibt die Hier­ar­chie für ver­schach­tel­te Elemente an. Weicht bei zwei Nach­rich­ten einer der Integer ab (zum Beispiel 1.2.2 und 1.2.3), sendet sie das System nach­ein­an­der. Der Name hingegen steht für gleich­zei­ti­ge Sendungen. Zwei Nach­rich­ten mit der Se­quenz­be­zeich­nung 1.2.3a und 1.2.3b sendet das System aufgrund des gleich­lau­ten­den Integers gleich­zei­tig ab. Die Wie­der­ho­lung be­inhal­tet entweder eine Ein­schrän­kung, die bestimmt, wann die Nachricht versandt wird, oder einen Wert, der festlegt, wie oft die Nachricht wie­der­holt wird.

Guards

In UML bewacht der Guard für das Verhalten eines Elements. Das Element muss entweder:

  • eine bestimmte Vor­aus­set­zung erfüllen,
  • einen be­stimm­ten Wert nicht über- oder un­ter­schrei­ten oder
  • eine Be­haup­tung be­stä­ti­gen

Ein Guard ist somit eine Ein­schrän­kung. Nur wenn die Ein­schrän­kung erfüllt wird, kann das be­ein­fluss­te Element ein be­stimm­tes Verhalten ausüben. Es gibt viele un­ter­schied­li­che Elemente, die solch einen Guard aufweisen können: Aktionen, Attribute, Verhalten und andere. UML schreibt keine strikte Sprache vor, bietet aber OCL, die Object Cons­traint Language, als native Option. Boolesche Variablen kommen auch oft zum Einsatz.

Eine In­ter­ak­ti­ons­ein­schrän­kung besteht aus so einem boole­schen Ausdruck. Die Ein­schrän­kung dient als Wächter für den Operanden innerhalb eines kom­bi­nier­ten Fragments. Nur wenn der Wert der Ein­schrän­kung wahr ist, startet das um­schlie­ßen­de In­ter­ak­ti­ons­frag­ment sein Verhalten. Die Ein­schrän­kung notieren Sie in eckigen Klammern auf der Le­bens­li­nie über einer Aus­füh­rungs­spe­zi­fi­ka­ti­on. Die Stan­dar­di­sie­rung lässt kom­bi­nier­te Fragmente ohne In­ter­ak­ti­ons­ein­schrän­kung zu. In diesem Fall geht das System davon aus, dass ein­ge­hen­de Nach­rich­ten wahr sind.

In­ter­ak­ti­ons­frag­men­te in Se­quenz­dia­gram­men

Wenn Sie ein Se­quenz­dia­gramm erstellen, sind Le­bens­li­ni­en und Nach­rich­ten die wich­tigs­ten Be­stand­tei­le. UML2 empfiehlt einen Rahmen für diesen Dia­gramm­ty­pen. Er ist aber keine Pflicht. Der Rahmen begrenzt einen Teil­pro­zess, das so­ge­nann­te In­ter­ak­ti­ons­frag­ment. Alle dafür nötigen Le­bens­li­ni­en und Nach­rich­ten befinden sich innerhalb des Rahmens. Er besteht aus einem Rechteck mit einem Label in der oberen linken Ecke. Das Kenn­zei­chen für ein Se­quenz­dia­gramm ist die Abkürzung sd, das meist gefettet wird. Daneben trägt man den Namen der In­ter­ak­ti­on ein, wie unten im Bild zu sehen.

Außer der optischen Be­gren­zung dient der Rahmen auch funk­tio­na­len Aspekten. Erstellen Sie mehrere Se­quenz­dia­gram­me (oder andere In­ter­ak­tio­nen), grenzt der Rahmen diese Dar­stel­lun­gen von­ein­an­der ab. Wollen Sie zeigen, dass die ver­schie­de­nen In­ter­ak­ti­ons­frag­men­te mit­ein­an­der kom­mu­ni­zie­ren, mo­del­lie­ren Sie eine Nachricht (gefüllter Pfeil) an die Rah­men­li­nie. Oben im Bild sendet das System Nachricht 5 nach außen. Den Punkt, an dem Pfeil auf Rahmen trifft, nennt man Gate. Dieses Element hat eine Funktion innerhalb des Diagramms, verfügt aber über keine eigene Notation.

In­ter­ak­ti­ons­frag­men­te gehören in UML zu den Knoten. Dieser Ober­be­griff ist sehr allgemein gefasst. Die Ei­gen­schaf­ten und Aufgaben von Knoten spe­zi­fi­ziert UML in Ab­hän­gig­keit von dem je­wei­li­gen Dia­gramm­ty­pen, in dem ein be­stimm­ter Knoten vorkommt. Generell kann man sagen: Knoten sind Mo­dell­ele­men­te innerhalb eines Systems oder Prozesses, auf denen ein Artefakt in­stal­liert werden kann. Knoten verbindet UML durch Kanten. Kanten stellen den In­for­ma­ti­ons­aus­tausch grafisch durch Pfeile oder einfache Linien dar.

In UML können Sie Se­quenz­dia­gram­me erstellen, die ver­schach­tel­te Teil­seg­men­te be­inhal­ten. Rahmen helfen, die einzelnen Fragmente geordnet dar­zu­stel­len.

Se­quenz­dia­gram­me können die In­ter­ak­ti­ons­frag­men­te In­ter­ak­ti­ons­nut­zen, Zu­stands­in­va­ri­an­ten, Er­eig­nis­auf­tritts­spe­zi­fi­ka­ti­on, Aus­füh­rungs­spe­zi­fi­ka­ti­on und kom­bi­nier­te Fragmente be­inhal­ten.

In­ter­ak­ti­ons­nut­zen

In­ter­ak­ti­ons­nut­zen bilden eine Un­ter­klas­se, die Notation, Aufbau und Verhalten zweier Me­ta­klas­sen fest­schreibt. Diese Me­ta­klas­sen sind In­ter­ak­ti­ons­nut­zen und Teil-De­kom­po­si­ti­on.

Der In­ter­ak­ti­ons­nut­zen als Me­ta­klas­se ist ein In­ter­ak­ti­ons­frag­ment, das eine andere In­ter­ak­ti­on aufruft oder nutzt. Wenn Ihr Se­quenz­dia­gramm zu komplex wird, sorgen Sie mit diesem Verweis für mehr Über­sicht­lich­keit. Denn die In­ter­ak­ti­on, auf die der In­ter­ak­ti­ons­nut­zen verweist, sehen Sie im aktuellen Diagramm in einer Black-Box-Ansicht. Um die auf­ge­ru­fe­ne In­ter­ak­ti­on eindeutig iden­ti­fi­zie­ren zu können, geben Sie folgende Syntax im Körper an (Feld, in dem Instanzen Ope­ra­tio­nen durch­füh­ren):

  • At­tri­but­na­me (Attribut einer Le­bens­li­nie im In­ter­ak­ti­ons­nut­zen, die den Rück­ga­be­wert erhält)
  • Kol­la­bo­ra­ti­ons­na­me (iden­ti­fi­zier­te Kol­la­bo­ra­ti­ons­nut­zen, die In­ter­ak­tio­nen und Kol­la­bo­ra­tio­nen an­ein­an­der­knüp­fen)
  • In­ter­ak­ti­ons­na­me des auf­ge­ru­fe­nen Elements
  • io-Argument: In/Out-Argumente der In­ter­ak­ti­on
  • Rück­ga­be­wert (Antwort der auf­ge­ru­fe­nen In­ter­ak­ti­on)

Den In­ter­ak­ti­ons­nut­zen mo­del­lie­ren Sie als Rechteck mit einem fünf­ecki­gen Label in der linken, oberen Ecke. Darin tragen Sie das Kürzel „ref“ ein (von Englisch: „referral“).

Da In­ter­ak­ti­ons­nut­zen auf andere Diagramme verweisen, bestimmen diese äußeren Faktoren ihr Verhalten. Während die verlinkte In­ter­ak­ti­on formale Tore (Englisch: Gates) aufweist, verfügt die ver­wei­sen­de In­ter­ak­ti­on über das tat­säch­li­che Tor.

Die Teil-De­kom­po­si­ti­on (Englisch: Part-De­com­po­si­ti­on) ist die teilweise, se­quen­ti­el­le Zerlegung einer Le­bens­li­nie innerhalb einer In­ter­ak­ti­on durch eine andere In­ter­ak­ti­on. Mithilfe solch einer Zerlegung können Sie Details von­ein­an­der trennen und so einzelne Teil­funk­tio­nen genauer be­trach­ten. Gehen Nach­rich­ten von der zerlegten Le­bens­li­nie ein oder aus, gelten sie als tat­säch­li­che Gates. Diese stehen mit den formalen Gates der De­kom­po­si­ti­ons­ak­ti­on in Ver­bin­dung. Gates und Parameter beider Elemente müssen über­ein­stim­men. Als In­ter­ak­ti­ons­nut­zen erhält die Teil-De­kom­po­si­ti­on auch das Label „ref“ und wird durch die ver­bun­de­ne In­ter­ak­ti­on definiert.

Ak­ti­vi­täts­bal­ken/Aus­füh­rungs­spe­zi­fi­ka­ti­on

Der Ak­ti­vi­täts­bal­ken, im Eng­li­schen Execution Spe­ci­fi­ca­ti­on (um­gangs­sprach­lich schlicht: Ak­ti­vie­rung), steht für die Zeit auf einer Le­bens­li­nie, in der ein Objekt ein Verhalten ausführt oder eine Aktion durch­läuft. Außerdem mo­del­lie­ren Sie damit die Zeit, in der ein in­vol­vier­tes Objekt entweder eine Nachricht sendet oder auf eine Antwort wartet. Denn der Ak­ti­vi­täts­bal­ken steht für einen abs­trak­ten Zeit­ab­schnitt während der Laufzeit. Wie es ohnehin für das ganze Diagramm gilt, ist Zeit dabei keine absolute Größe, sondern relativ. Passives Verhalten wie das Warten auf eine Antwort muss ebenfalls als Ak­ti­vie­rung in das Se­quenz­dia­gramm ein­ge­tra­gen werden.

Die Spur­ense­man­tik einer Aus­füh­rungs­spe­zi­fi­ka­ti­on stellt UML durch die simple Struktur <start,ende> dar. Die Notation für die Exec­tu­ti­on Spe­ci­fi­ca­ti­on lässt zwei Formen zu. Mo­del­lie­ren Sie ein langes, schmales Viereck mit grauer Füllung auf die Le­bens­li­nie. Nor­ma­ler­wei­se be­inhal­tet die Ak­ti­vie­rung in dieser Form kein Label im Körper. Al­ter­na­tiv zeichnen Sie ein etwas breiteres, weiß gefülltes Rechteck auf die Le­bens­li­nie. Dort haben Sie Platz, um dem Ak­ti­vi­täts­bal­ken ein Label zu geben. Führt ein Objekt eine Aktion während der Laufzeit durch, geben Sie dort den Ak­ti­ons­na­men an.

Anfang und Ende markieren die Er­eig­nis­auf­tritts­spe­zi­fi­ka­tio­nen, kurz Auf­tritts­spe­zi­fi­ka­ti­on (Englisch: Event Oc­cur­rence Spe­ci­fi­ca­ti­on). Am Anfang einer Ak­ti­vie­rung steht das Start­ereig­nis, am Ende das Ab­schluss­ereig­nis. Diese Fragmente re­prä­sen­tie­ren jeweils einen einzelnen Moment und exis­tie­ren auf einer einzigen Le­bens­li­nie. Die Er­eig­nis­auf­tritts­spe­zi­fi­ka­ti­on steht für den Anstoß oder das Ende einer Aktion. Die Nach­rich­ten­auf­tritts­spe­zi­fi­ka­ti­on (Message Oc­cur­rence Spe­ci­fi­ca­ti­on) gibt das Signal zum Senden und Empfangen einer Nachricht. Somit hängt deren Wert immer von der Nachricht oder Aktion ab.

Die Ak­ti­vie­rung hat keine ge­son­der­te Notation. Sie existiert implizit an den äußeren Rändern des Rechtecks der Aus­füh­rungs­spe­zi­fi­ka­ti­on. Durch­läuft die Aus­füh­rungs­spe­zi­fi­ka­ti­on eine atomare Aktion, verweisen Anfangs- und End-As­so­zia­tio­nen auf dieselbe Auf­tritts­spe­zi­fi­ka­ti­on. Das können Sie mit einer Ver­bin­dungs­li­nie zwischen Aktion und ein­ge­hen­der Auf­tritts­spe­zi­fi­ka­ti­on her­vor­he­ben.

Fakt

Eine atomare Aktion erscheint wie eine Blackbox. Es ist eine nicht teilbare Sequenz mehrerer simpler Ope­ra­tio­nen, die man nicht be­ob­ach­ten kann, weil sie extrem schnell aus­ge­führt werden. Eine atomare Aktion erscheint daher un­mit­tel­bar ab­ge­schlos­sen.

Während andere Auf­tritts­spe­zi­fi­ka­tio­nen keine Notation erfordern, kenn­zeich­nen Sie die Nach­rich­ten-Auf­tritts­spe­zi­fi­ka­ti­on Zer­stö­rung mit einem großen X. Sie markiert die Auflösung einer Ob­jekt­in­stanz an einem be­stimm­ten Punkt auf der Le­bens­li­nie. Die Le­bens­li­nie endet damit. Un­ter­ge­ord­ne­te Instanzen oder Auf­tritts­spe­zi­fi­ka­tio­nen an späteren Punkten der Timeline sind dann invalide. Denn nach der Zer­stö­rung des Objekts exis­tie­ren auch sie nicht mehr.

Manchmal über­lap­pen sich Aus­füh­rungs­spe­zi­fi­ka­tio­nen. Wenn ein Objekt bei­spiels­wei­se eine Nachricht an sich selbst schickt, sendet eine Execution Spe­ci­fi­ca­ti­on eine Nachricht an eine andere Instanz dieser Klasse. Beide Spe­zi­fi­ka­tio­nen liegen teilweise zeit­gleich auf derselben Le­bens­li­nie. Im UML-Se­quenz­dia­gramm stellen Sie diesen Umstand mit über­lap­pen­den Recht­ecken dar.

Zu­stands­in­va­ri­an­te

Die Zu­stands­in­va­ri­an­te ist eine Laufzeit-Ein­schrän­kung. Die Le­bens­li­nie re­prä­sen­tiert ein Objekt. Während der Laufzeit ändert dieses Objekt durch die Aus­füh­rungs­spe­zi­fi­ka­ti­on seinen Zustand. Die Zu­stands­in­va­ri­an­te un­ter­sucht das Objekt hin­sicht­lich seiner Zu­stands­än­de­rung in der Aus­füh­rungs­spe­zi­fi­ka­ti­on – und zwar direkt bevor es die nächste Auf­tritts­spe­zi­fi­ka­ti­on ausführt. Alle vor­her­ge­hen­den, im­pli­zi­ten Aktionen innerhalb der Aus­füh­rungs­spe­zi­fi­ka­ti­on gelten dann als aus­ge­führt.

Die Zu­stands­in­va­ri­an­te gibt einen ein­schrän­ken­den Wert vor. Ist dieser Wert gleich dem Ob­jekt­zu­stand, gilt die Spur als valide. Erfüllt das Objekt die Ein­schrän­kung nicht, ist seine Spur ungültig.

Laut der UML-Se­quenz­dia­gramm-Notation steht die Zu­stands­in­va­ri­an­te entweder in ge­schweif­ten Klammern auf der Aus­füh­rungs­spe­zi­fi­ka­ti­on oder Sie nutzen das ab­ge­run­de­te Rechteck der Klasse Zustand.

Kom­bi­nier­te Fragmente

Kom­bi­nier­te Fragmente gehören zu den In­ter­ak­ti­ons­frag­men­ten. Diese Fragmente sind abstrakte Elemente des Systems. Sie stehen für In­ter­ak­ti­ons­ein­hei­ten. Das heißt, dass sie zum einen Teil einer In­ter­ak­ti­on sind. Zum anderen sind sie aber auch selbst kleine In­ter­ak­tio­nen. Kom­bi­nier­te Fragmente in einem Se­quenz­dia­gramm legen das Verhalten mehrerer In­ter­ak­ti­ons­frag­men­te fest. Sie selbst bilden aber nur den Rahmen. Denn sie werden von In­ter­ak­ti­ons­ope­ra­to­ren und In­ter­ak­ti­ons­ope­ran­den definiert. Operanden be­inhal­ten eine oder mehrere Nach­rich­ten. Auf der Le­bens­li­nie vor einem kom­bi­nier­ten Fragment wacht dann eine Ein­schrän­kung, auch Guard genannt, über den be­inhal­te­ten Operanden.

Wie bereits be­schrie­ben, sind Operanden konstante oder variable Größen, die einen Prozess durch­lau­fen. Ope­ra­to­ren be­ein­flus­sen das Verhalten der Operanden. Zum Beispiel kann der boolesche Operator „OR“ vor­schrei­ben, dass Operand A oder Operand B aus­ge­führt wird (oder beide aus­ge­führt werden). Innerhalb eines kom­bi­nier­ten Fragments legt ein Operand fest, dass unter be­stimm­ten Vor­aus­set­zun­gen eine bestimmte Nachricht gesendet wird. Der Operator legt fest, welche Be­zie­hun­gen Operanden innerhalb eines Fragments zu­ein­an­der haben und welche Beziehung sie zum über­ge­ord­ne­ten Fragment haben.

In­ter­ak­ti­ons­ope­ra­to­ren

UML definiert 12 In­ter­ak­ti­ons­ope­ra­to­ren.

Al­ter­na­ti­ve:

Im Rahmen des kom­bi­nier­ten Fragments mit dem In­ter­ak­ti­ons­ope­ra­tor „Al­ter­na­ti­ve“ kann ein un­ter­ge­ord­ne­tes Fragment nur eine Nachricht senden, wenn eine bestimmte Bedingung erfüllt wird. An­dern­falls sendet ein kon­kur­rie­ren­des Fragment innerhalb des Rahmens seine Nachricht. Im oberen Bild sehen Sie ein Beispiel für ein kom­bi­nier­tes Fragment mit dem Operator „Al­ter­na­ti­ve“. Für das Label nutzen Sie das Kürzel „alt“. Den recht­ecki­gen Rahmen teilen Sie durch eine ho­ri­zon­ta­le, ge­stri­chel­te Linie auf. Der obere Bereich stellt eine Bedingung.

Guard:

Der Guard (Wächter) un­ter­sucht, ob die Bedingung des Operanden erfüllt wird. Falls ja, sendet das System eine Nachricht im Bereich der Bedingung. Falls nicht, sendet es eine Nachricht im Bereich der Al­ter­na­ti­ve. Ein Operand innerhalb dieses kom­bi­nier­ten Fragments braucht immer einen Guard, der als wahr („true“) beurteilt wird, um aus­ge­führt zu werden. Hat der Be­din­gungs­ope­rand keinen ex­pli­zi­ten Guard, wird ein im­pli­zi­ter Guard vor­aus­ge­setzt. Dieses Fragment stellt also immer eine Entweder-oder-Ent­schei­dung dar.

Option:

Dieses kom­bi­nier­te Fragment mo­del­liert man im Se­quenz­dia­gramm wie die Al­ter­na­ti­ve. Denn die Option steht auch für eine Ent­schei­dung. Es gibt jedoch nur einen Operanden. Die Ent­schei­dung besteht also darin, ob der Operand aus­ge­führt wird oder nicht. Der Operand mit einer Bedingung darf nicht leer sein. Seine Al­ter­na­ti­ve hingegen ist leer. Ein Fragment mit dem In­ter­ak­ti­ons­ope­ra­tor „Option“ markieren Sie mit dem Label „opt“.

Un­ter­bre­chung:

Ein kom­bi­nier­tes Fragment mit dem In­ter­ak­ti­ons­ope­ra­tor „break“ un­ter­bricht das über­ge­ord­ne­te Fragment. Erfüllt eine Le­bens­li­nie die Bedingung des Operanden, führt das System das kom­bi­nier­te Fragment aus. Dafür ignoriert es den Rest des über­ge­ord­ne­ten Fragments. Damit alle Le­bens­li­ni­en ihre Le­bens­dau­er aus­schöp­fen können, sollten Sie jede Le­bens­li­nie im kom­bi­nier­ten Fragment einbinden. An­dern­falls stoppt womöglich eine Le­bens­li­nie mitten im Prozess, ohne or­dent­lich zerstört zu werden. Fehlt dem Break-Fragment ein Guard, ist die Ent­schei­dung nicht­de­ter­mi­nis­tisch. Wir empfehlen daher, einen Guard zu verwenden.

Fakt

Nicht­de­ter­mi­nis­mus ist in der theo­re­ti­schen In­for­ma­tik ein Konzept, das Mo­del­lie­rung ver­ein­fa­chen soll. Dabei hat ein System bei einem gleichen Aus­gangs­wert mehr als eine Mög­lich­keit, zu einem Ergebnis zu kommen. In der Praxis verwendet man haupt­säch­lich de­ter­mi­nis­ti­sche Al­go­rith­men mit nur einem Be­rech­nungs­weg. Ein nicht­de­ter­mi­nis­ti­scher Al­go­rith­mus geht hingegen einen nicht vor­her­seh­ba­ren Weg bei der Be­rech­nung, auch wenn Sie das System mit den gleichen Angaben starten. Da der Al­go­rith­mus im Vergleich meist zu deutlich mehr un­ter­schied­li­chen Er­geb­nis­sen kommt als ein de­ter­mi­nis­ti­scher Al­go­rith­mus, sollte die gestellte Aufgabe weniger komplex sein. Abstrakte Modelle ver­ein­fa­chen komplexe Systeme. Daher eignen sie sich dafür, un­ter­schied­li­che Be­rech­nun­gen mit dem nicht­de­ter­mi­nis­ti­schen Al­go­rith­mus durch­zu­spie­len.

Die Schleife:

Ein kom­bi­nier­tes Fragment mit dem In­ter­ak­ti­ons­ope­ra­tor „loop“ wie­der­holt seinen Operanden. Die genaue Anzahl der Durch­läu­fe bestimmt der Guard. Dieser Wächter kann Wie­der­ho­lungs­schran­ken und boolesche Variablen umfassen. Die Wie­der­ho­lungs­schran­ken notieren Sie im Rahmen-Label fol­gen­der­ma­ßen: loop (X,Y). Die Variablen X und Y stehen jeweils für eine na­tür­li­che Zahl. X ist die minimale Wie­der­ho­lungs­zahl („min-int“). Y ist die maximale Wie­der­ho­lungs­zahl („max-int“). X muss dabei eine nicht-negative Zahl sein, Y eine nicht-negative Zahl, die gleich groß oder größer ist als die minimale (also > 0).

Die boolesche Variable notieren Sie optional im Rah­men­kör­per neben dem Label. Sie schränkt die Wie­der­ho­lung weiter ein. Wird die Bedingung der boole­schen Variable nicht mehr erfüllt und die minimale Wie­der­ho­lungs­zahl ist erreicht, stoppt der Loop. Notieren Sie die Ein­schrän­kung in eckigen Klammern. Diese Ein­schrän­kung bezieht sich auf externe Faktoren wie Eingaben eines Akteurs.

An einem Geld­au­to­ma­ten hat man bei­spiels­wei­se dreimal die Mög­lich­keit, die richtige PIN-Nummer ein­zu­ge­ben. Ist der PIN falsch, wird man auf­ge­for­dert die Eingabe zu wie­der­ho­len. Im UML-Se­quenz­dia­gramm notieren Sie die Nachricht „PIN-Eingabe“ und deren Antwort „Falscher PIN. Versuchen Sie es erneut.“ mit den ent­spre­chen­den Pfeilen. Das Label hat die Form Loop (0,2). Die boolesche Variable ist [falscher PIN]. Solange der PIN falsch ist, widerholt sich der Loop zweimal. Ist der PIN richtig, löst das System den Loop auf. Wird die maximale Wie­der­ho­lungs­zahl über­schrit­ten, löst sich der Loop ebenso, aber der Vorgang wird als ungültig ab­ge­bro­chen.

Hinweis

Geben Sie keine Wie­der­ho­lungs­schran­ken an, ist das Minimum 0 und das Maximum unendlich. Geben Sie nur eine Schranke an, haben Minimum und Maximum den gleichen Wert.

Parallel:

Nor­ma­ler­wei­se schreibt die Position eines Pfeils auf der Le­bens­li­nie im Se­quenz­dia­gramm immer eine chro­no­lo­gi­sche Ordnung vor. In einem kom­bi­nier­ten Fragment mit dem In­ter­ak­ti­ons­ope­ra­tor Parallel dürfen dessen Operanden ihre Prozesse gleich­zei­tig ausführen. Po­ten­zi­ell ver­flech­ten die Operanden ihre Pro­zess­ord­nung. Die vor­ge­ge­be­ne Ordnung innerhalb der Operanden wird dabei aber immer bei­be­hal­ten. Im UML-Se­quenz­dia­gramm mo­del­lie­ren Sie dieses kom­bi­nier­te Fragment mit einem durch­ge­hen­den Rahmen. Die ver­schie­de­nen Operanden trennen Sie optisch durch ge­stri­chel­te Linien, ähnlich wie bei der Al­ter­na­ti­ve. Im Label tragen Sie das Kürzel „par“ ein (siehe Abbildung unter Critical Region). Sollen Operanden auf einer einzigen Le­bens­li­nie parallel arbeiten, erlaubt UML eine Abkürzung: Die Co-Region erfüllt genau diese Aufgabe. Dafür fassen Sie einfach die be­trof­fe­nen Er­eig­nis­ein­trit­te mit einer eckigen Klammer zusammen.

Kri­ti­scher Abschnitt:

Mithilfe eines kri­ti­schen Ab­schnitts vermeidet das System Fehler, die auftreten können, wenn sich mehrere Prozesse Res­sour­cen teilen. Innerhalb dieses Sys­tem­be­reichs nutzt immer nur ein Prozess zu einem be­stimm­ten Zeitpunkt die Ressource. Zudem prio­ri­siert das System den je­wei­li­gen Prozess. Mit dem Label „critical“ de­fi­nie­ren Sie einen kri­ti­schen Abschnitt (Englisch: Critical Region). Dieser ver­hin­dert, dass mög­li­cher­wei­se andere In­ter­ak­ti­ons­ope­ra­to­ren in einem über­ge­ord­ne­ten Fragment Einfluss nehmen. Zum Beispiel blockiert es im Se­quenz­dia­gramm ver­schach­tel­te Spuren eines par­al­le­len, kom­bi­nier­ten Fragments.

Eine Gas­an­bie­ter-Hotline nimmt in der oberen Grafik mehrere Anrufe parallel an und leitet diese gleich­zei­tig an Hotline-Mit­ar­bei­ter weiter. Handelt es sich aber um einen Notfall mit Verdacht auf Gasgeruch, prio­ri­siert das System die Nachricht und leitet den Anruf über den kri­ti­schen Abschnitt an den Not­fall­dienst. Der kritische Abschnitt hindert In­for­ma­ti­ons­strö­me aus dem über­ge­ord­ne­ten Fragment, parallel mit der Nachricht aus dem kri­ti­schen Abschnitt be­ar­bei­tet zu werden. Nur Le­bens­li­ni­en im kri­ti­schen Abschnitt verhalten sich so.

Assertion:

Der In­ter­ak­ti­ons­ope­ra­tor „assertion“ (auch Zu­si­che­rung oder Si­cher­stel­lung) legt den Zustand von Fort­set­zun­gen fest. Sequenzen innerhalb eines Operanden mit dem Label assert gelten als valide Fort­set­zun­gen. Die Zu­si­che­rung behauptet, dass alle Sequenzen außerhalb des Fragments in un­gül­ti­gen Spuren enden.

Igno­rie­ren/Be­rück­sich­ti­gen:

Ein UML-Se­quenz­dia­gramm stellt einen Sys­tem­teil de­tail­liert dar. Manche Nach­rich­ten benötigen Sie für die Ansicht nicht. Andere wollen Sie be­rück­sich­ti­gen. Mit dem In­ter­ak­ti­ons­ope­ra­tor „ignore“ klammern Sie bestimmte Nach­rich­ten aus. Diese In­for­ma­tio­nen tauchen im System auf einer Spur auf, aber nicht im ignore-Fragment. Die Notation schreibt ein Label in dieser Form vor: ignore {Nachricht1,Nachricht2}.

Kom­bi­nier­te Fragmente mit dem In­ter­ak­ti­ons­ope­ra­tor „consider“ hingegen be­rück­sich­ti­gen bestimmte Nach­rich­ten in einem Fragment. Alle anderen Nach­rich­ten, die durch das Fragment laufen, ignoriert das System. Zu be­rück­sich­ti­gen­de Nach­rich­ten setzen Sie ebenfalls in ge­schwun­ge­ne Klammern: consider {Nachricht3,Nachricht4}.

Diese beiden Ope­ra­to­ren haben ge­gen­sätz­li­che Aufgaben. Beide kommen aber häufig in ver­schach­tel­ten Frag­men­ten vor. Zum Beispiel kom­bi­nie­ren Mo­del­lie­rer häufig assert mit ignore (in dieser Form: assert ignore {Msg1, Msg2}) oder assert und consider (in dieser Form: assert consider {Msg3, Msg4}).

Negativ:

Um einen Sys­tem­feh­ler zu kenn­zeich­nen, nutzt man den In­ter­ak­ti­ons­ope­ra­tor „negativ“. Das kom­bi­nier­te Fragment umfasst also ungültige Spuren. Der Operator kommt bei­spiels­wei­se zum Einsatz, wenn Sie ein Log-in-Verfahren über ein Se­quenz­dia­gramm dar­stel­len. Mo­del­lie­ren Sie die Le­bens­li­nie eines Akteurs auf dem Weg zum Time-out, umrahmen Sie diese Feh­ler­nach­richt mit dem Negativ-Fragment. Das Label dafür ist neg. Durch die explizite Mo­del­lie­rung un­gül­ti­ger Spuren im negativen kom­bi­nier­ten Fragment gelten alle anderen Fragmente als positiv. Ihre Spuren sind valide.

Strikte Se­quen­zie­rung:

Innerhalb eines kom­bi­nier­ten Fragments kann es wichtig sein, eine strikte Ordnung ein­zu­hal­ten. Das Label strict erlegt seinen Operanden eine strikte Se­quen­zie­rung auf. Dies gilt für das erste Level des Fragments. Operanden in weiter ver­schach­tel­ten Frag­men­ten un­ter­lie­gen ihrer eigenen Ordnung.

Schwache Se­quen­zie­rung:

Kom­bi­nier­te Fragmente mit dem In­ter­ak­ti­ons­ope­ra­tor „sequence“ stehen für eine schwache Ordnung. Das Verhalten zwischen den Operanden im Fragment be­ein­flusst Spu­ren­ei­gen­schaf­ten statt den In­ter­ak­ti­ons­ope­ra­to­ren. So kann eine schwache Se­quen­zie­rung wie ein parallel-Fragment agieren. Das passiert, wenn Operanden auf un­ter­schied­li­chen Le­bens­li­ni­en teil­neh­men. Im Gegenzug ver­wan­delt sich die schwache Se­quen­zie­rung in eine strikte Ordnung, wenn ihre Operanden auf derselben Le­bens­li­nie auftreten. Das Label ist seq.

Spuren mit den folgenden Ei­gen­schaf­ten de­fi­nie­ren die schwache Se­quen­zie­rung:

  1. Er­eig­nis­spe­zi­fi­zie­run­gen innerhalb eines Operanden behalten ihre Ordnung.
  2. Er­eig­nis­spe­zi­fi­zie­run­gen, die auf un­ter­schied­li­chen Le­bens­li­ni­en agieren und nicht innerhalb desselben Operanden auftreten, treten in be­lie­bi­ger Ordnung auf.
  3. Agieren die Er­eig­nis­spe­zi­fi­ka­tio­nen auf derselben Le­bens­li­nie, aber in un­ter­schied­li­chen Operanden, schreibt ihre Stelle auf der Le­bens­li­nie ihre Ordnung vor. Der erste Operand kommt also vor dem zweiten Operanden.

Fort­set­zung:

Die Fort­set­zung (Englisch: Con­ti­nua­tion) ist kaum ein ei­gen­stän­di­ges Fragment. Nur in den kom­bi­nier­ten Frag­men­ten Al­ter­na­ti­ve und schwache Sequenz erhält sie eine eigene Semantik. Diese schreibt für die Fort­set­zung die gleiche Form wie für Zustände vor: Ein Rechteck mit ab­ge­run­de­ten Ecken. Im Gegensatz zum Zustand deckt eine Fort­set­zung optional mehrere Le­bens­li­ni­en ab.

Abhängig davon, wie Sie die Fort­set­zung im Se­quenz­dia­gramm anordnen, ändert sich auch ihre Aufgabe. Steht die Fort­set­zung am Anfang Ihres In­ter­ak­ti­ons­dia­gramms, mo­del­lie­ren Sie damit das Verhalten der Fort­set­zung. Steht die Fort­set­zung am Ende Ihres In­ter­ak­ti­ons­frag­ments, leitet sie den Prozess weiter. Benennen Sie Ihre Fort­set­zung (wie im Beispiel: nichtOK), muss das nächste Fragment auf der Le­bens­li­nie eine Fort­set­zung mit gleichem Namen (nichtOK) aufweisen oder es darf keine Fort­set­zung mo­del­lie­ren. Steht die Fort­set­zung alleine im Fragment, ent­spricht das einer Fort­set­zung am Ende des Fragments.

Fazit

Wollen Sie An­wen­dungs­bei­spie­le de­tail­liert dar­stel­len oder ein System auf seine Logik prüfen, erstellen Sie ein Se­quenz­dia­gramm. Die Notation erlaubt Ihnen, den Nach­rich­ten­fluss über die ganze Le­bens­zeit eines Objekts zu mo­del­lie­ren. Selbst komplexe Ope­ra­tio­nen stellen Sie mithilfe ver­schach­tel­ter In­ter­ak­ti­ons­frag­men­te über­sicht­lich dar. Das Se­quenz­dia­gramm ist nicht zu Unrecht eines der meist genutzten UML-Ver­hal­tens­dia­gram­me.

Zum Hauptmenü