UML -Zustandsmaschine
UML -Zustandsmaschine,[1] auch bekannt als Uml staatsechart, ist eine Erweiterung der mathematisch Konzept von a Finite Automaton in Informatik Anwendungen wie in der ausgedrückt Einheitliche Modellierungssprache (Uml) Notation.
In den Konzepten dahinter geht es darum, die Art und Weise zu organisieren, wie ein Gerät, ein Computerprogramm oder ein anderer (oft technischer) Prozess funktioniert -Definierte bedingte Übergänge zwischen diesen Zuständen.
UML State Machine ist eine objektbasierte Variante von Harel StateChart,[2] angepasst und erweitert von UML.[1] Anwesend[3] Das Ziel von UML -Staatsmaschinen ist es, die Hauptbeschränkungen der traditionellen Beschränkungen zu überwinden Finite-State-Maschinen Beim Beibehaltung ihrer Hauptvorteile. UML StatechArts stellen die neuen Konzepte von vor Hierarchisch verschachtelte Staaten und orthogonale Regionen, während der Begriff von Aktionen. UML -Staatsmaschinen haben die Eigenschaften beider Mehlige Maschinen und Moore -Maschinen. Sie unterstützen Aktionen das hängt sowohl vom Status des Systems als auch vom Auslösen ab Veranstaltungwie in mehligen Maschinen sowie Eintritts- und Ausgangsaktionen, die eher mit Zuständen als mit Übergängen verbunden sind, wie in Moore -Maschinen.[4]
Der Begriff "UML State Machine" kann sich auf zwei Arten von Zustandsmaschinen beziehen: Verhaltenszustandsmaschinen und Protokollzustandsmaschinen. Verhaltenszustandsmaschinen können verwendet werden, um das Verhalten einzelner Entitäten (z. B. Klasseninstanzen), ein Subsystem, ein Paket oder sogar ein ganzes System zu modellieren. Protokollzustandsmaschinen werden verwendet, um Nutzungsprotokolle auszudrücken, und können verwendet werden, um die gesetzlichen Nutzungsszenarien von Klassifikatoren, Schnittstellen und Ports anzugeben.
Grundlegende Zustandsmaschinenkonzepte
Viele Softwaresysteme sind ereignisgesteuertwas bedeutet, dass sie kontinuierlich auf das Auftreten eines externen oder inneren Auftretens warten Veranstaltung z. B. eine Mausklick, eine Schaltfläche drücken, eine Zeitmarke oder eine Ankunft eines Datenpakets. Nach der Erkennung des Ereignisses reagieren solche Systeme durch Durchführung der entsprechenden Berechnung, die die Hardware manipuliert oder „Soft“ -Ereignisse generiert werden kann, die andere interne Softwarekomponenten auslösen. (Aus diesem Grund werden ereignisgesteuerte Systeme alternativ aufgerufen reaktive Systeme.) Sobald die Veranstaltung abgeschlossen ist, kehrt das System auf das nächste Ereignis zurück.
Die Reaktion auf ein Ereignis hängt im Allgemeinen sowohl vom Typ des Ereignisses als auch vom internen ab Zustand des Systems und kann eine Zustandsänderung enthalten, die zu a führt Zustandsübergang. Das Muster von Ereignissen, Zuständen und Zustandsübergängen zwischen diesen Zuständen kann abstrahiert und als dargestellt werden Finite-State-Maschine (FSM).
Das Konzept eines FSM ist wichtig in ereignisgesteuerte Programmierung Weil das Ereignis die Behandlung ausdrücklich sowohl vom Ereignisstyp als auch vom System des Systems ausdrücklich abhängig macht. Bei korrekter Anwendung kann eine Zustandsmaschine die Anzahl der Ausführungspfade drastisch durch den Code reduzieren, die an jedem Verzweigungspunkt getesteten Bedingungen vereinfachen und die Umschaltung zwischen verschiedenen Ausführungsmodi vereinfachen.[5] Umgekehrt kann die Verwendung ereignisgesteuerter Programmierung ohne zugrunde liegendes FSM-Modell Programmierer dazu bringen, fehleranfällige, schwer zu erweiterne und übermäßig komplexe Anwendungscode zu erzeugen.[6]
Grundlegende UML -Zustandsdiagramme
UML bewahrt die allgemeine Form der Traditionelle Staatsdiagramme. Die UML -Staatsdiagramme sind Regie Graphen in denen Knoten Staaten und Anschlüsse bezeichnen, die Zustandsübergänge bezeichnen. Beispielsweise zeigt Abbildung 1 ein UML -Statusdiagramm, das der Computertastaturstatemaschine entspricht. In UML werden die Staaten als abgerundete Rechtecke dargestellt, die mit Staatsnamen gekennzeichnet sind. Die als Pfeile dargestellten Übergänge sind mit den auslösenden Ereignissen gekennzeichnet, die optional durch die Liste der ausgeführten Aktionen befolgt werden. Das anfänglicher Übergang stammt aus dem soliden Kreis und gibt den Standardzustand an, wenn das System zum ersten Mal beginnt. Jedes Zustandsdiagramm sollte einen solchen Übergang haben, der nicht gekennzeichnet werden sollte, da es nicht durch ein Ereignis ausgelöst wird. Der anfängliche Übergang kann zu verbundenen Aktionen haben.

Veranstaltungen
Ein Veranstaltung ist etwas, das sich auf das System auswirkt. Streng genommen in der UML -Spezifikation,[1] Der Begriff Ereignis bezieht sich eher auf die Art des Auftretens als auf eine konkrete Instanz dieses Auftretens. Zum Beispiel ist Tastenanschlag ein Ereignis für die Tastatur, aber jede Drücke einer Taste ist kein Ereignis, sondern eine konkrete Instanz des Tastenanschlag -Ereignisses. Ein weiteres Interessesereignis für die Tastatur ist möglicherweise ein Stromversorgungsunternehmen, aber die Leistung von morgen um 10:05:36 Uhr wird nur eine Instanz des Ereignisses sein.
Ein Ereignis kann zugeordnet sein Parameter, damit die Ereignisinstanz nicht nur das Auftreten eines interessanten Vorfalls, sondern auch quantitative Informationen zu diesem Auftreten vermittelt. Das durch Drücken einer Taste auf einer Computertastatur generierte Tastenanschlag -Ereignis hat beispielsweise zugeordnete Parameter, mit denen der Zeichenscancode sowie den Status der Tasten zur Verschiebung, der Strg- und Alt -Tasten vermittelt werden.
Eine Ereignisinstanz überlebt das sofortige Auftreten, das es erzeugt hat, und könnte dieses Auftreten eines oder mehreren Zustandsmaschinen vermitteln. Sobald die Ereignisinstanz generiert wurde, durchläuft eine Verarbeitungslebenszyklus, die aus bis zu drei Stufen bestehen kann. Erstens ist die Ereignisinstanz erhalten Wenn es akzeptiert wird und auf die Verarbeitung wartet (z. B. wird es auf die platziert Ereigniswarteschlange). Später ist die Ereignisinstanz Versandt Zu der Zustandsmaschine wird es zum aktuellen Ereignis. Schließlich ist es verbraucht Wenn die Zustandsmaschine die Ereignisinstanz beendet. Eine konsumierte Ereignisinstanz ist nicht mehr zur Verarbeitung verfügbar.
Zustände
Jede Zustandsmaschine hat a Zustand, was die Reaktion der Staatsmaschine auf Ereignisse regelt. Wenn Sie beispielsweise eine Taste auf einer Tastatur treffen, ist der generierte Zeichencode entweder ein Großbuchstaben oder ein Kleinbuchstaben, je nachdem, ob die Kappenschloss aktiv ist. Daher kann das Verhalten der Tastatur in zwei Zustände unterteilt werden: den Status "Standard" und den Status "Caps_locked". (Die meisten Tastaturen enthalten eine LED, die angibt, dass sich die Tastatur im Status "Caps_locked" befindet.) Das Verhalten einer Tastatur hängt nur von bestimmten Aspekten ihrer Geschichte ab, nämlich ob die Taste der Caps -Sperre gedrückt wurde, jedoch nicht, zum Beispiel nicht. wie viele und genau welche anderen Schlüssel zuvor gedrückt wurden. Ein Zustand kann alle möglichen (aber irrelevanten) Ereignissequenzen abstrahieren und nur die relevanten erfassen.
Im Kontext von Software -Staatsmaschinen (und insbesondere klassischen FSMs) der Begriff Zustand wird oft als einzeln verstanden Zustandsvariable Dies kann nur eine begrenzte Anzahl von a priori ermittelten Werten (z. B. zwei Werte im Fall der Tastatur oder allgemeiner - eine Art Variable mit einem Auflauf Geben Sie viele Programmiersprachen ein). Die Idee von Zustandsvariable (und klassisches FSM -Modell) ist, dass der Wert der Zustandsvariable definiert den aktuellen Status des Systems zu einem bestimmten Zeitpunkt vollständig. Das Konzept des Staates reduziert das Problem, den Ausführungskontext im Code zu identifizieren, um nur die Zustandsvariable anstelle vieler Variablen zu testen, wodurch eine Menge bedingter Logik beseitigt wird.
Verlängerte Zustände
In der Praxis interpretieren Sie jedoch den gesamten Zustand der Staatsmaschine als einzelne Zustandsvariable wird schnell für alle Staatsmaschinen unpraktisch, die über sehr einfache hinausgehen. Selbst wenn wir eine einzige 32 -Bit -Ganzzahl in unserem Maschinenstaat haben, könnte dies zu über 4 Milliarden verschiedenen Staaten beitragen - und wird zu einem Frühgeborenen führen Zustandsexplosion. Diese Interpretation ist nicht praktisch, daher in UML -Staatsmaschinen das Ganze Zustand der Zustandsmaschine wird üblicherweise in (a) aufzählbar aufgeteilt Zustandsvariable und (b) alle anderen Variablen, die benannt sind verlängerter Zustand. Eine andere Möglichkeit, es zu sehen, besteht darin, aufzählbare zu interpretieren Zustandsvariable als qualitativer Aspekt und verlängerter Zustand als quantitative Aspekte des gesamten Staates. In dieser Interpretation bedeutet eine Variablenänderung nicht immer eine Änderung der qualitativen Aspekte des Systemverhaltens und führt daher nicht zu einer Zustandsänderung.[7]
Zustandsmaschinen ergänzt mit verlängerter Zustand Variablen werden aufgerufen verlängerte Staatsmaschinen und UML -Staatsmaschinen gehören zu dieser Kategorie. Erweiterte Zustandsmaschinen können den zugrunde liegenden Formalismus auf viel komplexere Probleme anwenden, als es praktisch ist, ohne erweiterte Zustandsvariablen einzubeziehen. Zum Beispiel, wenn wir eine Art von Grenze in unserem FSM implementieren müssen (z. B. die Anzahl der Tastenanschläge auf Tastatur auf 1000), ohne verlängerter Zustand Wir müssten 1000 Zustände erstellen und verarbeiten - was nicht praktisch ist; Mit einer erweiterten Zustandsmaschine können wir jedoch a einführen key_count
Variable, die auf 1000 initialisiert und durch jeden Tastenanschlag ohne Veränderung abgelehnt wird Zustandsvariable.

Das Zustandsdiagramm aus Abbildung 2 ist ein Beispiel für eine erweiterte Zustandsmaschine, in der die vollständige Bedingung des Systems (genannt der genannt wird verlängerter Zustand) ist die Kombination eines qualitativen Aspekts - der Zustandsvariable- und die quantitativen Aspekte - der verlängerter Zustand Variablen.
Der offensichtliche Vorteil von erweiterten Zustandsmaschinen ist die Flexibilität. Zum Beispiel ändern Sie die Grenze, die von geregelt wird key_count
Von 1000 bis 10000 Tastenanschlägen würde die erweiterte Zustandsmaschine überhaupt nicht komplizieren. Die einzige erforderliche Änderung würde darin bestehen, den Initialisierungswert der zu ändern key_count
Erweiterte Zustandsvariable während der Initialisierung.
Diese Flexibilität erweiterter Staatsmaschinen ist jedoch mit einem Preis verbunden, da jedoch die komplexe Kopplung zwischen "qualitativ" und den "quantitativen" Aspekten des erweiterten Zustands ist. Die Kupplung erfolgt durch die an Übergänge verbundenen Schutzbedingungen, wie in Abbildung 2 gezeigt.
Wachbedingungen
Wachbedingungen (oder einfach schützt) sind Boolesche Ausdrücke dynamisch bewertet, basierend auf dem Wert von erweiterte Zustandsvariablen und Ereignisparameter. Wachbedingungen wirken sich auf das Verhalten einer Zustandsmaschine aus, indem sie Maßnahmen oder Übergänge nur dann aktivieren, wenn sie zu True bewertet werden, und sie deaktivieren, wenn sie auf False bewertet werden. In der UML -Notation werden die Wachbedingungen in quadratischen Klammern gezeigt (z. B.,, [KEY_COUNT == 0]
in Abbildung 2).
Die Notwendigkeit von Wachen ist die unmittelbare Folge des Hinzufügens von Speicher erweiterte Zustandsvariablen zum staatlichen Maschinenformalismus. Sparlos verwendet, bilden erweiterte Zustandsvariablen und Wachen einen leistungsstarken Mechanismus, der Designs vereinfachen kann. Andererseits ist es möglich, erweiterte Zustände und Wachen zu missbrauchen. [8]
Aktionen und Übergänge
Wenn ein Ereignisinstanz wird versandt, die Zustandsmaschine reagiert durch Ausführung Aktionen, wie das Ändern einer Variablen, das Ausführen von E/A, das Aufrufen einer Funktion, das Generieren einer anderen Ereignisinstanz oder das Wechsel in einen anderen Zustand. Alle mit dem aktuellen Ereignis verbundenen Parameterwerte stehen allen direkt durch dieses Ereignis verursachten Aktionen zur Verfügung.
Das Umschalten von einem Zustand in einen anderen wird genannt Zustandsübergangund das Ereignis, das es verursacht, wird als auslösendes Ereignis bezeichnet oder einfach das Abzug. Wenn sich in der Tastatur bei der Tastatur die Tastatur im "Standard" -Zustand befindet, wenn die Capslock -Taste gedrückt wird, wird die Tastatur in den Status "Caps_locked" eingegeben. Wenn sich die Tastatur jedoch bereits im Status "Caps_locked" befindet, verursacht das Drücken von Capslock einen anderen Übergang - von der "Caps_locked" bis zum "Standard" -Zustand. In beiden Fällen ist das Pressen von Capslock das auslösende Ereignis.
Im verlängerte Staatsmaschinen, ein Übergang kann a haben bewachen, was bedeutet, dass der Übergang nur dann "feuern" kann, wenn die Wache true bewertet. Ein Staat kann viele Übergänge als Reaktion auf denselben Auslöser haben, solange er nicht überlappende Wachen hat. Diese Situation könnte jedoch Probleme in der Abfolge der Bewertung der Wachen verursachen, wenn der gemeinsame Auslöser auftritt. Die UML -Spezifikation[1] absichtlich keine bestimmte Reihenfolge festlegen; UML belastet den Designer vielmehr, Wachen so zu erstellen, dass die Reihenfolge ihrer Bewertung keine Rolle spielt. Praktisch bedeutet dies, dass Wachausdrücke keine Nebenwirkungen haben sollten, zumindest keine, die die Bewertung anderer Wachen mit demselben Auslöser verändern würde.
Ausführungsmodell für die Ausführung von Ausführungen
Alle staatlichen Maschinenformalismen, einschließlich UML State -Maschinen, gehen allgemein davon aus, dass eine staatliche Maschine die Verarbeitung jedes Ereignisses abschließt, bevor die Verarbeitung des nächsten Ereignisses mit Beginn der Verarbeitung beginnt. Dieses Ausführungsmodell heißt rennen zur Fertigstellung, oder RTC.
Im RTC -Modell verarbeitet das System Ereignisse in diskreten, unteilbaren RTC -Schritten. Neue eingehende Ereignisse können die Verarbeitung des aktuellen Ereignisses nicht unterbrechen und müssen gespeichert werden (normalerweise in einem Ereigniswarteschlange) bis die Zustandsmaschine wieder im Leerlauf wird. Diese Semantik vermeiden interne Probleme mit der Parallelität innerhalb einer einzelnen Zustandsmaschine. Das RTC-Modell geht auch um das konzeptionelle Problem der Verarbeitungsaktionen, die mit Übergängen verbunden sind, wobei sich die Zustandsmaschine für die Dauer der Aktion nicht in einem gut definierten Zustand befindet (zwischen zwei Zuständen). Während der Ereignisverarbeitung reagiert das System nicht mehr (nicht beobachtbar), sodass der schlecht definierte Zustand in dieser Zeit keine praktische Bedeutung hat.
Beachten Sie jedoch, dass RTC nicht bedeutet, dass eine Staatsmaschine die CPU monopolisieren muss, bis der RTC -Schritt abgeschlossen ist.[1] Das Präsentation Die Beschränkung gilt nur für den Aufgabenkontext der Staatsmaschine, die bereits mit der Verarbeitung von Ereignissen beschäftigt ist. In einem Multitasking -UmgebungAndere Aufgaben (nicht mit dem Aufgabenkontext der geschäftigen Zustandsmaschine) können ausgeführt werden, was möglicherweise die derzeit ausführende Statusmaschine vorgeht. Solange andere Staatsmaschinen keine Variablen oder andere Ressourcen miteinander teilen, gibt es keine Parallelitätsgefahren.
Der Hauptvorteil der RTC -Verarbeitung ist Einfachheit. Der größte Nachteil ist, dass die Reaktionsfähigkeit einer Zustandsmaschine durch den längsten RTC -Schritt bestimmt wird. Das Erreichen von kurzen RTC-Schritten kann Echtzeit-Designs häufig erheblich erschweren.
UML -Erweiterungen zum traditionellen FSM -Formalismus
Obwohl die Traditionelle FSMs Es ist ein hervorragendes Instrument, um kleinere Probleme anzugehen. Es ist auch allgemein bekannt, dass sie tendenziell unüberschaubar werden, selbst für mäßig involvierte Systeme. Aufgrund des Phänomens bekannt als Status- und ÜbergangsexplosionDie Komplexität eines traditionellen FSM wächst tendenziell viel schneller als die Komplexität des von ihm beschriebenen Systems. Dies geschieht, weil der traditionelle staatliche Maschinenformalismus Wiederholungen zufügt. Wenn Sie beispielsweise versuchen, das Verhalten eines einfachen Taschenrechners mit einem herkömmlichen FSM darzustellen, werden Sie sofort feststellen, dass in vielen Zuständen viele Ereignisse (z. B. die Klar- oder Aus -Taste) identisch behandelt werden. Eine konventionelle FSM, die in der folgenden Abbildung gezeigt ist, hat keine Möglichkeit, eine solche Gemeinsamkeit zu erfassen und erfordert Wiederholung Die gleichen Handlungen und Übergänge in vielen Zuständen. Was in den traditionellen Staatsmaschinen fehlt, ist der Mechanismus, um das gemeinsame Verhalten zu berücksichtigen, um es in vielen Staaten zu teilen.

UML State -Maschinen befassen sich genau mit diesem Mangel der konventionellen FSMS. Sie bieten eine Reihe von Merkmalen, um die Wiederholungen zu beseitigen, so dass die Komplexität einer UML -Zustandsmaschine nicht mehr explodiert, sondern die Komplexität des von ihm beschriebenen reaktiven Systems treu darstellt. Offensichtlich sind diese Funktionen für Softwareentwickler sehr interessant, da nur sie den gesamten staatlichen Maschinenansatz für reale Probleme wirklich anwendbar machen.
Hierarchisch verschachtelte Staaten
Die wichtigste Innovation von UML -Staatsmaschinen über die Traditionelle FSMs ist die Einführung von Hierarchisch verschachtelte Staaten (Deshalb werden auch StatechArts genannt Hierarchische Staatsmaschinen, oder Hsms). Die mit dem staatlichen Verschachtelung verbundene Semantik lautet wie folgt (siehe Abbildung 3): Wenn sich ein System im verschachtelten Zustand befindet, z. B. "Ergebnis" (genannt der genannt Untergang), es ist auch (implizit) im umgebenden Zustand "auf" (genannt Superstate). Diese Zustandsmaschine wird versuchen, jedes Ereignis im Kontext des Untergangs zu verarbeiten, das konzeptionell auf der unteren Ebene der Hierarchie liegt. Wenn das "Ergebnis" des Untergangs jedoch nicht vorschreibt, wie das Ereignis umgeht, wird die Veranstaltung nicht wie in einer traditionellen "flachen" Zustandsmaschine leise verworfen. Vielmehr wird es automatisch im höheren Kontext des Superstats "on" behandelt. Dies ist das, was mit dem System gemeint ist, das in staatlichem "Ergebnis" und "On" ist. Natürlich ist die Verschachtung des Staates nicht nur auf eine Ebene beschränkt, und die einfache Regel der Ereignisverarbeitung gilt rekursiv für eine Nestenniveau.

Staaten, die andere Staaten enthalten, werden genannt Verbundzustände; Umgekehrt werden Zustände ohne interne Struktur genannt einfache Zustände. Ein verschachtelter Staat wird a genannt Direkter Unterschlag wenn es nicht durch einen anderen Zustand enthalten ist; Ansonsten wird es als als bezeichnet transitiv verschachtelter Substate.
Da die interne Struktur eines zusammengesetzten Zustands willkürlich komplex sein kann, kann jede hierarchische Zustandsmaschine als interne Struktur einiger (höherer) zusammengesetzter Zustands angesehen werden. Es ist konzeptionell bequem, einen zusammengesetzten Zustand als die endgültige Wurzel der staatlichen Maschierhierarchie zu definieren. In der UML -Spezifikation,[1] Jede Staatsmaschine hat eine Top -Zustand (Die abstrakte Wurzel jeder staatlichen Maschine -Hierarchie), die alle anderen Elemente der gesamten Zustandsmaschine enthält. Die grafische Darstellung dieses allumfassenden Top-Status ist optional.
Wie Sie sehen können, soll die Semantik der hierarchischen Zustandsabzersetzung die Wiederverwendung des Verhaltens erleichtern. Die Unterkünfte (verschachtelte Zustände) müssen nur die Unterschiede zu den Superstates (enthaltende Zustände) definieren. Ein Untergang kann leicht erben[6] Das gemeinsame Verhalten aus seinen Superstate (en) durch einfach ignorierte allgemein behandelte Ereignisse, die dann automatisch von Zuständen auf höherer Ebene behandelt werden. Mit anderen Worten, hierarchische Zustandsnisten ermöglicht Programmierung nach Differenz.[9]
Der Aspekt der staatlichen Hierarchie betonte am häufigsten Abstraktion- Eine alte und leistungsstarke Technik zum Umgang mit Komplexität. Anstatt gleichzeitig alle Aspekte eines komplexen Systems anzugehen, ist es häufig möglich, einige Teile des Systems zu ignorieren (abstrakt). Hierarchische Zustände sind ein idealer Mechanismus, um interne Details zu verbergen, da der Designer leicht herauszoomen oder vergrößern oder verschachtelte Zustände zeigen kann.
Verbundzustände verbergen jedoch nicht einfach die Komplexität. Sie reduzieren es auch aktiv durch den starken Mechanismus der hierarchischen Ereignisverarbeitung. Ohne eine solche Wiederverwendung könnte selbst eine mäßige Zunahme der Systemkomplexität zu einer explosiven Zunahme der Anzahl von Zuständen und Übergängen führen. Beispielsweise vermeidet die hierarchische Zustandsmaschine, die den Taschenrechner darstellt (Abbildung 3), die Übergänge klar und in praktisch jedem Zustand auszuschalten. Die Vermeidung der Wiederholung ermöglicht es, dass das Wachstum von HSMs proportional zum Wachstum der Systemkomplexität bleibt. Mit dem modellierten System nimmt auch die Wiederverwendung zu und wirkt möglicherweise der unverhältnismäßigen Zunahme der für traditionellen FSMs typischen Zustände und Übergänge entgegen.
Orthogonale Regionen
Die Analyse nach hierarchischer Zustandsabteilung kann die Anwendung der Operation "exklusiv-or" auf einen bestimmten Zustand umfassen. Wenn sich beispielsweise ein System im "On" -Superstat befindet (Abbildung 3), kann es auch sein, dass es sich auch in "Operand1" -Spackung oder im "Operand2" -Spack oder im "Openered" Substate oder dem "Ergebnis" befindet. Untergang. Dies würde zur Beschreibung des "On" -Superstats als 'oder Staat' führen.
UML StateChArts stellen auch die komplementäre und dekompositionale vor. Eine solche Zersetzung bedeutet, dass ein zusammengesetzter Zustand zwei oder mehr orthogonale Regionen (orthogonale Mittel in diesem Zusammenhang kompatibel und unabhängig) enthalten kann und dass es sich um einen solchen zusammengesetzten Zustand befindet, in allen orthogonalen Regionen gleichzeitig zu sein.[10]
Orthogonale Regionen befassen sich mit dem häufigen Problem einer kombinatorischen Zunahme der Anzahl der Zustände, wenn das Verhalten eines Systems in unabhängige, gleichzeitig aktive Teile fragmentiert ist. Abgesehen von der Haupttastatur verfügt beispielsweise über eine Computertastatur über eine unabhängige numerische Tastatur. Aus der vorherigen Diskussion erinnern Sie sich an die beiden Zustände der Haupttastatur, die bereits identifiziert wurden: "Standard" und "Caps_locked" (siehe Abbildung 1). Die numerische Tastatur kann auch in zwei Zuständen vorhanden sein - "Zahlen" und "Pfeile" - nicht in der Lage, ob die Num -Sperre aktiv ist. Der vollständige Zustandsraum der Tastatur in der Standardabteilung ist daher die kartesisches Produkt der beiden Komponenten (Haupttastatur und numerischer Tastatur) und bestehen aus vier Zuständen: "Standard -in -Zeugen", "Standard -Arrows", "Caps_locked -inzahlern" und "Caps_Locked -Arms". Dies wäre jedoch eine unnatürliche Darstellung, da das Verhalten der numerischen Tastatur nicht vom Zustand der Haupttastatur abhängt und umgekehrt. Die Verwendung orthogonaler Regionen ermöglicht das Mischen unabhängiger Verhaltensweisen als kartesisches Produkt, um zu vermeiden und stattdessen getrennt zu bleiben, wie in Abbildung 4 dargestellt.

Beachten Sie, dass ihre kombinierte Komplexität einfach additiv ist, wenn die orthogonalen Regionen vollständig unabhängig voneinander sind K + l + m + ..., wo k, l, m, ... Zeigen Sie die Anzahl der oder States in jeder orthogonalen Region an. Der allgemeine Fall der gegenseitigen Abhängigkeit hingegen führt jedoch zu einer multiplikativen Komplexität. Im Allgemeinen ist die Anzahl der benötigten Zustände das Produkt k × l × m × ....
In den meisten Situationen im realen Leben wären orthogonale Regionen nur ungefähr orthogonal (d. H. Nicht wirklich unabhängig). Daher bieten UML StatechArts orthogonale Regionen eine Reihe von Möglichkeiten zur Kommunikation und Synchronisierung ihres Verhaltens. Unter diesen reichen Sätzen von (manchmal komplexen) Mechanismen ist das vielleicht wichtigste Merkmal, dass orthogonale Regionen ihr Verhalten koordinieren können, indem er sich gegenseitig Ereignisinstanzen sendet.
Auch wenn orthogonale Regionen die Unabhängigkeit der Ausführung implizieren (was mehr oder weniger Parallelität zulässt), erfordert die UML -Spezifikation nicht, dass jeder orthogonalen Region ein separater Ausführungsthread zugeordnet wird (obwohl dies bei gewünschtem Wunsch erfolgt). Am häufigsten werden orthogonale Regionen im selben Thread ausgeführt.[11] Die UML -Spezifikation erfordert nur, dass der Designer nicht auf eine bestimmte Reihenfolge angewiesen ist, damit Ereignisinstanzen in die entsprechenden orthogonalen Regionen versandt werden.
Eintritts- und Ausgangsaktionen
Jeder Staat in einem UML StatechArt kann optional sein Eintrittsaktionen, die beim Eintritt in einen Staat und optional ausgeführt werden Aktionen beenden, die beim Ausgang aus einem Staat ausgeführt werden. Eintritts- und Ausstiegsaktionen sind mit Zuständen verbunden, nicht mit Übergängen. Unabhängig davon, wie ein Staat eingegeben oder verlassen wird, werden alle Eintritts- und Ausgangsaktionen ausgeführt. Wegen dieser Merkmal Moore -Maschinen. Die UML -Notation für staatliche Eintrags- und Ausgangsaktionen besteht darin, das reservierte Wort "Eintrag" (oder "Beenden") in den Zustand direkt unter dem Namensfach zu platzieren, gefolgt von der Vorwärtsschrägung und der Liste der willkürlichen Aktionen (siehe Abbildung 5).

Der Wert von Eintritts- und Ausgangsaktionen besteht darin, dass sie Mittel zur Verfügung stellen Garantierte Initialisierung und Reinigung, sehr ähnlich wie Klassenkonstrukteure und Destruktoren in Objekt orientierte Programmierung. Betrachten Sie beispielsweise den Status "Door_open" aus Abbildung 5, der dem Toaster -Ofenverhalten entspricht, während die Tür geöffnet ist. Dieser Zustand hat eine sehr wichtige, sicherheitskritische Anforderung: Deaktivieren Sie immer die Heizung, wenn die Tür geöffnet ist. Während die Tür offen ist, sollte die innere Lampe den Ofen beleuchten.
Natürlich könnte ein solches Verhalten durch Hinzufügen geeigneter Aktionen (Deaktivieren der Heizung und Einschalten des Lichts) zu jedem Übergangsweg modelliert werden "oder wenn der Ofen überhaupt nicht verwendet wird). Es sollte nicht vergessen werden, die innere Lampe mit jedem Übergang zu löschen, der den Status "Door_open" verlässt. Eine solche Lösung würde jedoch die verursachen Wiederholung von Aktionen in vielen Übergängen. Noch wichtiger ist, dass ein solcher Ansatz den Entwurfsfehler bei den nachfolgenden Verhaltensänderungen verlässt (z. B. der nächste Programmierer, der an einem neuen Merkmal wie dem erstklassigen Braun arbeitet, könnte einfach vergessen, die Heizung beim Übergang zu "dopenen" zu deaktivieren).
Die Eintritts- und Ausstiegsaktionen ermöglichen die Implementierung des gewünschten Verhaltens sicherer, einfacher und intuitiver. Wie in Abbildung 5 gezeigt, könnte angegeben werden, dass die Ausgangsaktion aus "Heizung" die Heizung deaktiviert, die Eingangsaktion in "Doopen" die Ofenlampe hinaufleuchtet, und die Ausgangsaktion von "doopen" löscht die Lampe. Die Verwendung von Einstiegs- und Ausgangsaktionen ist vorzuziehen, eine Aktion auf einen Übergang zu platzieren, da sie sich wiederholt und die Funktion verbessert, indem ein Sicherheitsrisiko beseitigt wird. (Heizung an der Tür offen). Die Semantik von Ausstiegsaktionen garantiert, dass die Heizung unabhängig vom Übergangspfad deaktiviert wird, wenn sich der Toaster nicht im "Heizungszustand" befindet.
Da Einstiegsaktionen automatisch ausgeführt werden, wenn ein zugehöriger Zustand eingegeben wird, bestimmen sie häufig die Betriebsbedingungen oder die Identität des Zustands, genau wie ein Klassenkonstruktor die Identität des konstruierten Objekts bestimmt. Zum Beispiel wird die Identität des "Heizungszustands" durch die Tatsache bestimmt, dass die Heizung eingeschaltet ist. Diese Bedingung muss vor dem Eintritt in einen Untergang von "Heizung" festgelegt werden, da die Einstiegsaktionen in einen Untergang mit "Heizung" wie "Toasten" auf die ordnungsgemäße Initialisierung des "Heizung" -Superstats beruhen und nur die Unterschiede aus dieser Initialisierung durchführen. Infolgedessen muss die Reihenfolge der Ausführung von Einstiegsaktionen immer vom äußersten Zustand in den innersten Zustand (oben nach unten) verlaufen.
Es überrascht nicht, dass diese Reihenfolge der Reihenfolge analog ist, in der Klassenkonstruktoren aufgerufen werden. Die Konstruktion einer Klasse beginnt immer an der Wurzel der Klassenhierarchie und folgt durch alle Vererbungsstufen bis zur sofortigen Klasse. Die Ausführung von Exit-Aktionen, die dem Aufruf des Destruktors entsprechen, erfolgt in der genauen umgekehrten Reihenfolge (Bottom-up).
Interne Übergänge
Sehr häufig führt ein Ereignis nur einige interne Aktionen aus, führt jedoch nicht zu einer Zustandsänderung (Zustandsübergang). In diesem Fall umfassen alle ausgeführten Aktionen die interner Übergang. Wenn man beispielsweise auf einer Tastatur eingeht, reagiert es, indem es unterschiedliche Zeichencodes generiert. Sofern die Taste der CAPS -Sperre jedoch nicht gedrückt wird, ändert sich der Status der Tastatur nicht (es tritt kein Zustandsübergang auf). In UML sollte diese Situation mit internen Übergängen modelliert werden, wie in Abbildung 6 dargestellt. Die UML -Notation für interne Übergänge folgt der allgemeinen Syntax, die für Ausstiegsaktionen (oder Eintrag) verwendet wird, außer anstelle des Worteintrags (oder dem Ausgang) den internen Übergang wird mit dem Auslöserereignis gekennzeichnet (z. B. siehe der interne Übergang, der durch das Ereignis Any_key in Abbildung 6 ausgelöst wird).

In Ermangelung von Einstiegs- und Ausgangsaktionen wären interne Übergänge identisch mit Selbstübergang (Übergänge, in denen der Zielzustand mit dem Quellstatus gleich ist). In der Tat in einer klassischen Mehlige Maschine, Aktionen sind ausschließlich mit Zustandsübergängen verbunden. Die einzige Möglichkeit, Aktionen ohne Änderung des Zustands auszuführen, besteht darin, durch eine Selbstübergangsabteilung (in Abbildung 1 aus dem oberen Rand dieses Artikels als gerichtete Schleife dargestellt). In Gegenwart von Einstiegs- und Ausstiegsaktionen wie bei UML-StateCharts beinhaltet eine Selbstübergang jedoch die Ausführung von Ausstiegs- und Eintrittsaktionen und unterscheidet sich daher unterscheidend von einem internen Übergang.
Im Gegensatz zu einer Selbstübergang werden aufgrund eines internen Übergangs nie Eintritts- oder Ausstiegsaktionen ausgeführt, selbst wenn der interne Übergang von einer höheren Ebene der Hierarchie als der derzeit aktive Zustand geerbt wird. Interne Übergänge, die von Superstates auf einem beliebigen Nest -Act geerbt wurden, als ob sie direkt im aktuell aktiven Zustand definiert wären.
Übergangsausführungssequenz
Die staatliche Verschachtelung in Kombination mit Eintritts- und Ausstiegsaktionen erschwert die Semantik des Zustandsübergangs in HSMs im Vergleich zu den herkömmlichen FSMs erheblich. Beim Umgang mit Hierarchisch verschachtelte Staaten und orthogonale Regionen, der einfache Begriff aktuellen Zustand Kann ziemlich verwirrend sein. In einem HSM kann mehr als ein Zustand gleichzeitig aktiv sein. Wenn sich die Zustandsmaschine in einem Blattzustand befindet, der in einem zusammengesetzten Zustand enthalten ist (der möglicherweise in einem zusammengesetzten Zustand über höherer Ebene und so weiter enthalten ist), sind alle zusammengesetzten Zustände, die entweder direkt oder transitiv den Blattzustand enthalten . Da einige der zusammengesetzten Zustände in dieser Hierarchie möglicherweise orthogonale Regionen haben könnten, wird der aktuelle aktive Zustand tatsächlich durch einen Baum von Staaten dargestellt, der mit dem einzelnen oberen Zustand an der Wurzel bis hin zu einzelnen einfachen Zuständen an den Blättern beginnt. Die UML -Spezifikation bezieht sich auf einen solchen Zustandsbaum als Zustandskonfiguration.[1]

In UML kann ein Zustandsübergang direkt zwei Staaten verbinden. Diese beiden Zustände, die zusammengesetzt werden können, werden als die bezeichnet Hauptquelle und die Hauptziel eines Übergangs. Abbildung 7 zeigt ein einfaches Übergangsbeispiel und erläutert die Zustandsrollen in diesem Übergang. In der UML -Spezifikation wird vorgeschrieben, dass die Einnahme eines Zustandsübergangs die folgenden Aktionen in der folgenden Sequenz ausführt (siehe Abschnitt 15.3.14 in OMG Unified Modeling Language (OMG UML), Infrastruktur Version 2.2[1]):
- Bewerten Sie den mit dem Übergang verbundenen Schutzzustand und führen Sie die folgenden Schritte nur aus, wenn der Wachmann true bewertet.
- Beenden Sie die Quellstatuskonfiguration.
- Führen Sie die mit dem Übergang verbundenen Aktionen aus.
- Geben Sie die Konfiguration des Zielzustands ein.
Die Übergangssequenz ist im einfachen Fall sowohl der Hauptquelle als auch der Hauptziel -Verschachtelung auf derselben Ebene leicht zu interpretieren. Zum Beispiel führt der in Abbildung 7 gezeigte Übergang T1 die Bewertung der Wache g (); gefolgt von der Abfolge von Aktionen: a(); b(); t(); c(); d();
und e ()
; Angenommen, die Wache g()
bewertet true.
Im allgemeinen Fall von Quell- und Zielzuständen, die auf verschiedenen Ebenen der staatlichen Hierarchie verschachtelt sind, ist es jedoch möglicherweise nicht sofort offensichtlich, wie viele Nestebenen ausgeschlossen werden müssen. Die UML -Spezifikation[1] schreibt vor, dass ein Übergang alle verschachtelten Zustände aus dem aktuellen aktiven Zustand (der möglicherweise ein direkter oder transitiver Untergang des Hauptquellenzustands sein könnte), bis, aber nicht einschließlich der am wenigsten gemeinsamer Vorfahr (LCA) Zustand der Hauptquelle und der Hauptzielzustände. Wie der Name schon sagt, ist die LCA der niedrigste zusammengesetzte Zustand, der gleichzeitig ein Superstat (Vorfahr) sowohl der Quelle als auch der Zielzustände ist. Wie bereits beschrieben, ist die Reihenfolge der Ausführung von Ausstiegsaktionen immer vom am tiefsten verschachtelten Zustand (dem aktuellen aktiven Zustand) die Hierarchie bis zur LCA, ohne die LCA zu verlassen. Zum Beispiel ist die LCA (S1, S2) von Zuständen "S1" und "S2" in Abbildung 7 "S". S.
Die Eingabe der Konfiguration des Zielzustands beginnt von der Ebene, in der die Ausgangsaktionen aufgelassen wurden (d. H. Aus dem Inneren der LCA). Wie bereits beschrieben, müssen Einstiegsaktionen von dem Zustand auf höchster Ebene in der staatlichen Hierarchie bis zum Hauptzielzustand ausgeführt werden. Wenn der Hauptzielstatus zusammengesetzt ist, verschreibt die UML -Semantik, die in ihre Untermachung "Bohrer" mit den lokalen anfänglichen Übergängen "bohren". Die Konfiguration des Zielzustands wird erst nach Begegnung mit einem Blattzustand mit anfänglichen Übergängen vollständig eingegeben.
Lokale versus externe Übergänge
Vor Uml 2,[1] Die einzige verwendete Übergangssemantik war die externer Übergang, in der die Hauptquelle des Übergangs immer verlassen wird und das Hauptziel des Übergangs immer eingegeben wird. UML 2 bewahrte die "externe Übergangssemantik Lokaler Übergang (Siehe Abschnitt 15.3.15 in Unified Modeling Language (UML), Infrastruktur Version 2.2[1]). Für viele Übergangstopologien sind externe und lokale Übergänge tatsächlich identisch. Ein lokaler Übergang führt jedoch nicht dazu, dass der Hauptzielstatus ein Untergang der Hauptquelle ist. Darüber hinaus führt ein lokaler staatlicher Übergang nicht aus dem Hauptziel, wenn das Hauptziel ein Superstat des Hauptquellenzustands ist und sie wieder eintritt.

8 kontrastiert lokale (a) und externe (b) Übergänge. In der oberen Reihe sehen Sie den Fall der Hauptquelle, die das Hauptziel enthält. Der lokale Übergang führt nicht aus der Quelle aus, während der externe Übergang den Ausgang und die Wiedereintritt in die Quelle verursacht. In der unteren Reihe von Abbildung 8 sehen Sie den Fall des Hauptziels, das die Hauptquelle enthält. Der lokale Übergang führt nicht zu dem Eintritt in das Ziel, während der externe Übergang den Ausgang und die Wiedereintritt in das Ziel verursacht.
Ereignisverschiebung
Manchmal kommt ein Ereignis zu einem besonders unpraktischen Zeitpunkt an, wenn sich eine Staatsmaschine in einem Zustand befindet, der das Ereignis nicht bewältigen kann. In vielen Fällen ist die Art des Ereignisses so, dass es (innerhalb von Grenzen) verschoben werden kann, bis das System in einen anderen Zustand eintritt, in dem es besser auf das ursprüngliche Ereignis vorbereitet ist.
UML -Staatsmaschinen bieten einen besonderen Mechanismus für Ereignisse verschieben in Staaten. In jedem Bundesstaat können Sie eine Klausel angeben [Ereignisliste]/Defer
. Wenn ein Ereignis in der aufgeschobenen Ereignisliste des aktuellen Staates erfolgt, wird das Ereignis für die zukünftige Verarbeitung gespeichert (aufgeschoben), bis ein Staat eingegeben wurde, bei dem das Ereignis erst in seiner aufgeschobenen Ereignisliste aufgeführt ist. Bei Eintritt in einen solchen Zustand erinnert die UML -Statusmaschine automatisch auf gespeicherte Ereignisse, die nicht mehr aufgeschoben werden und diese Ereignisse entweder verbrauchen oder verwerfen. Es ist möglich, dass ein Superstaat einen Übergang auf einem Ereignis definiert hat, das von einem Untergang aufgeschoben wird. In Übereinstimmung mit anderen Bereichen in der Spezifikation von UML -Zustandsmaschinen hat der Untergang Vorrang vor dem Superstat, das Ereignis wird verschoben und der Übergang für den Superstate wird nicht ausgeführt. Bei orthogonalen Regionen, in denen eine orthogonale Region ein Ereignis vertieft und eine andere das Ereignis konsumiert, hat der Verbraucher Vorrang und das Ereignis wird verbraucht und nicht verschoben.
Die Einschränkungen von UML -Staatsmaschinen
Harel StateCharts, die Vorläufer von UML -Staatsmaschinen sind, wurden als "visueller Formalismus für komplexe Systeme" erfunden.[2] Von Anfang an wurden sie untrennbar mit der grafischen Darstellung in Form von Zustandsdiagrammen verbunden. Es ist jedoch wichtig zu verstehen, dass das Konzept der UML -Zustandsmaschine eine bestimmte Notation, grafisch oder textlich überschreitet. Die UML -Spezifikation[1] macht diese Unterscheidung durch deutliche Trennung der Semantik der Zustandsmaschine von der Notation.
Die Notation von UML StatechArts ist jedoch nicht rein visuell. Jede nicht triviale Zustandsmaschine erfordert eine große Menge an Textinformationen (z. B. die Spezifikation von Aktionen und Wachen). Die genaue Syntax von Handlungs- und Schutzausdrücken ist in der UML -Spezifikation nicht definiert, so dass viele Menschen entweder strukturiertes Englisch oder formaler Ausdrücke in einer Implementierungssprache wie z. C, C ++, oder Java.[12] In der Praxis bedeutet dies, dass UML StatechArt -Notation stark von der spezifischen abhängt Programmiersprache.
Dennoch sind die meisten StateChArts -Semantik stark auf grafische Notation voreingenommen. Zum Beispiel stellen Zustandsdiagramme die Abfolge der Verarbeitung schlecht dar, sei es Reihenfolge der Bewertung von Wachen oder Reihenfolge der Versand von Ereignissen an orthogonale Regionen. Die UML -Spezifikation setzt diese Probleme auf, indem der Designer die Belastung darstellt, sich nicht auf eine bestimmte Sequenzierung zu verlassen. Es ist jedoch der Fall, dass bei der Umsetzung von UML -Staatmaschinen die Ausführungsreihenfolge unweigerlich volle Kontrolle gibt, was dazu führt, dass die UML -Semantik möglicherweise unnötig restriktiv ist. In ähnlicher Weise erfordern die Staltendiagramme eine Menge Sanitärausrüstung (Pseudostates, wie Verbindungen, Gabeln, Übergänge, Auswahlpunkte usw.), um den Steuerfluss grafisch darzustellen. Mit anderen Worten, diese Elemente der grafischen Notation tragen nicht viel Wert bei der Darstellung des Kontrollflusss im Vergleich zu Ebene bei strukturierter Code.
Die UML -Notation und die Semantik sind wirklich auf computergestützt UML -Werkzeuge. Eine UML -Zustandsmaschine, wie in einem Werkzeug dargestellt, ist nicht nur das Zustandsdiagramm, sondern eine Mischung aus grafischer und textueller Darstellung, die sowohl die staatliche Topologie als auch die Aktionen genau erfasst. Die Benutzer des Tools können mehrere komplementäre Ansichten derselben staatlichen Maschine erhalten, sowohl visuell als auch textuell, während der generierte Code nur eine der vielen verfügbaren Ansichten ist.
Siehe auch
Verweise
- ^ a b c d e f g h i j k l OMG (Februar 2009). "OMG Unified Modeling Language (OMG UML), Überbauung Version 2.2".
- ^ a b Harel, David (1987). "StateCharts: Ein visueller Formalismus für komplexe Systeme" (PDF).
- ^ D. Drusinsky, Modellierung und Überprüfung unter Verwendung von UML StatechArts, Elsevier, 2006
- ^ Samek, Miro (März 2009). "Ein Absturzkurs in UML -State -Maschinen".
- ^ Samek, Miro (2008). Praktische UML-StateChArts in C/C ++, zweite Ausgabe: ereignisgesteuerte Programmierung für eingebettete Systeme. Newnes. p. 728. ISBN 978-0-7506-8706-5.
- ^ a b Samek, Miro (April 2003). "Wer hat meinen Staat bewegt?". C/C ++ Users Journal, die eingebettete Winkelspalte.
- ^ Selic, Bran; Gullekson, Garth; Ward, Paul T. (1994). Echtzeit-objektorientierte Modellierung. John Wiley & Sons. p. 525. ISBN 0-471-59917-4.
- ^ Samek, Miro (August 2003). "Zurück zum Wesentlichen". C/C ++ Users Journal, die eingebettete Winkelspalte.
- ^ Samek, Miro (Juni 2003). "DJ Vu". C/C ++ Users Journal, die eingebettete Winkelspalte. Archiviert von das Original Am 2012-09-30.
- ^ Harel, David; Politi, Michal (1998). Modellierung reaktiver Systeme mit StatechArts, der Statemate -Ansatz. McGraw-Hill. p. 258. ISBN 0-07-026205-5.
- ^ Douglass, Bruce Powel (1999). Schwierige Zeit machen: Entwicklung von Echtzeitsystemen mit UML, Objekten, Frameworks und Mustern. Addison Wesley. p.749. ISBN 0-201-49837-5.
- ^ Douglass, Bruce Powel (Januar 1999). "Uml staatsecharts". Programmierung eingebetteter Systeme.