Sequenzdiagramme mit Rational XDE
In diesem Beispiel werden ein paar grundlegende Sequenzdiagramm-Tricks gezeigt.
Es basiert auf einer Standard-MFC-Anwendung (SDI-Anwendung, CView als Basisklasse der View).
Sie fängt Mausklicks ab, speichert die Punkte in einer Liste im Document und stellt die
Anzahl der Klicks in der View dar.
Das Beispiel plus Diagramm gibt es hier: RationalSequenzdiagramm.zip
Diagramm anlegen
Zuerst einmal ein Rational-Projekt erzeugen und mit der Anwendung synchronisieren lassen.
Dann im ModelExplorer per Rechtsklick -> "Add Diagramm" -> "Sequence: Instance" ein neues Sequenzdiagramm
zufügen.
Aus der Rational-Hilfe:
Types of Sequence Diagrams
A sequence diagram belongs to an interaction in a collaboration or an interaction instance
in a collaboration instance. If you are working with an interaction in a collaboration you
use a sequence role diagram. If you are working with an interaction instance in a
collaboration instance you use a sequence instance diagram.
Definition von "Collaboration Instance":
A collaboration instance is a model element that contains a group of objects that
work together to realize a behavior that is specified by a use case, class, or operation.
Das heißt für die Darstellung von Use Cases benötigen wir ein "Sequence: Instance"-Diagramm.
Schritt 1: Aktor ins Spiel bringen:
Wir benötigen ein Use-Case-Diagramm. Das Diagramm des Beispiels ist ziemlich trivial: es gibt
einen Aktor "Benutzer" und einen Use-Case "Klick".
Da der Use Case des Sequenzdiagramms von einem Aktor angestoßen wird, gehen wir in den Model-Explorer
und ziehen den Aktor ins Diagramm. Rational legt automatisch eine Instanz des Aktors an, mit dem
Default-Namen "Object1". Da wir nur einen Aktor haben löschen wir den Instanz-Namen wieder, so dass nur ":Aktorname" im
Diagramm übrig bleibt.
Schritt 2: Die erste Message
Über die Methode "OnLButtonDown" wird der UseCase "Klick" gestartet. Wir ziehen also die
View-Klasse aus dem ModelExplorer ins Diagramm und löschen auch hier den automatisch vergebenen
Namen "Object1". Aus der Toolbox zieht man eine "Message" ins Diagramm zwischen den Aktor und
die View-Klasse. Die Message erhält den Default-Namen "CalledOperation". Sie bietet beim Editieren
eine Auswahlliste aller vorhandenen Methoden an, und da finden wir auch "OnLButtonDown" mitsamt allen
Parametern.
Das Spielchen wiederholen wir für die Document-Klasse und "AddPoint" (korrekte Parameter werden zugefügt).
Die Anzeige der Parameter können wir konfigurieren, indem wir den Message-Pfeil (nicht den Message-Namen) auswählen
und in die Properties gehen. Unter "MessageSignature" finden wir verschiedene Möglichkeiten der Anzeige,
u.a. "nur Parameternamen" und "Parameternamen und -Typ".
"AddPoint" wiederum ruft als erstes "ContainsPoint" auf, wird also als "Self Message" aus der Toolbox zugefügt.
Für die Verknüpfung der neu zugefügten Message mit der Methode wählen wir die Methode im ModelExplorer und ziehen sie
auf die Message. Achtung: das hat bei mir nicht funktioniert wenn gerade irgendetwas im Diagramm gewählt war !
Nach Rücksprung in die View wird die Basisklassen-Methode "InvalidateRect" (von CWnd) aufgerufen
und wir sind fertig.
Das Ergebnis sieht so aus:
Weiteres
Weitere Features:
Return Messages gibt es zwar, allerdings ohne weitere Kommentare. Hier müssen wir also "Text" zufügen.
Bedingungen für Methodenaufrufe können beim Methodenbearbeiten in die eckigen Klammern
vor dem Methodennamen eingetragen werden, oder aber in den Properties als "Guard Condition".
Beispielsweise könnte man in diesem Beispielprogramm "ContainsPoint" in der View aufrufen und nur bei
Rückgabewert "FALSE" die Methode "AddPoint" aufrufen. Dies würde zu folgender Guard Condition führen:
"bContainsPoint == FALSE". (bContainsPoint sei eine Variable, die den Rückgabewert von "ContainsPoint" enthält).
Constraints: Im Sequenzdiagramm können wir OCL-Constraints an Messages (bzw. an die Pfeile) hängen.
Allerdings habe ich die nicht mit gültiger Syntax hinbekommen (Menü "Diagram" -> "Validate Diagram") gab immer
die Fehlermeldung "The context of OCL constraint {....} should be a classifier, or an element owned by a classifier (typically, an operation or a transition)."
Version 1.0.0.0, Stand 31.05.2005
Historie:
1.0.0.0 (31.05.2005) Zugefügt