Das Ak­ti­vi­täts­dia­gramm ist ein Dia­gramm­typ innerhalb der Unified Modeling Language (UML). Diese grafische Mo­del­lie­rungs­spra­che legt Formen für die Dar­stel­lung ob­jekt­ori­en­tier­ter Pro­gram­mie­rung fest. Sie spe­zi­fi­ziert 14 Dia­gramm­ty­pen. Diesen sind jeweils bestimmte Formen zu­ge­ord­net. Mithilfe der No­ta­ti­ons­re­geln lassen sich Systeme und Prozesse abs­tra­hie­ren sowie über­sicht­lich dar­stel­len. UML mo­del­liert nicht nur Software-Systeme, sondern auch Ge­schäfts­pro­zes­se. In beiden Bereichen sind Ak­ti­vi­täts­dia­gram­me besonders prak­ti­sche Helfer. Doch zu welchem Zweck sollte man ein Ak­ti­vi­täts­dia­gramm erstellen?

Der Zweck von Ak­ti­vi­täts­dia­gram­men

UML-Ak­ti­vi­täts­dia­gram­me (im Eng­li­schen activity diagrams) gehören zur Gruppe der Ver­hal­tens­dia­gram­me in der UML. Während ein Struk­tur­dia­gramm den Zustand eines Systems erfasst, also die vor­han­de­nen Objekte und deren Hier­ar­chien sowie Ver­bin­dun­gen un­ter­ein­an­der zu einem be­stimm­ten Zeitpunkt, be­schrei­ben Ver­hal­tens­dia­gram­me den chro­no­lo­gi­schen Fluss der Da­ten­strö­me. Neben dem Ak­ti­vi­täts­dia­gramm gehören das An­wen­dungs­fall­dia­gramm (use case diagram) und das Zu­stands­au­to­ma­ten­dia­gramm (state machine diagram) zu dieser Gruppe. Ak­ti­vi­täts­dia­gram­me ähneln in ihrer Ver­wen­dung und Notation den Fluss­dia­gram­men (besonders Pro­gramm­ab­lauf­plä­ne), sind aber auf die ob­jekt­ori­en­tier­te Pro­gram­mie­rung zu­ge­schnit­ten.

Grund­sätz­lich kann man sagen: Das Ak­ti­vi­täts­dia­gramm mo­del­liert den Ablauf von Ak­ti­vi­tä­ten. Das können Prozesse innerhalb eines Com­pu­ter­sys­tems, Use-Case-Abläufe oder Ge­schäfts­ab­läu­fe sein. Die Aktivität, z. B. „ein Käse-Omelette zu­be­rei­ten“, zerfällt dabei in viele kleine Teil-Ak­ti­vi­tä­ten: die Aktionen. Diese können etwa chro­no­lo­gisch statt­fin­den. Eine Aktion wäre bei­spiels­wei­se „Eier auf­schla­gen“, gefolgt von der Aktion „Eier mit Gewürzen ver­quir­len“. Die erste Aktion bedingt die zweite. Sie sind sozusagen im Fluss.

Auch parallele Abläufe sind damit dar­stell­bar. Kümmern sich zwei Leute um die Zu­be­rei­tung eines Omeletts, er­mög­licht das die gleich­zei­ti­gen Aktionen „Eier auf­schla­gen“ und „Kräuter hacken“. Somit hat die Aktivität zwei Start­punk­te. Von diesen Punkten aus starten die Personen mit ihrer Aktivität. Dabei gehen sie von einer Aktion zur nächsten über. In einem An­wen­dungs­fall wären diese Personen Akteure. Im Ak­ti­vi­täts­dia­gramm spielen sie zwar eine wichtige Rolle, erhalten aber keine eigene Notation. Sie bewegen sich von einem Start­punkt zu einem Endpunkt und durch­que­ren dabei Kontroll- oder Ob­jekt­flüs­se, um von einer Aktion zur nächsten zu gelangen. Da­zwi­schen gibt es ge­le­gent­li­che Schranken, so­ge­nann­te Pins, die sie nur unter be­stimm­ten Be­din­gun­gen durch­las­sen, z. B. wenn beide Personen anwesend sind.

Im Ak­ti­vi­täts­dia­gramm be­zeich­net man diese „Personen“ als Token. Es gibt zwei Arten von Token im UML-Ak­ti­vi­täts­dia­gramm: Die erste ist das Ob­jekt­to­ken, das eine In­for­ma­ti­on an den Ak­ti­ons­kno­ten über­mit­telt, dort eine Aktion startet und (soweit vor­ge­ge­ben) das Ergebnis als Wert speichert. Ent­spre­chen Ergebnis und Token den Vorgaben, die in einem Pin fest­ge­legt wurden, schickt dieser Aus­ga­be­pin das Ob­jekt­to­ken über einen Ob­jekt­fluss zur nächsten Aktion. Bevor das Token diese Aktion starten kann, muss es den Vorgaben des Ein­ga­be­pins ent­spre­chen. Kon­troll­to­ken hingegen wandern nur über Kon­troll­flüs­se und dienen als Marker. Sie starten eine Aktion, über­mit­teln aber keine Daten.

Im be­schrie­be­nen Beispiel „Käse-Omelette zu­be­rei­ten“ verwenden wir das Ak­ti­vi­täts­dia­gramm, um den zeit­li­chen Ablauf eines An­wen­dungs­falls dar­zu­stel­len. An­wen­dungs­fall­dia­gram­me hingegen stellen die Sys­tem­vor­aus­set­zun­gen dar, die im An­wen­dungs­fall gegeben sein sollten.

UML-2-Ak­ti­vi­täts­dia­gram­me können Sie natürlich nicht nur für An­wen­dungs­fäl­le des täglichen Lebens nutzen. Sie helfen Ihnen in erster Linie dabei, die Abläufe in Software-Systemen struk­tu­riert dar­zu­stel­len. Damit machen bei­spiels­wei­se Wirt­schafts­ana­lys­ten Vorgaben für Software-Ent­wick­ler. Über die grafische Sprache tauschen sich die Experten auf einer allgemein ver­ständ­li­chen und über­sicht­li­chen Ebene aus. Sind alle Abläufe geklärt und Fehler aus­ge­bü­gelt, dient das Ak­ti­vi­täts­dia­gramm als saubere Vorlage für die Pro­gram­mie­rung.

Binden Sie ein passendes UML-Tool in Ihre in­te­grier­te Ent­wick­lungs­um­ge­bung ein, kann das Diagramm mittels XML-Kon­ver­tie­rung in eine Pro­gram­mier­spra­che als Code-Framework agieren.

Die Object Ma­nage­ment Group (OMG), die die UML spe­zi­fi­ziert, fasst die möglichen Aufgaben von UML-2-Ak­ti­vi­täts­dia­gram­men wie folgt zusammen:

  • Pro­ze­du­ra­le Com­pu­ter­pro­gram­mie­rung, die Ak­ti­vi­tä­ten Hier­ar­chien zuweist
  • In ob­jekt­ori­en­tier­ten Modellen agieren Ak­ti­vi­tä­ten als Methoden, die Abläufe näher be­schrei­ben
  • Zur Dar­stel­lung von Workflows und Ge­schäfts­pro­zes­sen
  • Bei com­pu­ter­ge­stütz­ten An­wen­dungs­sys­te­men spe­zi­fi­zie­ren Ak­ti­vi­tä­ten Prozesse auf Sys­tem­le­vel

Die No­ta­tio­nen für UML-Ak­ti­vi­täts­dia­gram­me

Die Formen innerhalb der UML kann man als Satz­bau­stei­ne der Sprache verstehen. Deshalb ordnet die Mo­del­lie­rungs­spra­che jeder Form eine Bedeutung zu. Mo­di­fi­ka­to­ren be­schrei­ben diese näher und setzen sie in Bezug zu­ein­an­der. Zudem verlangen Formen teilweise bestimmte andere Formen oder Label, damit ein sinn­vol­les Diagramm entsteht. So wie ge­spro­che­ne Sprache nur sinnvoll ist, wenn gewisse gram­ma­ti­sche Grund­re­geln ein­ge­hal­ten werden, funk­tio­niert UML als Kom­mu­ni­ka­ti­ons­mit­tel nur, wenn Sie die Spe­zi­fi­ka­tio­nen einhalten.

UML 2.5 ist die ak­tu­ells­te Spe­zi­fi­ka­ti­on der Mo­del­lie­rungs­spra­che und wird daher die Grundlage dieser Aus­füh­run­gen dar­stel­len. UML legt die Notation der Dia­gramm­ty­pen auf Basis ihrer An­wen­dungs­ge­bie­te fest. Da das UML-Ak­ti­vi­täts­dia­gramm den Ablauf von Sys­tem­pro­zes­sen und An­wen­dungs­fäl­len abbildet, ordnet die Me­ta­mo­del­lie­rung ihm ent­spre­chen­de Formen zu.

Wie werden nun die einzelnen Be­stand­tei­le visuell dar­ge­stellt und welche Funk­tio­nen erfüllen die Symbole im UML Ak­ti­vi­täts­dia­gramm?

Ak­ti­vi­tä­ten

UML 2 spe­zi­fi­ziert eine Aktivität (englisch: activity) als Verhalten, das un­ter­ge­ord­ne­te Einheiten (Aktionen und Objekte) einer Rei­hen­fol­ge unterlegt. Dafür nutzt sie Daten- und Kon­troll­fluss-Modelle. Das Ak­ti­vi­täts­dia­gramm kann als Teil eines größeren Systems in Ver­bin­dung mit weiteren Dia­gramm­ty­pen dar­ge­stellt werden. Ein großes, ab­ge­run­de­tes Rechteck kenn­zeich­net die Aktivität als ab­ge­schlos­se­nes System (kann auch weg­ge­las­sen werden). Unten im Bei­spiel­bild sehen Sie die Aktivität „Spargel kochen“. Den Titel schreiben Sie in den Kopf des großen Rechtecks. Der Körper wiederum be­her­bergt Kanten (Pfeile) und Knoten (Rechtecke). Diese sym­bo­li­sie­ren die de­tail­lier­ten Aktionen, Objekte und Kontroll- bzw. Da­ten­flüs­se der Aktivität.

Ak­ti­vi­tä­ten gelten in UML als Klassen (deren Me­ta­klas­se ist das Verhalten). Somit lassen sie sich durch Ei­gen­schaf­ten näher bestimmen. Das kann un­ter­ge­ord­ne­te Elemente be­ein­flus­sen. Eine Aktivität gilt als ab­ge­schlos­sen, wenn ein Token von seinem Start­punkt über die Aktionen bis zum Endpunkt gewandert ist. Der Endpunkt zerstört das Token. Dies gilt auch für alle weiteren Token, sodass die Aktivität alle syn­chro­nen Aktionen stoppt.

Hinweis

UML 1 definiert Ak­ti­vi­täts­dia­gram­me anders als UML 2. Die frühere Version wies ihnen die Rolle eines spe­zia­li­sier­ten Zu­stands­ma­schi­nen­dia­gramms zu, was ihre Ein­satz­be­rei­che ein­grenz­te. Wenn Sie ein UML-Tool nutzen, sollten Sie daher darauf achten, dass es die ge­wünsch­te For­mu­lie­rung un­ter­stützt – idea­ler­wei­se UML 2.5 oder höher.

Aktionen: Ak­ti­vi­täts­kno­ten, die das Verhalten dar­stel­len

Eine Aktion (englisch: action, exe­cu­ta­ble node) ist ein Mo­dell­ele­ment, das der Aktivität hier­ar­chisch un­ter­ge­ord­net ist: Die Aktion ist eine Instanz der Klasse Aktivität. Aktionen re­prä­sen­tie­ren ein Verhalten innerhalb eines Systems. Sie sind die Grund­bau­stei­ne, mit denen Verhalten in UML aus­ge­drückt wird. Sie finden sowohl in Ak­ti­vi­täts­dia­gram­men als auch in In­ter­ak­tio­nen Ver­wen­dung.

Wenn Sie ein Ak­ti­vi­täts­dia­gramm erstellen, nutzen Sie die Notation „Aktion“, um die aus­führ­ba­ren Teil­be­rei­che einer Aktivität dar­zu­stel­len. Im Beispiel oben ist die Aktion „Spargel schälen und in Topf geben“ ein Schritt auf dem Weg zur Voll­endung der Aktivität „Spargel kochen“. Aktionen nehmen Input-In­for­ma­tio­nen auf, ver­ar­bei­ten diese und pro­du­zie­ren Output-In­for­ma­tio­nen. Eine Aktion hört nicht auf, bis sie ab­ge­schlos­sen ist.

Innerhalb der UML-Ak­ti­vi­täts­dia­gram­me gehören Aktionen zu den Ak­ti­vi­täts­kno­ten. So­ge­nann­te Kanten (Pfeile) verbinden die Aktionen mit­ein­an­der. Dabei un­ter­schei­det UML zwischen Ob­jekt­flüs­sen (Da­ten­flüs­se) und Kon­troll­flüs­sen (trans­por­tiert Kon­troll­to­ken). Aktionen ver­ar­bei­ten an sich nur Kon­troll­flüs­se. Wenn Da­ten­flüs­se zwischen Aktionen wandern, ak­zep­tie­ren Pins (Ob­jekt­kno­ten) die Ob­jekt­to­ken als Input, wandeln sie zur Ver­ar­bei­tung in der Aktion um und ge­ne­rie­ren an­schlie­ßend den Objekt-Output, der als Ob­jekt­to­ken wei­ter­wan­dert.

Fakt

Die Kategorie Ak­ti­vi­täts­kno­ten wurde in UML 2 ein­ge­führt. Es gibt drei Un­ter­ar­ten: Kon­troll­kno­ten, Ob­jekt­kno­ten und aus­führ­ba­re Knoten (die Aktionen). Zwischen diesen dreien gibt es keine Hier­ar­chien. Solange sie nicht hin­ter­ein­an­der­ge­schal­tet oder innerhalb einer Ak­ti­vi­täts­grup­pe näher definiert sind, können Sie in be­lie­bi­ger Rei­hen­fol­ge (also sobald ein­tref­fen­de Token die ge­stell­ten Be­din­gun­gen eines Knoten erfüllen) oder parallel aus­ge­führt werden.

Nur wenn die auf den Pins fest­ge­leg­ten Be­din­gun­gen erfüllt sind, gehen Daten eine Aktion ein (Ein­ga­be­pin) oder gibt die Aktion ein Ergebnis aus (Aus­ga­be­pin). Auch wenn eine Aktion mehrere ein­ge­hen­de Kon­troll­flüs­se aufweist, muss jeder einzelne ein Token anbieten, bevor eine Aktion startet.

Bei Aktionen innerhalb eines Ak­ti­vi­täts­dia­gramms enthält die abstrakte Syntax die einfache Form des ab­ge­run­de­ten Rechtecks. Es gibt jedoch spe­zi­fi­sche Aktionen, die Mo­del­lie­rer für genauere Be­schrei­bun­gen verwenden können. Einige davon drückt UML mit einer eigenen Notation aus. Das sind die Un­ter­ar­ten der Aktionen:

  1. Opaque Actions sind „un­durch­sich­ti­ge Aktionen“. Sie fungieren als Platz­hal­ter oder werden durch konkrete (nicht durch UML fest­ge­leg­te) Text­syn­tax spe­zi­fi­ziert.
  2. In­vo­ca­ti­on-Actions sind Aktionen, die ein be­stimm­tes Verhalten her­vor­ru­fen – direkt oder indirekt. Dazu gehören:
  • Call-Actions: Eine Call-Behavior-Action ruft direkt ein Verhalten auf. Eine Call-Operation-Action hingegen sendet eine Anfrage an ein Objekt, das ein ver­bun­de­nes Verhalten aufruft. Die Start-Object-Behavior-Action bringt ein Objekt direkt dazu, sein In­stanz­ver­hal­ten aus­zu­füh­ren. Ist keines fest­ge­legt, kann es das über­ge­ord­ne­te Klas­sen­ver­hal­ten (clas­si­fier-Behavior) anstoßen.

    Die Notation einer Aktion, die ein Verhalten her­vor­ruft, besteht aus einem ab­ge­run­de­ten Rechteck. Dort tragen Sie den Namen des jeweils auf­zu­ru­fen­den Ver­hal­tens ein. Call-Behavior-Actions markieren Sie zudem mit einem Dreizack-Symbol, wie im Bild unten zu sehen. Dies soll die weitere hier­ar­chi­sche Ver­zwei­gung dar­stel­len, die durch die Aktion entsteht.
  • Send-Actions: Sen­de­ak­tio­nen im Ak­ti­vi­täts­dia­gramm ver­schi­cken Daten immer asynchron (Se­quenz­dia­gram­me kennen bei­spiels­wei­se auch synchrone Nach­rich­ten). Das heißt, dass sie nicht auf eine Antwort vom Ziel­ob­jekt warten und somit den Ob­jekt­fluss nicht blo­ckie­ren. Die Aktion schließt ab, sobald die Nachricht aus­ge­sen­det wurde. Deshalb kann es zwar einen argument-Input haben, z. B. Parameter, pro­du­ziert aber keinen result-Output. Zudem können Nach­rich­ten gleich an mehrere Empfänger gehen. Send-Signal-Action, Broadcast-Signal-Action und Send-Object-Action gehören zu diesem Typ.

    Send-Signal-Actions weichen in ihrer Notation von der üblichen Form (dem ab­ge­run­de­ten Rechteck) ab. Statt­des­sen weist ein Fünfeck wie ein großer Pfeil in Richtung des ge­sen­de­ten Signals. Besteht der Inhalt einer Send-Object-Action auch aus einem Signal, können Sie dieselbe Notation verwenden.
  1. Object-Actions verändern den Zustand von Objekten (also Instanzen einer Klasse). Sie können diese er­schaf­fen oder zerstören, mit anderen Instanzen ver­glei­chen, sie auslesen und nach­fol­gend einer Klasse zuordnen oder die Klas­si­fi­zie­rung ändern. Folgende Instanzen von Ob­jekt­ak­tio­nen exis­tie­ren dem­entspre­chend unter UML 2:
  • Create-Object-Actions ge­ne­rie­ren Instanzen einer Klasse, also Objekte.
  • Destroy-Object-Actions zerstören das Objekt auf ihrem Input-Pin.
  • Test-Identity-Actions un­ter­su­chen, ob zwei Werte auf ihrem Input-Pin dasselbe Objekt dar­stel­len.
  • Read-Self-Actions ermitteln ihr eigenes Kon­text­ob­jekt.
  • Value-Spe­ci­fi­ca­ti­on-Actions un­ter­su­chen Wer­te­spe­zi­fi­ka­tio­nen. Die Notation trägt das Label value spe­ci­fi­ca­ti­on.
  • Read-Extent-Actions finden alle Objekte einer Klasse sowie Objekte von deren Spe­zi­fi­ka­tio­nen. Aus prak­ti­schen Gründen grenzen Mo­del­lie­rer meist die Reich­wei­te ein.
  • Re­clas­si­fy-Object-Actions ändern die Klasse für das Objekt auf ihrem Input-Pin.
  • Read-Is-Clas­si­fied-Object-Actions ermitteln, ob ein Objekt auf ihrem Input-Pin einer Klasse angehört.
  • Start-Clas­si­fier-Behavior-Actions stoßen für ein Objekt ein Verhalten an, das durch dessen Klasse bestimmt ist. Das Verhalten verläuft dann asynchron.
  1. Link-Actions verändern das Verhalten von As­so­zia­tio­nen (Be­zie­hun­gen zwischen Clas­si­fi­ern, meist zwei Klassen) und ihren Instanzen, den Links. Dazu gehören:
  • Read-Link-Actions rufen Werte (Link-End-Data) auf einer Seite einer As­so­zia­ti­on ab.
  • Create-Link-Actions erzeugen Links (sie besitzen keine Output-Pins, da Links an sich keine Daten sind) und Link­ob­jek­te.
  • Destroy-Link-Actions tilgen Links und Link­ob­jek­te, wenn diese einem fest­ge­leg­ten Link-End-Data-Wert ent­spre­chen.
  1. Link-Object-Actions be­ein­flus­sen ähnlich wie Link-Actions das Verhalten von Link­ob­jek­ten, be­trach­ten aber die Objekte unter anderen Ge­sichts­punk­ten. Das sind Instanzen von Link-Object-Actions:
  • Read-Link-Object-End-Actions rufen End­ob­jek­te von Link-Objekten ab.
  • Read-Link-Object-End-Qualifier-Actions rufen Clas­si­fier-Endwerte von Link-Objekten ab.
  • Create-Link-Object-Actions sind spezielle Create-Link-Actions, mit denen man Link-Objekte erzeugt.
  1. Struc­tu­ral-Feature-Actions bestimmen das Verhalten von Struk­tur­merk­ma­len in Ak­ti­vi­täts­dia­gram­men. Dafür benötigen sie einen Input-Pin, denn ihnen wird in der Regel sowohl ein Objekt als auch ein statisch spe­zi­fi­zier­tes Struk­tur­merk­mal eines Clas­si­fiers zu­ge­schrie­ben. Die Struk­tur­merk­mal-Aktion be­ein­flusst beide Elemente. Folgende Typen gibt es:
  • Read-Struc­tu­ral-Feature-Action lesen die Werte der Struk­tur­merk­ma­le und geben diese als Output weiter.
  • Add-Struc­tu­ral-Feature-Value-Actions benötigen ein Value-Input-Pin. Dieses gibt den Wert vor, den die Aktion einem Struk­tur­merk­mal zuweist.
  • Remove-Struc­tu­ral-Feature-Value-Actions ziehen einen Wert von einem Struk­tur­merk­mal ab. Ein Value-Input-Pin mit Mul­ti­pli­zi­tät 1..1 gibt diesen Wert vor.
  • Clear-Struc­tu­ral-Feature-Actions entfernen sämtliche Werte eines Struk­tur­ele­ments.
  1. Variable-Actions be­ein­flus­sen statisch spe­zi­fi­zier­te Variablen, die von einer Aktivität oder einem struk­tu­rier­ten Ak­ti­vi­täts­kno­ten (Struc­tu­red-Activity-Node) definiert werden. Es gibt drei Arten:
  • Add-Variable-Value-Actions benötigen ebenfalls einen Value-Input-Pin. Dieser muss vom gleichen Typ sein wie die Variable und fügt ihr genau einen Wert zu.
  • Remove-Variable-Value-Actions entfernen einen vom Pin vor­ge­ge­be­nen Wert.
  • Clear-Variable-Actions entfernen alle Werte einer Variablen.
  1. Accept-Event-Actions gehören zu den so­ge­nann­ten War­te­punk­ten (wait points). Das heißt, dass die Aktion auf ein Ereignis (Event) aus dem Er­eig­nis­pool des Kon­text­ob­jekts wartet. Die Aktion besitzt Trigger, also Auslöser, die beim Eintreten einer oder mehrerer vor­ge­schrie­be­ner Zustände die Aktion auslösen. UML be­schreibt drei Spe­zia­li­sie­run­gen:
  • Accept-Call-Actions verfügen über einen Trigger, der Call-Events (Ru­f­ereig­nis­se) ak­zep­tiert. Zwei Result-Output-Pins und ein Return-In­for­ma­ti­on-Output-Pin kom­plet­tie­ren das Ar­ran­ge­ment. Soll eine Reply-Action aus­ge­führt werden, lagern die nötigen In­for­ma­tio­nen dafür im Return-In­for­ma­ti­on-Output-Pin.
  • Reply-Actions verfügen über eine Ver­bin­dung zu den Accept-Call-Actions. Zum einen sollten die Trigger über­ein­stim­men, damit die Antwort-Aktion im Fall eines Call-Events auf die vorher aus­ge­führ­te Ruf­an­nah­me-Aktion reagieren kann. Zum anderen platziert das über­ge­ord­ne­te Verhalten deren Output-Wert im Return-In­for­ma­ti­on-Input-Pin der Reply-Action.
  • Un­mar­shall-Actions fragen die Werte von Objekt-Struk­tur­merk­ma­len ab. Um das Objekt zu erkennen, besitzen sie einen Objekt-Input-Pin. Die ge­won­ne­nen Werte gibt es auf einem Output-Pin aus.
Fakt

Müssen struk­tu­rier­te Daten eines Objekts oder auch ele­men­ta­re Daten eines Programm in andere Programme oder Pro­gramm­tei­le über­tra­gen werden oder will man diese speichern, so wandelt man sie in ein dafür ge­eig­ne­tes Format um. Dieser Prozess nennt sich Mar­shalling (auch: Mar­sha­ling). Der ge­gen­läu­fi­ge Prozess, Un­mar­shalling (bzw. Un­mar­sha­ling), wandelt diese „ein­ge­fro­re­nen“ Daten wieder in aus­führ­ba­re Objekte um. Ein Beispiel dafür ist die Über­tra­gung von UML-Dia­gram­men aus einem Tool mittels XML-Um­wand­lung in ein anderes Programm.

  1. Struc­tu­red Actions de­kla­riert UML 2 im Ak­ti­vi­täts­dia­gramm sowohl als Aktionen als auch als Ak­ti­vi­täts­grup­pe (s. o.). Das heißt zum einen, dass ihr Verhalten durch Ak­ti­vi­täts­kno­ten und -kanten bestimmt wird, zum anderen, dass bestimmte Un­ter­ar­ten dieser Aktionen aufgrund ihrer Semantik ein be­stimm­tes Verhalten für die aus­führ­ba­ren Knoten vor­schrei­ben – ins­be­son­de­re in Bezug auf deren Abfolge.

Das sind die Un­ter­ar­ten von struk­tu­rier­ten Aktionen:

  • Con­di­tio­nal-Nodes (Kon­di­tio­nal­kno­ten) bestehen aus einer oder aus mehreren Klauseln, die die un­ter­schied­li­chen Zweige der möglichen aus­führ­ba­ren Aktionen abbilden. Eine Klausel enthält ein Test- und ein Körper-Segment die wiederum schnitt­men­gen­freie, aus­führ­ba­re Knoten umfassen. Zuerst führt die Klausel die Aktion im Test-Bereich aus. Ist dessen Output-Wert true, führt die Klausel die Aktion im Körper-Bereich aus.
  • Loop-Nodes (Schlei­fen­kno­ten) be­schrei­ben eine Gruppe von Aktionen, die sich innerhalb einer Schleife wie­der­ho­len. Die Aktionen un­ter­tei­len sich in drei Ab­schnit­te: Setup, Test und Body. Der Loop führt immer zuerst das Setup aus. Danach folgen Test oder Body, die sich dann ab­wech­selnd wie­der­ho­len.
  • Sequence-Nodes (Se­quenz­kno­ten) erlegen den aus­führ­ba­ren Knoten innerhalb ihrer Grenzen eine Rei­hen­fol­ge auf. Diese stellen Sie mit Da­ten­flüs­sen als Ak­ti­vi­täts­kan­ten (also einfachen Pfeilen) dar. Kanten können frei in die Struktur hinein und aus ihr heraus zeigen.
  1. Expansion-Regions sind eine weitere Form der struk­tu­rier­ten Ak­ti­vi­täts­kno­ten. Sie ak­zep­tie­ren eine oder mehrere Samm­lun­gen von Werten als Input. Auf dem Weg in die Ex­pan­si­ons­re­gi­on kopiert der Eingabe-Pin jedes ein­ge­hen­de Token auf die Anzahl der Samm­lungs­ele­men­te. Alle in­lie­gen­den Knoten arbeiten sich an jedem einzelnen Wert der Sammlung ab. Ein Durchlauf gilt als eine Ex­pan­si­ons­aus­füh­rung (expansion execution).

    Ein so­ge­nann­ter Ex­pan­si­ons­kno­ten (eine Art Ob­jekt­kno­ten) zeigt die Schnitt­stel­le der Ex­pan­si­ons­re­gi­on an. Nach außen hin zeigen sie ihre Werte als Sammlung an, nach innen gelten die einzelnen Elemente der Sammlung als Wert. Für die Notation zeichnen Sie ein ab­ge­run­de­tes Rechteck mit ge­stri­chel­ter Linie. Die Ex­pan­si­ons­kno­ten stellen sich als Rechtecke mit Segmenten dar und werden, wie unten zu sehen, direkt auf der Linie ge­zeich­net. Die Seg­men­tie­rung soll die Liste der Wer­te­samm­lun­gen dar­stel­len.
  1. Reduce-Actions (Re­du­zie­rungs­ak­tio­nen) rufen solange ein Verhalten hervor, bis aus einer Sammlung von Werten ein einziger Wert her­vor­geht. Dafür kom­bi­niert die Aktion die Samm­lungs­ele­men­te. Die Aktion verfügt daher über zwei in-Parameter aber über nur einen out- oder return-Parameter.

  2. Raise-Exception-Actions (Aktionen, die eine Ausnahme ver­ur­sa­chen) beendeen sich selbst, sobald sie eine Ausnahme ver­ur­sa­chen. Somit enden sie nicht wie normale Aktionen, die stoppen, wenn die Aktion bis zu Ende aus­ge­führt wurde. Sie ver­brei­ten sich nach außen durch das System bis zum nächst­hö­he­ren struk­tu­rier­ten Ak­ti­vi­täts­kno­ten. Verfügt dieser über einen Handler, der mit der Ausnahme über­ein­stimmt, stopp die Aktion. An­dern­falls ver­brei­tet sie sich weiter.

Ob­jekt­kno­ten: Ak­ti­vi­täts­kno­ten, die Ob­jekt­to­ken lenken

Ob­jekt­kno­ten sind Un­ter­ar­ten der Ak­ti­vi­täts­kno­ten. Allgemein ist ein Objekt in der UML die kleinste wert­be­setz­te Instanz. Im Ak­ti­vi­täts­dia­gramm stellen Objekte Daten dar. Während eine Aktion aus­ge­führt wird, halten die Ob­jekt­kno­ten diese Daten fest. Denn nur Kon­troll­to­ken können direkt eine Aktion durch­lau­fen. Ob­jekt­to­ken hingegen gehen als Wert bei einem Ein­ga­be­pin ein und werden vom Aus­ga­be­pin auf dem Ob­jekt­fluss wei­ter­ge­lei­tet.

Ob­jekt­kno­ten wurden im UML-2-Ak­ti­vi­täts­dia­gramm das erste Mal ein­ge­führt. Sie sind ty­pi­sier­te Elemente. Ent­spricht ein Ob­jekt­kno­ten einem be­stimm­ten Typ, so müssen Ob­jekt­to­ken, die auf ihm wandern, ent­spre­chen­de Werte aufweisen. Eine Ausnahme sind Null-Token, die ohne einen Wert auskommen – sie gehen mit jedem Ob­jekt­kno­ten konform.

Ob­jekt­kno­ten schreiben die Rei­hen­fol­ge vor, in der Token sie verlassen. Dafür gibt es vier Mög­lich­kei­ten:

  • Un­ge­ord­net (nicht fest­ge­legt)
  • Geordnet (vom Mo­del­lie­rer fest­ge­leg­tes Verhalten)
  • FIFO (First In First Out): Die Rei­hen­fol­ge beim Ein- und Austritt bleibt gleich
  • LIFO (Last In First Out): Die Rei­hen­fol­ge ist genau umgekehrt

Wollen Sie ein Ak­ti­vi­täts­dia­gramm erstellen, haben Sie vier Typen von Ob­jekt­kno­ten für die Mo­del­lie­rung zur Auswahl:

  1. Der Pin: Pins wurden in dieser Aus­füh­rung bereits an­ge­schnit­ten. In der ersten Grafik war die grund­stän­di­ge Notation von Pins zu sehen. Aufgrund ihrer Aufgabe als Ver­bin­dungs­glied zwischen Aktionen und Ob­jekt­flüs­sen zeichnen Mo­del­lie­rer sie üb­li­cher­wei­se als kleine Rechtecke direkt am Ak­ti­ons­sym­bol. Ein­ga­be­pins (auch „Input-Pins“) kenn­zeich­nen Sie mit einem Pfeil (also einer Kante bzw. ein Ob­jekt­fluss) in Richtung der Aktion. Bei Aus­ga­be­pins (auch „Output-Pins“) führt der Pfeil weg von der Aktion. Die folgende Grafik zeigt, wie Sie Pins gleichen Typs verkürzt dar­stel­len können (links) oder wie Sie Ein- und Aus­ga­be­pins zeichnen, wenn Sie die Kanten weglassen (rechts).
  1. Ak­ti­vi­täts­pa­ra­me­ter­kno­ten: Die Aktivität gehört zur Me­ta­klas­se der Ver­hal­tens­be­schrei­bung. Laut UML hat jedes Verhalten Parameter. Bevor ein Verhalten aus­ge­führt wird, können sie ihm Werte zur Ver­ar­bei­tung ein­spei­sen. Nach der Ver­ar­bei­tung erhalten sie neue Werte zurück. Die Parameter sind in diesem Gefüge die Platz­hal­ter, die es erlauben, diese Werte ein- bzw. aus­zu­ge­ben. Der Ak­ti­vi­täts­pa­ra­me­ter­kno­ten (Activity-Parameter-Node) übernimmt diese Aufgabe für das UML-Ak­ti­vi­täts­dia­gramm. Somit stehen Ak­ti­vi­täts­pa­ra­me­ter­kno­ten jeweils am Anfang und am Ende einer Aktivität.

    Dem­zu­fol­ge hat ein solcher Knoten entweder nur ein­ge­hen­de oder nur aus­ge­hen­de Ak­ti­vi­täts­kan­ten. Input-Ak­ti­vi­täts­pa­ra­me­ter­kno­ten zeichnen Sie mit aus­ge­hen­den Kanten, Output-Ak­ti­vi­täts­pa­ra­me­ter­kno­ten mit ein­ge­hen­den Kanten. Pro Parameter gibt es einen Ak­ti­vi­täts­pa­ra­me­ter­kno­ten, wobei beide vom selben Typ sind.
  1. Puf­fer­kno­ten: Ähnlich wie Pins verwenden Sie den Puf­fer­kno­ten (Central-Buffer-Node) direkt im Ak­ti­vi­täts­dia­gramm. Dieser Ob­jekt­kno­ten speichert bzw. puffert Werte an einer be­lie­bi­gen Stelle im Diagramm. Im Gegensatz zum Pin steht er aber für sich alleine, ohne an einen Ak­ti­vi­täts­kno­ten gebunden zu sein. Sowohl ein­ge­hen­de als auch aus­ge­hen­de Objekte verbindet der Puf­fer­kno­ten über den Ob­jekt­fluss mit anderen Ob­jekt­no­ten, bei­spiels­wei­se mit einem Pin.

    Der Puf­fer­kno­ten dient dazu, ein­ge­hen­de und aus­ge­hen­de Ob­jekt­flüs­se zu puffern. Somit ak­zep­tiert er alle ein­ge­hen­den Ob­jekt­to­ken und stellt diese für aus­ge­hen­de Ob­jekt­flüs­se zur Verfügung. Erst wenn ein Ob­jekt­no­ten am anderen Flussende frei wird und die Ob­jekt­pa­ra­me­ter ak­zep­tiert, schickt er das Token weiter. Laut UML-Notation besteht dieser Knoten aus einem einfachen Rechteck. Seine spezielle Funktion zeigen Sie mit dem Stereotyp <<cen­tral­Buf­fer>> an.
  1. Da­ten­spei­cher­kno­ten: So wie Puf­fer­kno­ten schalten Sie auch Da­ten­spei­cher­kno­ten zwischen Ob­jekt­flüs­se, ohne sie an eine Aktion zu binden. Diese Unterart des Puf­fer­kno­tens hat eine Be­son­der­heit: Sie speichert eine Kopie jedes aus­ge­sen­de­ten Tokens, bis die über­ge­ord­ne­te Aktivität ab­ge­schlos­sen ist. Dafür existiert jeder Wert nur einmal auf dem Da­ten­spei­cher­kno­ten. Speichert der Knoten also bereits ein Ob­jekt­to­ken mit einer festen Identität, nimmt er keine neuen Token mit genau denselben Ei­gen­schaf­ten auf.

    Wie bei allen Ob­jekt­no­ten stellt man den Da­ten­spei­cher­kno­ten als Rechteck dar. Zur Un­ter­schei­dung schreiben Sie den Stereotyp <<datastore>> in den Kopf.

Kon­troll­kno­ten: Ak­ti­vi­täts­kno­ten, die Kon­troll­to­ken lenken

Innerhalb eines UML-Ak­ti­vi­täts­dia­gramms wandern Token durch diverse Aktionen, bis die Aktivität ab­schließt, indem das erste Token am Endknoten ankommt. Da mehrere Token gleich­zei­tig diesen Prozess durch­lau­fen können, braucht es eine gewisse Ordnung. Um einen über­sicht­li­chen Ablauf zu ge­währ­leis­ten, nutzen Sie Kon­troll­kno­ten. Diese verwalten nur Kon­troll­flüs­se auf Ihrem Weg vom Anfang des Ak­ti­vi­täts­dia­gramms über die Aktionen bis zum Ende der Aktivität. Kon­troll­kno­ten können keine Token zwi­schen­spei­chern, im Gegensatz zu Ob­jekt­kno­ten wie dem Puf­fer­kno­ten.

Ein maß­geb­li­cher Un­ter­schied zwischen Objekt- und Kon­troll­flüs­sen ist, dass auf Kon­troll­flüs­sen nur Kon­troll­to­ken wandern. Diese Token tragen, im Gegensatz zu Ob­jekt­to­ken, keine Daten mit sich. Sie sind lediglich Marker. Deshalb benötigen Aktionen keine Ob­jekt­kno­ten (speziell Pins), um Kon­troll­to­ken auf­zu­neh­men und wei­ter­zu­ge­ben. Ein Kon­troll­to­ken startet eine Aktion, wandert zur nächsten und setzt diese dann in Bewegung. Es kon­trol­liert also die chro­no­lo­gi­sche Aus­füh­rung der Aktivität.

Unter den UML-Ak­ti­vi­täts­dia­gramm-Symbolen gestalten sich die Kon­troll­kno­ten wohl am viel­fäl­tigs­ten. Sie gehören zu den Ak­ti­vi­täts­kno­ten. UML 2 un­ter­schei­det sechs Typen:

  1. Start­kno­ten (Initial-Nodes) beginnen eine Aktivität. Es kann mehr als einen Start­kno­ten pro Aktivität geben. Beginnt eine Aktivität, versetzt der Start­kno­ten den Kon­troll­fluss sofort in Bewegung. Exis­tie­ren mehrere Start­kno­ten, laufen die je­wei­li­gen Kon­troll­flüs­se gleich­zei­tig an. Auch struk­tu­rier­te Ak­ti­vi­täts­kno­ten können Start­kno­ten aufweisen. Diese laufen ebenso sofort an, wenn die struk­tu­rier­te Aktivität in­itia­li­siert wird, solange keine Be­din­gun­gen für ihren Start gesetzt wurden. Da Initial-Nodes am Anfang stehen, sind alle ihre Kanten aus­ge­hen­de Ak­ti­vi­täts­kan­ten. Diese sind immer Kon­troll­flüs­se.

    Eine weitere Be­son­der­heit von Start­kno­ten: Die Kon­troll­to­ken, die auf den Start­kno­ten zu Beginn einer Aktivität platziert werden, können dort ausharren, wenn der Kon­troll­fluss das an­ge­bo­te­ne Token nicht annimmt oder blockiert ist.
  1. Endknoten beenden den Fluss einer Aktivität. Es gibt zwei Arten von Endknoten: Die Activity-Final-Node beendet die gesamte Aktivität, indem sie alle Token innerhalb der Aktivität zerstört, wenn das erste Token bei ihr eingeht. Nur Ob­jekt­to­ken im Output von Activity-Pa­ra­me­ter­kno­ten bleiben erhalten.

    Auch alle syn­chro­nen Aktionen stoppen damit. Asyn­chro­ne Aktionen laufen, bis sie ab­ge­schlos­sen sind. Endknoten ak­zep­tie­ren alle ein­ge­hen­den Token. Im Gegensatz zum Start­kno­ten verfügt ein Endknoten aus­schließ­lich über ein­ge­hen­de Ak­ti­vi­täts­kan­ten. Es ist mehr als ein Endknoten möglich.

    Zeichnen Sie ein Ak­ti­vi­täts­dia­gramm mit mehr als einem Endknoten, stoppen womöglich Aktionen, bevor sie ihren Zweck erfüllt haben, weil ein Token bereits bis den ersten Endpunkt erreicht hat. Die Flow-Final-Node (das Ab­lau­fen­de) stoppt einen Kon­troll­fluss und zerstört alle ein­ge­hen­den Token. Andere Kon­troll­flüs­se berührt dies nicht. Somit bietet sich dieser Endknoten als prak­ti­sche Al­ter­na­ti­ve an, wenn Sie im Ak­ti­vi­täts­dia­gramm mehrere Endpunkte mo­del­lie­ren.
  1. Par­al­le­li­sie­rungs­kno­ten und Syn­chro­ni­sa­ti­ons­kno­ten (Fork-Nodes und Join-Nodes), auch Ga­be­lun­gen genannt, sind Kon­troll­kno­ten mit einer fast iden­ti­schen Notation, die ihre Aufgaben jeweils spiegeln.

    Ein Par­al­le­li­sie­rungs­kno­ten teilt eine ein­ge­hen­de Ak­ti­vi­täts­kan­te in mehrere, gleich­zei­tig abgehende Flüsse. Nur eine Ak­ti­vi­täts­kan­te kann in den Par­al­le­li­sie­rungs­kno­ten eingehen. Ist es ein Kon­troll­fluss, sind alle aus­ge­hen­den Kanten auch Kon­troll­flüs­se, für Ob­jekt­flüs­se gilt dasselbe Prinzip. Der Knoten erstellt Kopien des ein­ge­hen­den Tokens für alle aus­ge­hen­den Flüsse. Wird ein Token am Ziel des aus­ge­hen­den Flusses an­ge­nom­men, löscht sich das Token aus dem Quell­kno­ten. Ak­zep­tiert ein weiteres Ziel sein Token nicht, kann der Par­al­le­li­sie­rungs­kno­ten das Token aus­nahms­wei­se halten, bis es ak­zep­tiert wird.

Syn­chro­ni­sa­ti­ons­kno­ten funk­tio­nie­ren genau umgekehrt. Mehrere Kanten laufen bei ihnen ein, aber nur eine Kante geht ab. Besteht die Ge­samt­heit der ein­ge­hen­den Kanten aus Kon­troll­flüs­sen, so verlässt auch ein Kon­troll­fluss den Knoten. Ist auch nur ein Ob­jekt­fluss darunter, spe­zi­fi­ziert UML die aus­ge­hen­de Kante als Ob­jekt­fluss. Gehen in diesem Fall auch Kon­troll­to­ken ein, verfallen diese und nur Ob­jekt­to­ken gehen aus. Haben zwei Objekte die gleiche Identität, ver­schmilzt der Knoten sie in ein Token. Generell gehen Token erst aus, wenn an alle ein­ge­hen­den Kanten eines anbieten (and-Operation). Dies passiert unter dem Prinzip „First In First Out“. Schreiben Sie dem Syn­chro­ni­sa­ti­ons­kno­ten eine Wer­te­spe­zi­fi­ka­ti­on per joinSpec zu, wartet der Knoten auf Token, die explizit diese An­for­de­run­gen erfüllen, bevor er Token abgibt.

  1. Ver­zwei­gungs­kno­ten und Ver­bin­dungs­kno­ten (Decision-Nodes und Merge-Nodes) teilen sich ebenso das gleiche Symbol im Ak­ti­vi­täts­dia­gramm. Die Führung der Flüsse ist wieder das Un­ter­schei­dungs­merk­mal dieser Knoten-No­ta­tio­nen.

    Ein Ver­zwei­gungs­kno­ten benötigt min­des­tens eine, aber höchstens zwei ein­ge­hen­de Kanten. Die eine nennt UML ein­ge­hen­de Pri­mär­kan­te (primary incoming edge). Eine zweite heißt Ver­zwei­gungs-Input-Fluss (decision input flow). Ob aus­ge­hen­de Flüsse Objekt- oder Kon­troll­flüs­se dar­stel­len, richtet sich nach dem Typ der Pri­mär­kan­te. Die Aufgabe des Knotens ist es, sich dann zwischen aus­ge­hen­den Kanten zu ent­schei­den. Der Knoten bieten seinen ein­ge­gan­ge­nen Knoten an, ohne ihn zu kopieren. Das Token kann also nur einen Weg nehmen.

Ein Ver­bin­dungs­kno­ten bündelt mehrere ein­ge­hen­de Flüsse zu einem einzigen aus­ge­hen­den Fluss. Im Gegensatz zum Syn­chro­ni­sa­ti­ons­kno­ten fügt der Ver­bin­dungs­kno­ten aber keine Token zu einem neuen zusammen oder syn­chro­ni­siert die Typen der ein­ge­hen­den Kanten. Deshalb müssen für einen aus­ge­hen­den Kon­troll­fluss alle ein­ge­hen­den Kanten ebenfalls Kon­troll­flüs­se sein. Für Ob­jekt­flüs­se gilt dasselbe. Der Ver­bin­dungs­kno­ten bietet einfach alle ein­ge­gan­gen Token für die aus­ge­hen­de Kante an.

Fazit

Wollen Sie unter UML ein Ak­ti­vi­täts­dia­gramm erstellen und das Konzept im Team be­ar­bei­ten, ist es wichtig, die Notation ein­zu­hal­ten. Nur so ge­währ­leis­ten Sie die all­ge­mei­ne Ver­ständ­lich­keit dieser gra­fi­schen Mo­del­lie­rungs­spra­che. In diesem Artikel haben wir Ihnen die wich­tigs­ten Ak­ti­vi­täts­kno­ten und Kanten mit ihren Funk­tio­nen vor­ge­stellt. Zudem zeigten wir alle grund­le­gen­den und spe­zi­fi­schen No­ta­tio­nen für Ak­ti­vi­täts­dia­gram­me nach UML-2.5.1-Spe­zi­fi­ka­ti­on. Die er­schöp­fend erklärte Spe­zi­fi­ka­ti­on aller UML-Ak­ti­vi­täts­dia­gramm-Symbole finden Sie auf der Website der Object Ma­nage­ment Group.

Zum Hauptmenü