NotationselementeAktionNotation![]() ![]() Abbildung 06_02; Aktion Eine Aktion wird durch ein Rechteck mit abgerundeten Ecken dargestellt. Optional kann noch ein Name oder ein ausführlicher Text eingefügt werden. BeschreibungEine Aktion steht für den Aufruf eines Verhaltens oder die Bearbeitung von Daten und wird innerhalb einer Aktivität nicht weiter zerlegt. Sie beschreibt einen Einzelschritt, der zur Realisierung des durch die Aktivität beschriebenen Verhaltens beiträgt. Beispiele für derartige Einzelschritte sind Vergleiche zwischen Daten, Abarbeitungen eines Algorithmus oder auch das Starten weiterer Aktivitäten, die sich hinter der Aktion verbergen. Die Gesamtheit aller Aktionen, einschließlich der Reihenfolge ihrer Ausführung und der zur Laufzeit erstellten und verwendeten Daten, definiert die Aktivität. Eine Aktion ist das zentrale Element eines Aktivitätsdiagramms. Alle anderen Elemente existieren nur zu dem Zweck, den Ablauf und die Kontrolle der aufeinander folgenden Aktionen zu steuern und deren Datenaustausch zu modellieren. Eine Aktion ist über Kanten mit anderen Elementen des Aktivitätsdiagramms verbunden. Diese Kanten dienen als Transportwege für die Token, die den Start einer Aktion auslösen. Wird von einem vorherigen Element über eine solche Kante ein Token angeboten, dann kann die Folgeaktion das Token entgegennehmen. Damit eine Aktion ihre Arbeit beginnt, müssen jedoch Token an allen eingehenden Kanten gleichzeitig angeboten werden. Sobald eine Aktion ihre Arbeit beginnt, werden die Token von den Kanten entfernt. Ist ein Ablauf abgeschlossen, dann bietet die Aktion ein Token auf jeder ausgehenden Kante den Folgeelementen an. Die Daten dieses Token sind die Eingabedaten der Folgeaktion. Produziert eine Aktion Augabeparameter, dann legt die Aktion bei ihrer Beendigung auch in den folgenden Objektknoten je einen Token ab. Eine Aktion darf einen beliebigen Text enthalten. Alternativ zum Aktionsnamen bietet sich eine ausführliche Ablaufbeschreibung in Pseudocodeform an. Signale und Ereignisse![]() ![]() Abbildung 06_03; Signalsender und Ereignisempfänger Neben den Bisher besprochenen Aktionen gibt es Sonderformen, die sich mit dem Senden von Signalen und Empfangen von Ereignissen beschäftigen. Man bezeichnet sie als Signalsender und Ereignisempfänger. Der Signalsender erstellt aus seinen Eingabedaten ein Signal, das an einen Ereignisempfänger gesendet wird. Das verschickte Signal darf Werte enthalten. Sobald das Signal gesendet wurde, gilt diese Aktion als beendet und der Kontrollfluss der Aktivität läuft weiter. Das Gegenstück zum Signalsender ist der Ereignisempfänger, der wie ein "Nut"-Symbol notiert wird. Erreicht der Ablauf einen Ereignisempfänger, dann verharrt er (das Token) in der Aktion, bis das erwartete Ereignis eintrifft. Das Ereignis wird dabei als Wert eines Signals übertragen. Anschließend wird die Abarbeitung fortgesetzt. Ein Ereignisempfänger kann auch ohne eingehende Kanten modelliert werden. In diesem Fall wird er "aktiviert" (er erhält ein Token), sobald die Aktivität gestartet wurde. Ein Ereignisempfänger kann immer Ereignisse empfangen, das heißt, auch mehrere innerhalb eines Ablaufes einer Aktivität. Ereignisempfänger ohne eingehende Kanten werden meistens in Unterbrechungsbereichen verwendet. Ein gutes Beispiel dafür wird in Abschnitt 3 (Beispiel/Animation) präsentiert. AktivitätNotation![]() Abbildung 06_04; Aktivität Eine Aktivität wird nach außen durch eine Rechteck mit abgerundeten Ecken abgegrenzt. BeschreibungAktivität bezeichnet die gesamte Einheit, die in einem Aktivitätsmodell modelliert wird. Das Aktivitätsmodell besteht aus einer Folge von Aktionen und weiteren Elementen. Weil jede Aktion den Aufruf eines Ablaufs darstellt, der ohne weiteres selbst wieder als Aktivität darstellbar ist, können Aktivitäten ineinander verschachtelt sein. Es ist möglich, einer Aktivität Parameter in Form von Objekten zu übergeben. Objektknoten an den Rändern legen Ein- und Ausgabeparameter für den Beginn und das Ende der Aktivität fest. Schachtelung von Aktivitäten![]() Abbildung 06_05; Schachtelung von Aktivitäten Wie bereits erwähnt, können Aktionen wiederum Aktivitäten aufrufen. Diese Schachtelung von Aktivitäten wird mit einer stilisierten Harke im rechten unteren Bereich der Aufrufaktion kenntlich gemacht, die eine Hierarchie andeutet. Du kannst diese Verfeinerungsmöglichkeit durch Auslagerung von Details in eine tiefere Ebene nutzen. Somit kannst du das Aktivitätsdiagramm auf der oberen Ebene übersichtlicher und einfacher halten und die Lesbarkeit erhöhen. Werden der Aktion Parameter in Form von Pins (siehe Objektknoten) übergeben, sind diese Parameter gleichzeitig Eingangsparameter der aufgerufenen Aktivität. Wenn die Aktivität Ausgangsparameter generiert, so werden diese von der übergeordneten Aktivität für den weiteren Ablauf verwendet. Diese Parameter werden durch Ausgabe-Pins der Aktion, welche die Aktivität aufgerufen hat, in den Ablauf eingebracht. Anzahl und Typkompatibilität müssen daher gewährleistet sein. Es kann zwischen einem synchronen und einem asynchronen Aktivitätsaufruf unterschieden werden: Bei einem synchronen Aufruf wird der Ablauf so lange an der rufenden Aktion blockiert, bis die geschachtelte Aktivität komplett beendet ist. In diesem Fall darf die gerufene Aktivität einen Paramter zurückliefern. Wird eine Aktivität asynchron aufgerufen, so ist die rufende Aktion beendet, sobald die Aktivität gestartet ist. Dies bedeutet, dass der Ablauf in der übergeordneten Aktivität weiter abgearbeitet wird, ohne dass auf eine Beendigung der untergeordneten Aktivität gewartet wird. Die Abläufe werden dabei parallelisiert (Duplizierung von Token). ObjektknotenNotation![]() ![]() Abbildung 06_06; Objektknoten BeschreibungEin Objektknoten innerhalb einer Aktivität repräsentiert Ausprägungen eines bestimmten Typs. In den meisten Fällen sind das primitive Werte oder Objekte von Klassen. Objektknoten bilden das logische Gerüst, um Daten und Werte innerhalb einer Aktivität während eines Ablaufs zu transportieren. Neben Ausprägungen von Klassen darfst du damit auch Variablen, Konstanten oder Speicher jeglicher Art modellieren. Ein Objektknoten oder dessen Wert/Inhalt ist das Ergebnis der unmittelbar vorangegangenen Aktion bzw. Eingabe für die direkt nachfolgende Aktion. Eine Aktion kann eine Ausprägung vom Typ des Objektknotens erzeugen oder Werte der Ausprägung verändern. Zudem können die Werte der Ausprägung oder die Ausprägung selbst durch eine Aktion verarbeitet werden. Der Objektknoten ist aber nicht zu verwechseln mit der Instanz, die er repräsentiert. Ein Objektknoten ist kein Objekt im Sinne einer Klasseninstanz oder einer konkreten Zahl. Er darf keine Bestandteile wie Attribute oder Operationen enthalten und ist allenfalls als logischer Stellvertreter zu sehen. Führt ein Pfeil von einer Aktion zu einem Objektknoten, so ist eine Ausprägung vom Typ des Objektknotens das Ergebnis der vorangegangenen Aktion. Analog macht ein Pfeil von einem Objektknoten zu einer Aktion die Ausprägung zum Eingangsparameter der Aktion. Pin-Notation![]() Abbildung 06_07; Pin-Notation Um den Zusammenhang zwischen einer Aktion und einem Objektknoten als Eingabe- bzw. Ausgangsparameter der Aktion zu verdeutlichen, gibt es die Pin-Notation für Objektknoten. Bei dieser Schreibweise ist der Objektknoten an die Aktion unmittelbar angeheftet. Die Richtung der Kanten an an dem Objektknoten gibt einen Hinweis, ob es sich um einen Eingangs- oder Ausgangs-Pin handelt. Dies kann unabhängig von der Lage der Pins und dem Vorhandensein der Kanten durch Pfeile in den Pins angegeben werden. Ein Objektknoten, der gleichzeitig Aus- und Eingabeparameter ist, kann ohne die Pin-Notation dargestellt werden. Dazu müssen die Parameter jedoch den gleichen Namen und Typ besitzen. KantenNotation![]() Abbildung 06_08; Kante BeschreibungKanten sind Übergänge zwischen zwei Knoten (Aktionen, Objektknoten,...). Die Kanten sind immer gerichtet und können zum besseren Verständnis mit einem Namen versehen werden. Kanten unterteilen sich in zwei Arten:
KontrollflussEin Kontrollfluss beschreibt eine Kante zwischen zwei Aktionen oder zwischen einer Aktion und einem Kontrollelement. Die auf diese Kanten verschickten Token "tragen" üblicherweise keine Daten, sondern stimulieren "nur" die Ausführung einer Aktion. ObjektflussAn einer Objektflusskante ist immer mindestens ein Objektknoten beteiligt. Dabei überträgt die Kante Token, die Daten oder Werte zum oder vom Objektknoten transportieren. Bedingungen![]() Abbildung 06_09; Bedingter Objektfluss Es ist möglich Kanten mit Bedingungen zu belegen. Ein Übergang über diese Kante ist dann nur möglich, wenn die Bedingung erfüllt ist. Eine solche Bedingung wird in eckigen Klammern an die Kante gelegt. Meist werden Bedingungen in Verbindung mit Verzweigungsknoten verwendet, um zu bestimmen, in welche Richtung der Ablauf fortgesetzt wird. Man sollte jedoch nie den einzigen Weg aus einer Aktion heraus von einer Bedingungen abhängig machen, denn dann läuft man Gefahr, dass an dieser Stelle der Ablauf einfriert und nie mehr fortgesetzt wird. Sprungmarken![]() Abbildung 06_10; Sprungmarken Zur übersichtlichen und ästhetischen Gestaltung ist es sinnvoll Kanten zu unterbrechen und an einer entfernten Stelle fortzuführen anstatt die Kanten an anderen Notationselementen "vorbeizulotsen" oder quer durch ein Diagramm zu zeichnen. Kanten lassen sich daher durch Sprungstellen unterbrechen. Derartige Punkte werden durch kleine Kreise (Sprungmarken) kenntlich gemacht. Sprungmarken müssen immer paarweise auftreten und mit eindeutigen Namen versehen sein. StartknotenNotation![]() Abbildung 06_11; Startknoten BeschreibungEin Startknoten markiert den Startpunkt eines Ablaufs bei Aktivierung einer Aktivität. Eine Aktivität darf beliebig viele Startknoten besitzen. Jeder Startknoten darf wiederum beliebig viele wegführende Kanten besitzen. Ein Startknoten wird durch einen ausgefüllten schwarzen Punkt notiert. Beim Start einer Aktivität produziert ein Startknoten Token und bietet diese allen Kanten (Anzahl der Token gleich Anzahl der Kanten) an. Gibt es mehrere Startknoten, so beginnt die Abarbeitung (Produktion der Token) in allen Startknoten gleichzeitig (Erzeugung mehrerer Abläufe). Als einziges Kontrollelement kann der Startknoten Token für eine bestimmte Zeitspanne aufbewahren. Dies ist nötig, falls angebotene Token nicht sofort von den Folgeelementen aufgenommen werden können. Bemerkung: Eine Aktivität muss nicht zwangsläufig einen Startknoten besitzen, da Parameter einer Aktivität oder Aktionen, die Signale empfangen, auch Token und damit Abläufe generieren können. EndknotenNotation
Abbildung 06_12; Endknoten für Aktivitäten und Kontrollflüsse BeschreibungIn einer Aktivität können zwei Arten von Endknoten modelliert werden:
Die beiden Endknoten sind Elemente der Flusskontrolle einer Aktivität. Beiden ist gemeinsam, dass sie Abläufe abbrechen. Sie haben daher nur eingehende Kanten. Endknoten für AktivitätenEin Endknoten für Aktivitäten beendet die gesamte Aktivität, sobald er von einem Token erreicht wird. Parallele Abläufe derselben Aktivität werden augenblicklich beendet, indem sämtliche Token, die sich im Umlauf befinden gelöscht werden. Die Aktivität übergibt zudem die Daten-Token, die sich in Ausgabe-Objektknoten befinden, an den Rufer der Aktivität. Es können mehrere Endknoten für Aktivitäten existieren. In diesem Fall wird die Aktivität beendet, sobald einer der Knoten ein Token erhält. Ein Endknoten für Aktivitäten wird durch einen schwarzen Punkt mit einem umschließenden Ring notiert. Endknoten für KontrollflüsseEin Endknoten für Kontrollflüsse markiert nur das Ende eines Ablaufs. Er terminiert nur einen Fluss, indem er das zugehörige Token vernichtet. Dies ist nur dann mit der Beendigung der gesamten Aktivität gleichzusetzen, wenn die Bearbeitung der Kontrollflüsse innerhalb der Aktivität nicht zuvor parallelisiert wurde. Gibt es jedoch parallele Flüsse, dann wird nur der Fluss beendet, an dessen Ende der Endknoten für Kontrollflüsse steht. Der Endknoten für Kontrollflüsse wird durch ein Kreuz mit einem umschließenden Ring notiert. Verbindungs- und VerzweigungsknotenNotation![]() Abbildung 06_13; Verbindungs- und Verzweigungsknoten
BeschreibungDie UML bietet zum Spalten und Zusammenführen von Kanten (aber nicht von Abläufen) zwei Kontrollelemente:
Beide Knoten werden durch eine Raute (Diamantsymbol) symbolisiert. Ein Verzweigungsknoten verzweigt immer genau eine eingehende zu mehreren ausgehenden Kanten; ein Verbindungsknoten führt mehrere eingehende Kanten zu genau einer ausgehenden Kante zusammen. VerzweigungsknotenEin Verzweigungsknoten spaltet eine Kante in mehrere Alternativen auf. Dies ist besonders dann von Interesse, wenn ein Ablauf der Aktivität von bestimmten Bedingungen abhängig ist. Ein Token, das einen Verzweigungsknoten erreicht, passiert nur eine ausgehende Kante. Das Token wird an einem Verzweigungsknoten nicht dupliziert. Unter welchen Vorraussetzungen welcher Zweig gewählt wird, kann mit Bedingungen festgelegt werden. Mittels der Bedingungen wird definiert, welche Anforderungen ein Token erfüllen muss, damit es die Kante passieren kann. Die Bedingungen dafür werden in eckigen Klammern an die Kante geschrieben. Zur Vermeidung von Problemen dürfen Bedingungen sich nicht überschneiden, da sonst die Token nicht mehr eindeutig gelenkt werden können. Ähnlich verhält es sich, wenn nicht alle möglichen Fälle berücksichtigt werden. Sind beispielsweise die Bedingungen aller wegführenden Kanten nicht erfüllt, verbleibt ein Token für immer in der vorigen Aktion, die somit ständig aktiv bleibt und keine weiteren Token mehr aufnehmen kann. Das System steht still. Die Reihenfolge, in der die Bedingungen betrachtet werden, ist nicht festgelegt. Fehlt die Bedingung, so wird die Kante von beliebigen Token passiert. VerbindungsknotenDer Verbindungsknoten ist das Gegenstück zum Verzweigungsknoten. Er führt Kanten zusammen. Hierbei findet keine Synchronisation an den eingehenden Kanten statt. Liegen mehrere Token parallel an, werden sie in nicht spezifizierter Reihenfolge an der ausgehenden Kante angeboten. Verbindungsknoten ermöglichen den Eintritt in eine Aktion durch nur eine Kante. Wenn sie keinen Verbindungsknoten verwenden, sind die an einer Aktion anliegenden Kanten implizit mit UND verbunden. Wollen Sie in einer spezifischen Modellierungssituation aber ein ODER modellieren, müssen Sie einen Verbindungsknoten setzen, um die einzelnen Kanten zusammen zu führen. Synchronisations- und ParallelisierungsknotenNotation![]() Abbildung 06_14; Synchronisationss- und Parallelisierungsknoten BeschreibungDie UML bietet die Möglichkeit, Abläufe zu mehreren Flüssen zu parallelisieren oder zu einem Fluss synchron zusammenzuführen. Dazu dienen:
Beide Knoten werden durch schwarze Balken symbolisiert. Ein Parallelisierungsknoten teilt den Ablauf, der über genau eine eingehende Kante geführt wird, in parallele Abläufe (mehrere ausgehene Kanten) auf; ein Synchronisationsknoten führt parallele Abläufe zu einem Ablauf zusammen. ParallelisierungsknotenAn einem Parallelisierungsknoten wird der eingehende Ablauf in mehrere parallele Abläufe aufgeteilt. Jedes eingegangene Token wird dabei vervielfältigt und an jeder ausgehenden Kante angeboten. Sowohl die eingehenden, als auch die ausgehenden Kanten können mit Bedingungen versehen sein. SynchronisationsknotenDer Synchronisationsknoten führt eingehende Abläufe zu einem gemeinsamen Ablauf zusammen. Dazu müssen an allen Eingangskanten gleichzeitig Kontroll- oder Daten-Token angeboten werden. Die Kontroll-Token werden am Synchronisationsknoten zu einem Ausgangskontroll-Token verschmolzen. Falls unter den anliegenden Token sich mindestens ein Daten-Token befindet, das heißt mindestens ein Objektfluss beteiligt ist, werden nur die Daten-Token weitergegeben, die Kontroll-Token werden vernichtet. UnterbrechungsbereichNotation![]() Abbildung 06_15; Unterbrechungsbereich BeschreibungEin Unterbrechungsbereich umschließt eine oder mehrere Aktionen. Der Bereich wird durch ein gestricheltes Rechteck mit runden Ecken modelliert. Neben den "normalen" Kanten enthält der Bereich zusätzlich eine "Unterbrechungskante" (symbolisiert durch einen blitzförmigen Pfeil, alternativ durch anbringen eines Blitzes an eine gerade Linie). die innerhalb des Bereichs beginnt und deren Ziel außerhalb des Bereichs liegt. An der Modellierung der Aktionen in dem Bereich selber ändert sich nichts. Wird der Bereich über eine Unterbrechungskante verlassen, so werden sämtliche in dem Bereich ausgeführten Aktionen bzw. Abläufe abgebrochen, indem alle vorhandenen Token verworfen werden. Der Ablauf der Aktivität setzt sich am Zielknoten der Unterbrechungskante fort. Tritt die Unterbrechung genau dann ein, wenn ein Token über eine kante den Unterbrechungsbereich verlässt, so bleibt dieses Token erhalten. Ein Unterbrechungsbereich lässt sich sehr gut für Ausnahmen einsetzen, die die sofortige Beendigung mehrerer Aktivität bzw. Abläufe in einer Aktivität bewirken sollen. Ein gutes Anwendungsbeispiel findest du auch im nächsten Abschnitt dieses Lehrmoduls. |