Hinzufügen von Auswahlsegmenten

In Zustandsautomaten müssen Sie häufig nur dann einen Zustandsübergang durchführen, wenn eine bestimmte Bedingung (Guard-Bedingung genannt) zur Laufzeit als WAHR ausgewertet wird. Außerdem müssen Sie häufig in verschiedene Zustände wechseln, abhängig vom Ergebnis einiger zur Laufzeit ausgewerteter Schutzbedingungen.

Die UML bietet ein spezielles Konstrukt namens “choice pseudostate”, das Sie in solchen Situationen verwenden können. Mit einem “choice pseudostate” können Sie einen Übergang in mehrere ausgehende Pfade aufteilen, von denen jeder seine eigene Schutzbedingung hat.

Beachten Sie, dass es nützlich ist, über den Pseudozustand der Auswahl nachzudenken, wie er in Abbildung (B) des obigen Diagramms als zusammengesetzte Anweisungif (guard1()) {...} else if (guard2()) {...}dargestellt ist (so implementiert der QM ™ -Codegenerator tatsächlich Auswahlsegmente). Achtung, da Wachen zuIFs undELSEs im Code führen, führt ihre Überbeanspruchung zu “Spaghetti” -Code und vereitelt den Zweck der Verwendung von Zustandsmaschinen. Aus diesem Grund sollten Wachen mit Bedacht eingesetzt werden.

In den meisten UML-Werkzeugen besteht der Prozess des Zeichnens von Auswahlsegmenten darin, zuerst einen “Auswahl-Pseudozustand” (Diamant) hinzuzufügen und dann ein ausgehendes Übergangssegment mit einem Schutz anzubringen. In QM ™ wird dieser Prozess vereinfacht, da die State Machine Toolbox ein gebrauchsfertiges Auswahlsegment-Tool enthält, das einen “Auswahl-Pseudozustand” mit einem permanent daran angehängten Übergangssegment kombiniert.

Hinweis Dieses Segment ist die einzige Möglichkeit in QM ™, eine Schutzbedingung an einen Übergang anzuhängen, wie in Abbildung (A) des obigen Diagramms dargestellt. Das QM ™ Choice-Segment ist jedoch leistungsfähiger als einfache Schutzmechanismen für Übergänge, wie in den folgenden Abschnitten erläutert. Hinweis Um ein Auswahlsegment hinzuzufügen, müssen Sie zunächst ein Zustandsdiagramm erstellen und anzeigen. Zusätzlich muss die Zustandsmaschine mindestens einen internen Übergang (beendet mit) oder ein Auswahlsegment () haben. Zum Hinzufügen, Verschieben, Ändern der Größe oder Bearbeiten von Auswahlsegmenten muss das Zustandsmaschinendiagramm entsperrt sein ().

Stellen Sie sicher, dass das Unterfenster der Zustandsmaschine aktiv ist. Klicken Sie in der Zustandsmaschinen-Toolbox auf das Auswahlsegment-Werkzeug und lassen Sie die Maustaste los (ziehen Sie das Werkzeug nicht aus der Symbolleiste). Wenn Sie an dieser Stelle mit der Maus über das aktive Zustandsdiagramm fahren, wechselt der Mauszeiger zum Auswahlsegmentwerkzeug mit dem Symbol “Verboten” (), da ein Auswahlsegment nur zu einem nicht verbundenen quadratischen Ende eines Übergangs hinzugefügt werden kann () oder zu einem vorhandenen Auswahlsegment (). Wenn Sie mit der Maus über einen zulässigen Befestigungspunkt für ein Auswahlsegment fahren, wechselt der Mauszeiger zum Auswahlsegmentwerkzeug mit dem Anker (). Um das Auswahlsegment zu diesem Befestigungspunkt hinzuzufügen, drücken Sie die Maustaste und ziehen Sie das Auswahlsegmentende an die gewünschte Kante des Zielzustands. Der so hergestellte Übergangspfad entspricht einem regelmäßigen Zustand-zu-Zustand-Übergang mit einer Wache.

Sie können auch ein Auswahlsegment hinzufügen, das zu einem internen Übergang mit einer Wache wird. Dazu ziehen Sie einfach das Ende des Auswahlsegments und legen es nicht an einer Statuskante ab. An diesem Punkt wird das Wahlsegment zu einem internen Übergang. Der interne Übergang wird vollständig innerhalb des Quellstatus ausgeführt und führt niemals zu einer Statusänderung.

Hinweis Die standardmäßige “normative” UML-Notation erlaubt es Ihnen nicht, interne Übergangssegmente zu ausgewählten Pseudozuständen hinzuzufügen. Im Gegensatz dazu ermöglicht die nicht normative Darstellung interner Übergänge in QM ™ das einfache Hinzufügen interner Übergangssegmente zu ausgewählten Pseudozuständen und das schnelle und intuitive Ändern des Übergangstyps, indem das Übergangsende an / von einem Zustand angehängt / gelöst wird.

Schließlich können Sie auch ein Auswahlsegment zu einem nicht verbundenen Ende eines anderen Auswahlsegments hinzufügen, wie in der folgenden Animation dargestellt:

Hinweis Diese Option zum Hinzufügen von Auswahlsegmenten zu bereits vorhandenen Auswahlsegmenten bedeutet, dass Sie komplexe verschachtelte Guards erstellen können. Wie bei allen Schutzbedingungen sollten Sie diese Funktion jedoch mit Bedacht verwenden, um “Spaghetti” -Code zu vermeiden.

Auswahlsegmentelement kann durch das auswahlspezifische Eigenschaftsblatt konfiguriert werden.

Eigenschaftsblatt des Auswahlsegments

Das Eigenschaftsblatt des Auswahlsegments enthält die folgenden Eigenschaften:

  • Choice Guard
  • Choice Target (nicht editierbar –geometrisch bestimmt)
  • Choice Action

Choice Guard

Jedes Choice-Segment in QM™ muss eine explizite Guard-Eigenschaft haben, die aus zwei Einträgen besteht: Pseudocode und code. Für die Codegenerierung ist nur der Codeeintrag der Eigenschaft guard relevant. Der Pseudocode-Eintrag soll nur im Diagramm angezeigt werden, um Unordnung zu vermeiden, indem die Textmenge minimiert wird, die neben der Übergangsform angezeigt werden soll.

Achtung Der Pseudocode-Eintrag der Guard-Eigenschaft ist nur für die Anzeige im Textfeld vorgesehen, das dem Auswahlsegment zugeordnet ist, hat jedoch keine Auswirkungen auf die Codegenerierung. Hinweis Die Eigenschaft guard wird im Textfeld des Auswahlsegments nach denselben Regeln wie das Übergangstextfeld angezeigt. Um die Übersichtlichkeit im Diagramm zu verringern, wird der Guard außerdem in abgekürzter Form angezeigt, wobei alle Leerzeichen im Guard entfernt und der resultierende Guard-Text auf 32 Zeichen abgeschnitten wird. (Wenn die Wache abgeschnitten ist, ist das letzte Zeichen ‘~’).

Für eine erfolgreiche Codegenerierung muss der Codeeintrag der guard-Eigenschaft ein legaler boolescher C- oder C++-Ausdruck sein. Der Ausdruck kann die Zustandsmaschinenattribute (über den me-Zeiger) und die Ereignisparameter des auslösenden Ereignisses (siehe Abschnitt unten) verwenden.

Zugriff auf das auslösende Ereignis: Der Guard-Ausdruck kann auf das ursprüngliche auslösende Ereignis (des Übergangs, an den die Auswahl direkt oder indirekt angehängt ist) zugreifen, das als e-Zeiger vom Typ (QEvt const * const) bereitgestellt wird. Dies bedeutet, dass Sie schreibgeschützten Zugriff auf das Ereignis haben und den Zeiger e nicht ändern können. Um auf Ereignisparameter des ursprünglichen auslösenden Ereignisses zuzugreifen, Sie müssen normalerweise den Ereigniszeiger heruntersetzen e. Dieser Downcast basiert immer auf dem Transition-Trigger (Signal des auslösenden Ereignisses, siehe Transition-Trigger), was bedeutet, dass Sie immer den dem Trigger zugeordneten Event-Typ (Event-Klasse) kennen müssen.

Auswahlziel

Die Zieleigenschaft ist nicht direkt editierbar, sondern wird geometrisch durch den Endpunkt des Auswahlsegments bestimmt. Für Zustandsübergänge listet die Eigenschaft target den Zielzustand auf, in dem der Endpunkt () endet. Für interne Übergänge mit dem quadratischen Endpunkt () zeigt die target-Eigenschaft internal .

Choice Action

Ein Choice-Segment kann eine optionale Action-Eigenschaft haben, die nur ausgeführt wird, wenn der Guard zur Laufzeit TRUE auswertet (siehe auch Reihenfolge der Aktionsauswertung).

Die Eigenschaft action besteht aus zwei Einträgen: Pseudocode und Code (siehe Auswahl-Eigenschaftsblatt). Nur der Codeteil der Eigenschaft action ist für die Codegenerierung relevant. Das Pseudocode-Feld soll nur im Diagramm angezeigt werden, um Unordnung zu vermeiden, indem die Textmenge minimiert wird, die neben der Übergangsform angezeigt werden soll.

Hinweis Der Pseudocode-Eintrag der Eigenschaft action ist nur für die Darstellung im Diagramm vorgesehen und hat keine Auswirkungen auf die Codegenerierung.

Zeiger auf das auslösende Ereignis: Der Choice-Aktionscode muss häufig auf das auslösende Ereignis zugreifen, das als e-Zeiger vom Typ (QEvt const * const) bereitgestellt wird. Dies bedeutet, dass Sie schreibgeschützten Zugriff auf das Ereignis haben und den Zeiger e nicht ändern können. Um auf Ereignisparameter des auslösenden Ereignisses zuzugreifen, Sie müssen normalerweise den Ereigniszeiger heruntersetzen e. Dieser Downcast basiert immer auf dem Transition-Trigger (Signal des auslösenden Ereignisses, siehe Transition-Trigger), was bedeutet, dass Sie immer den dem Trigger zugeordneten Event-Typ (Event-Klasse) kennen müssen.

Auswahltextfeld

Sobald das Auswahlsegmentelement als aktuelles Element ausgewählt ist, können Sie den Rand des Textfelds sehen, das dem Auswahlsegment zugeordnet ist. Mit dem Textfeld können Sie den Auswahltext verschieben und seine Größe ändern, indem Sie ihn nach demselben Algorithmus wie das Übergangstextfeld verschieben oder den Textfeldgriff ziehen.

Der else-Guard

Die guard-Eigenschaft kann als spezielles else-Schlüsselwort definiert werden. Ein solcher Schutz ergänzt alle anderen Schutzbedingungen, die an denselben Pseudozustand derselben Wahl geknüpft sind. Der else-Guard kann entweder im Codeeintrag oder Pseudocode-Eintrag der Guard-Eigenschaft angegeben werden. Offensichtlich ist der Guard “else” nur für einen choice Pseudostate mit Multiple-Choice-Segmenten sinnvoll.

Hinweis Während der Codegenerierung wird der else-Guard immer als letzter in der Gruppe aller Guards generiert, die demselben choice Pseudostate zugeordnet sind, unabhängig von seiner Reihenfolge im Modell-Explorer.

Auswahlsegmente ohne else

Gemäß der UML-Spezifikation muss ein Ereignis, das nicht verarbeitet werden kann, da alle Wachen auf FALSE ausgewertet werden, als unverarbeitet behandelt werden, was bedeutet, dass es an die Superstate weitergegeben werden muss. Diese Anforderung hat Auswirkungen auf die Auswahl von Pseudozuständen ohne explizites else-Segment. Um der UML-Semantik zu entsprechen, generiert der QM ™ -Codegenerator in solchen Fällen einen impliziten Zweig else, der die Ausbreitung des Ereignisses auf die Superstate verursacht.

Beachten Sie, dass es einen Unterschied zwischen einem choice pseudostate mit einem leeren else Segment und einem ansonsten identischen choice pseudostate ohne das else Segment gibt. Das explizite leere else führt dazu, dass das Ereignis verbraucht wird (ohne etwas zu tun), während das Fehlen des else Segments dazu führt, dass sich das Ereignis in die Superstate ausbreitet.

Reihenfolge der Guard-Bewertung

Die UML-Spezifikation verlangt, dass sich die Guard-Bedingungen, die an denselben Choice-Pseudozustand angehängt sind, gegenseitig ergänzen, so dass die Reihenfolge der Bewertung der Guards keine Rolle spielt. Während es im QM ™ weiterhin empfohlen wird, die Guards komplementär zu halten, wertet das Tool Guards immer in der vorgegebenen Reihenfolge aus, auf die Sie sich verlassen können.

Die Reihenfolge der Auswertung wird durch die Reihenfolge der Auswahlsegmentelemente im Modellexplorer bestimmt. Diese Reihenfolge kann über die Schaltflächen Nach oben und Unten in der Explorer-Symbolleiste geändert werden. Alternativ kann das aktuelle Element im Modell-Explorer mit den Tastenkombinationen Strg- (Taste hoch) und Strg- (Taste runter) nach oben oder unten verschoben werden.

Hinweis Bei überlappenden Schutzeinrichtungen Wenn die Reihenfolge der Schutzauswertung wichtig ist, wird dringend empfohlen, die Auswahlsegmente grafisch im Diagramm in der gleichen Reihenfolge wie im Modell-Explorer anzuordnen, wie im obigen Screenshot dargestellt. Der generierte Code folgt dann der gleichen Reihenfolge, wie rechts im obigen Diagramm gezeigt.

Reihenfolge der Aktionsauswertung

Alle Auswahlsegmente, die an einen Übergang angehängt sind, fügen die Auswahlsegmentaktionen der Aktion hinzu, die vom Übergang ausgeführt wird. Die Reihenfolge der Bewertung all dieser Aktionen ist intuitiv und beginnt immer mit der bedingungslos ausgeführten Übergangsaktion, gefolgt von der bedingten Bewertung von Choice-Segment-Aktionen.

Beispielsweise wird die Reihenfolge der Aktionsauswertung im obigen Diagramm durch den folgenden Pseudocode zusammengefasst:

. . .
fall TRIG: {
/* übergangsaktion… */
action0(); /* bedingungslos ausgeführt */
/* wahl Segmente… */
wenn (g1()) {
aktion1();
. . .
}
sonst wenn (g2()) {
aktion2();
. . .
}
sonst {
. . .
}
}
. . .

Verschachtelte Auswahlsegmente

Wie oben beschrieben, können Auswahlsegmente verschachtelt werden. Auf diese Weise können Sie komplexe bedingte Übergangspfade erstellen, aber wie immer bei Wachen sollte die Funktion nicht überbeansprucht werden.

Ein häufiger Fehler besteht beispielsweise darin, tief verschachtelte Auswahlsegmente zu verwenden, um zwischen einer Reihe möglicher Übergangspfade zu wählen (siehe Tafel (A) im Diagramm unten):

Eine bessere und viel einfachere Alternative ist die Verwendung von Multiple-Choice-Segmenten, die an denselben Pseudozustand angehängt sind, wie in Tafel (B) im obigen Diagramm gezeigt.

Hinweis Denken Sie daran, dass Sie viele Auswahlsegmente an einen bestimmten Übergang anhängen können. Ein Diagramm mit einer kleineren Anzahl von Pseudozuständen (Diamanten) ist ein besseres, leichter verständliches Diagramm. Achtung Der QM™ -Codegenerator begrenzt die Anzahl der Verschachtelungsebenen im Code auf 16 (einschließlich der Verschachtelung innerhalb von State-Handler-Funktionen). Die Verwendung von tief verschachtelten Auswahlsegmenten kann diese Grenze leicht überschreiten.

Multiple-Choice-Segmente

Ein Übergang mit Multiple-Choice-Segmenten, von denen einige möglicherweise verschachtelt sind, gruppiert viele Elemente in einem kleinen Diagrammraum. Um einen so komplexen “Ball der Verbinder” grafisch neu anzuordnen, müssen Sie die Grundregeln kennen, die in dieser Situation gelten.

Die erste Regel lautet: Bevor Sie die Form eines Elements ändern können, müssen Sie es zuerst auswählen.

Wenn Sie beispielsweise den choice-pseudostate (den Diamanten) verschieben möchten, müssen Sie auf den ursprünglichen eingehenden Übergang zum choice-pseudostate klicken. Bitte beachten Sie, dass Sie ganz speziell nicht auf die Rautenform selbst klicken sollten, da es sich tatsächlich um eine überlappende Sammlung des eingehenden Transionsendes plus aller ausgehenden Choce-Segmente handelt. Stattdessen müssen Sie entweder auf eines der Übergangssegmente oder das Anfang-Ende des Transitons klicken. (HINWEIS: Sie können auch ein beliebiges Modellelement in der Ansicht Modellexplorer eindeutig auswählen). Die folgende Animation veranschaulicht den Prozess:

Wenn Sie andererseits ein ausgehendes Auswahlsegment auswählen, können Sie den Auswahlpseudozustand nicht verschieben. Stattdessen können Sie jetzt nur das ausgewählte Auswahlsegment verschieben, um es erneut an eine andere Stelle anzuhängen.

Leave a Reply