Modellierung mit
UML
Loading

C.5 Statecharts

Statecharts stellen eine weitere Diagrammart der UML/P dar. Ein Statechart ist grundsätzlich einer Klasse oder einer Methode zugeordnet. Deshalb trägt es den Namen des beschriebenen Elements. Ein Statechart benötigt deshalb nur dann einen eigenen Namen, wenn für dieselbe Klasse oder Methode mehrere Beschreibungen existieren. Dies kann zum Beispiel bei Testmodellen der Fall sein. In diesem Abschnitt wird zunächst die abstrakte Syntax von Statecharts in gewohnter Weise durch die in Anhang A eingeführten Syntaxklassendiagramme und EBNF formuliert. Dabei werden auch die in diesem Kapitel eingeführten Stereotypen in einer Liste zusammengefasst und ihre Bedeutung sowie syntaktische Einschränkungen in kompakter Form wiederholt. Schließlich werden die Unterschiede zwischen den UML/P-Statecharts und dem UML-Standard diskutiert.

C.5.1 Abstrakte Syntax

Der graphische Anteil der Statecharts ist im Syntaxdiagramm in Abbildung C.16 festgelegt.

Lädt...
Abbildung C.16: Syntax der Statecharts

Jedes Statechart besitzt ein Attribut der Sorte KlassennameC.3, das kennzeichnet welcher Klasse beziehungsweise welchem Interface das Statechart zugeordnet ist. Handelt es sich um ein Methoden-Statechart, so ist zusätzlich eine Methode angegeben. Der graphische Anteil von Statecharts ist relativ einfach strukturiert. Ein Statechart besteht aus einer Sammlung von Zuständen und Transitionen, die jeweils in einem Zustand beginnen und enden. Die Zustände sind hierarchisch angeordnet.

Sowohl Zustände als auch Transitionen besitzen eine Reihe von textuellen Anteilen, die unter anderem Bedingungen und Aktionen beschreiben. Diese Anteile sind in Abbildung C.17 beschrieben.

Zustandsname ::= NameB.2
Zustandsinvariante ::= [ OCLExprC.8 ]
Aktion ::= / StatementB.5* Nachbedingungopt
Vorbedingung ::= [ OCLExprC.8 ]
Nachbedingung ::= [ OCLExprC.8 ]
InterneTransition ::= Vorbedingungopt Stimulus⟩ ⟨Aktionopt
Stimulus ::= ε | Methodenaufruf | Return | Exception
Methodenaufruf ::= IdentifierB.1⟩ { (...) | ArgumentsB.6⟩ }opt
Return ::= return { ... | ExpressionB.6⟩ }opt
Exception ::= ExceptionTyp⟩ { (...) | ArgumentsB.6⟩ }opt
ExceptionTyp ::= NameB.2
Abbildung C.17: Syntax für Zustands- und Transitionskomponenten

Statecharts kennen drei Arten von Bedingungen, die Zustandsinvariante, die Vor- und die Nachbedingung, die jeweils durch eine OCL-Bedingung der Sorte OCLExprC.8 umgesetzt werden. Nur in Nachbedingungen ist der Zugriff auf Attributwerte im Ursprungszustand mit @pre erlaubt. Beginnt eine Vorbedingung mit einem let-Konstrukt, so ist die Gültigkeit der dadurch lokal definierten Variablen auf die Transitionsaktion inklusive der Nachbedingung erweitert. Dadurch können ähnlich wie bei OCL-Methodenspezifikationen lokale Variablen effektiver eingesetzt werden.

Für die Beschreibung prozeduraler Aktionen werden direkt Java-Anweisungen verwendet, die auf die Attribute des Objekts und die als lokale Variablen beziehungsweise Parameter zu verstehenden Argumente des Stimulus zugreifen können. Ein Stimulus stößt eine Transition an. Dies kann entweder spontan sein (markiert durch ε), durch ein return einer vorher abgesandten Anfrage oder durch einen Methodenaufruf. Ob letzterer als normaler Methodenaufruf oder als asynchron versandte Nachricht ankommt, wird im Stimulus nicht unterschieden.

Wie bereits für die anderen Diagrammarten wird auf die explizite Einbeziehung von Stereotypen und Merkmalen verzichtet. Dennoch wurden in diesem Kapitel eine Reihe von Stereotypen eingeführt, die zur Festlegung von Semantik und damit auch zur Steuerung von Codegenerierung und des methodischen Einsatzes dienen. Nachfolgend werden diese Stereotypen in Kurzform wiederholt. Generell gilt bei Statecharts wie auch bei den anderen Diagrammarten, dass Stereotypen und Merkmale grundsätzlich für jedes Nichtterminal der Syntax definiert werden können.

Kommentare werden wie in den anderen graphischen Teilnotationen der UML/P üblich und in Abbildung 2.3 demonstriert an die kommentierten Diagrammelemente angefügt.

In Tabelle 5.13 wurden die Zustandsinvarianten aus dem Diagramm in eine eigene Tabelle ausgelagert. In ähnlicher Form kann dies auch für Transitionen und Aktionen erfolgen, um eine Überladung des Diagramms zu vermeiden. Dafür können zusätzliche Namen als Hilfsreferenzen eingeführt werden, die den Bezug eines Tabelleneintrags zu dem beschriebenen Diagrammelement herstellen. Statt also beispielsweise Invarianten oder Vorbedingungen direkt ins Diagramm zu schreiben, steht dort nur ein Name, der auf den entsprechenden Tabelleneintrag verweist. Diese Namen besitzen ansonsten keine weitere Bedeutung, so dass eine explizite Darstellung von Ausgliederungen in Tabellen in der oben dargestellten abstrakten Syntax nicht vorgenommen wird.



datastate wird auf Datenzustände angewandt. Ob sich ein Objekt in einem solchen Zustand befindet, kann alleine aus den Attributen und Links des Objekts (und abhängiger Objekte) bestimmt werden.

controlstate ist dual zu datastate und markiert Kontrollzustände. Bei Kontrollzuständen ist auch der Programmzähler und der Stack relevant.

statedefining markiert die Zustandsinvariante eines Datenzustands (datastate). Es bedeutet, dass die Zustandsinvariante exakt beschreibt, ob sich ein Objekt in einem Zustand befindet. Die Zustandsinvariante definiert daher den Zustand.


method wird auf ein Statechart angewandt, um es als Methoden-Statechart zu kennzeichnen. Ein Methoden-Statechart beschreibt eine einzelne (komplexe) Methode. Es besitzt ausschließlich Kontrollzustände. Neben spontanen Transitionen zur Weiterführung der Methode ist als Stimulus nur return erlaubt, bei dem auf das Ergebnis eines in der letzten Transition abgesandten Methodenaufrufs gewartet wird. Alle Zustände eines Methoden-Statecharts sind implizit als controlstate ausgewiesen.


prio:inner wird auf ein Statechart angewandt, um Transitionen den Vorrang zu geben, deren Quellzustände in der Zustandshierarchie innen zu finden sind (also Subzustände vor Superzuständen). Dadurch werden überlappende Schaltbereiche von Transitionen aufgelöst.

prio:outer beschreibt das Gegenteil von prio:inner: Die äußeren Transitionen erhalten den Vorzug.


error markiert einen speziellen Zustand im Statechart, der als Fehlerzustand interpretiert wird. Der Fehlerzustand wird immer eingenommen, wenn im unvollständigen Statechart keine andere Transition einen ankommenden Stimulus verarbeiten kann. Der Fehlerzustand kann wie jeder andere Zustand auch eine entry- und exit-Aktion besitzen und durch normale Transitionen verlassen werden. Alternativen sind completion:ignore und completion:chaos.

exception markiert einen speziellen Zustand im Statechart, der als Fehlerzustand für Exceptions interpretiert wird. Alle nicht anderweitig abgefangenen Exceptions führen in diesen Zustand. error, completion:ignore und completion:chaos fangen keine Exceptions ab und ergänzen daher exception.

completion: ignore wird auf ein Statechart angewandt, um darzustellen, dass ankommende Stimuli, die nicht verarbeitet werden können, ignoriert werden. Das heißt, der Stimulus führt zu keiner Reaktion im Sinne einer Zustandsänderung.

completion: chaos bietet eine Alternative zu completion:ignore und error, die vor allem für die Spezifikation eingesetzt wird. Sie besagt, dass mit completion:chaos markierte Statecharts aus Stimuli, die durch keine Transition verarbeitet werden können, beliebiges Verhalten besitzen können. Damit wird für eine spätere Entscheidung das mögliche Verhalten offen gelassen. Es ist unterspezifiziert.

action conditions: sequential wird auf ein Statechart angewandt, um die Komposition von Aktionsbedingungen nicht durch Konjunktion vorzunehmen. Bei Transitionen, die mehrere Zustandsebenen verlassen beziehungsweise betreten, können mehrere exit- und entry-Aktionen und die Transitionsaktion auszuführen sein. Die Nachbedingungen in diesen Aktionen müssen jeweils am Ende der Teilaktion erfüllt sein. Die nächste Teilaktion kann jedoch die Nachbedingung wieder invalidieren.


Tabelle C.18.: Liste der Stereotypen für Statecharts

C.5.2 Vergleich mit dem UML-Standard

Bei der Definition der UML/P-Statecharts wurden im Vergleich zum UML-Standard [OMG10a] Konzepte weggelassen, deren Notwendigkeit aufgrund der Einbettung der Statecharts in die UML nicht evident ist. Dazu gehören zum Beispiel nebenläufige Zustandsregionen („Und-Zustände“), die eine Spezifikation kompakter, aber nicht lesbarer machen. So ist das Identifizieren von möglichen Abläufen beim „Lesen“ (Review) von Statecharts wesentlich erschwert, da der Leser diese nebenläufigen Zustandsräume gedanklich nachvollziehen muss. Das gilt übrigens auch dann, wenn die Nebenläufigkeit wie in [HG97] vorgeschlagen nur konzeptueller Natur ist und in der Implementierung zum Beispiel durch Bildung von Produktautomaten aufgelöst wird. Aus ähnlichen Gründen wurde auf die Verwendung des History-Mechanismus verzichtet.

Umgekehrt jedoch wurden die UML/P-Statecharts um Nachbedingungen in den Aktionen erweitert, so dass ein Statechart nicht nur eine ausführbare Verhaltensbeschreibung sein muss, sondern auch zur abstrakten Spezifikation von Verhalten auf Basis eines abstrakten Zustandsmodells verwendet werden kann. Die Form der eingeführten Nachbedingungen bietet einen guten Übergang zu OCL-Methodenspezifikationen für die im Statechart verwendeten Stimuli.

Nachfolgend sind die Unterschiede zwischen den UML/P-Statecharts und dem UML-Standard zusammengefasst:

  1. Auf parallele Subzustände wurde verzichtet.
  2. Ein History-Mechanismus existiert in UML/P nicht.
  3. Das Konzept der Stimuli und der Schaltbereitschaft ist gegenüber dem sehr abstrakt gehaltenen Event-Konzept des Standards wesentlich präzisiert worden.
  4. Vorbedingungen von Transitionen stehen jetzt links vom Stimulus, um sie noch besser von Nachbedingungen zu unterscheiden.
  5. Der UML-Standard kennt keine deskriptiv formulierten Nachbedingungen. Deshalb sind die UML-Statecharts weniger für Spezifikationen, sondern vor allem für Implementierungsbeschreibungen geeignet.
  6. Das Aussehen von Invarianten, Vorbedingungen und Aktionen wurde wesentlich konkretisiert, indem OCL-Ausdrücke beziehungsweise Java-Anweisungen dafür vorgegeben wurden.
  7. Die Darstellung von Stimuli-Parametern wurde von name:Typ zu Ausdrücken verallgemeinert. Darin enthalten sind konkrete Werte genauso wie Variablen, die dadurch belegt werden und in den Vorbedingungen, Aktionen und Nachbedingungen benutzbar sind. Auf eine Typangabe wurde verzichtet, denn diese ergibt sich bereits aus der Signatur der Klasse, der ein Statechart zugeordnet ist. Gegebenenfalls kann mit Typkonversion der Parameter eine Methode aus mehreren überladenen Methoden eindeutig bestimmt werden.
  8. Nebenläufige Transitionen, die mehrere Start- oder Zielzustände besitzen und damit Nebenläufigkeit innerhalb des Statecharts simulieren, sowie Synchronisationszustände wurden weggelassen, da generell das Konzept der Nebenläufigkeit innerhalb eines Objekts beziehungsweise Statecharts fehlt.
  9. „Stubbed transitions“, also Transitionen, die in das Innere eines hierarchischen Zustands hineinführen, ohne zum genauen Subzustand zu führen, wurden in UML/P nicht aufgenommen, da die damit ausgedrückte Information nicht präziser ist, als wenn diese Transition direkt zum Superzustand führen würde. Wenn gewünscht, kann eine solche Transition durch einen geeigneten Stereotyp markiert werden.
  10. „Junction“ und „choice points“ repräsentieren Kontrollzustände in der Abarbeitung von Transitionen und können durch mit controlstate markierte Zustände nachgebildet werden.

Generell sind die UML/P-Statecharts syntaktisch und semantisch besser mit den anderen UML/P-Notationen integriert, als dies im UML-Standard der Fall ist. Das „Event“-Konzept wurde dort sehr allgemein gehalten, um die verschiedensten, aus den Echtzeitsystem wie auch den Geschäftssystemen stammenden Arten von Stimuli, subsumieren zu können. Eine Integration mit OCL-Bedingungen oder einer konkreten Sprache zur Darstellung von Aktionen erfolgt im Standard nicht. Dort werden zum einen die OCL und zum anderen die Action-Language [OMG01a] als mögliche Sprachen erwähnt, jedoch keine konkrete Integration vorgenommen.


Bernhard Rumpe. Agile Modellierung mit UML. Springer 2012