Objektorientierte Analyse und Design - beim Fachbereich Informatik ...
Objektorientierte Analyse und Design - beim Fachbereich Informatik ...
Objektorientierte Analyse und Design - beim Fachbereich Informatik ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Hochschule Darmstadt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong><br />
<strong>Objektorientierte</strong> <strong>Analyse</strong> <strong>und</strong> <strong>Design</strong><br />
5.2 Umsetzung von UML-Klassen in C++<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong>
5.2 Umsetzung von UML-Klassen in C++<br />
Das Gr<strong>und</strong>problem<br />
class CTaschenrechner<br />
{<br />
private:<br />
CSpeicher m_cSpeicher;<br />
private:<br />
CEinAusgabe m_cEinAusgabe;<br />
private:<br />
CProzessor m_cProzessor;<br />
public:<br />
CTaschenrechner(void);<br />
public:<br />
void benutze();<br />
OOD-Modell Abbildung Coderahmen in<br />
bestimmter<br />
Programmiersprache<br />
(hier C++)<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 213<br />
};
5.2 Umsetzung von UML-Klassen in C++<br />
Umsetzung von Klassen <strong>und</strong> Assoziationen<br />
n� Umsetzung von Attributen, Methoden<br />
ð� Diese Konstrukte werden von OO-Sprachen direkt angeboten <strong>und</strong> können 1:1<br />
umgesetzt werden<br />
n� Spezialisierung/Generalisierung<br />
ð� Vererbung<br />
n� Schnittstellen<br />
ð� Klassen mit ausschließlich pure virtual Methoden<br />
n� Umsetzung einfacher Assoziationen<br />
ð� Realisierung über Attribute mit Referenz(en) auf ein anderes Objekt<br />
- Multiplizität = 0..1, 1..1 ein Zeiger<br />
- Multiplizität = 0..*, 1..* Verweis auf eine Menge von Objekten über Zeiger<br />
(Container-Klasse, z. B. Menge, Liste, Bäume,<br />
statische <strong>und</strong> dynamische Arrays, Hash-Tabellen)<br />
- Name des Attributes = Rollenname/Name der assoziierten Klasse<br />
Automatische Umsetzung durch Code(rahmen)generator ist möglich!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 214
5.2 Umsetzung von UML-Klassen in C++<br />
Assoziationen als Klassenattribute<br />
n� Umsetzung Dozent <strong>und</strong> Veranstaltung aus unserem Beispiel<br />
generierbar<br />
1<br />
Gehaltene_Veranstaltung<br />
*<br />
Dozent Veranstaltung<br />
Dozent<br />
Liste <br />
gehaltene_Veranstaltung<br />
...<br />
Veranstaltung*<br />
getVeranstaltung()<br />
...<br />
Referent<br />
...<br />
...<strong>und</strong> wie sieht der C++ Code aus?<br />
Veranstaltung<br />
Dozent* Referent :<br />
Dozent* getReferent ()<br />
...<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 215<br />
...<br />
generierbar
5.2 Umsetzung von UML-Klassen in C++<br />
Assoziationen als Klassenattribute in C++<br />
// Spezifikation von Veranstaltung<br />
class Veranstaltung {<br />
}<br />
protected:<br />
public:<br />
...<br />
Dozent* Referent;<br />
// Spezifikation von Dozent<br />
class Dozent {<br />
protected:<br />
public:<br />
...<br />
}<br />
Liste gehaltene_Veranstaltung;<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 216
5.2 Umsetzung von UML-Klassen in C++<br />
Frage: Umsetzung folgender Assoziation?<br />
*<br />
Firma Person<br />
Arbeitgeber<br />
Firma<br />
Liste <br />
Arbeitnehmer<br />
...<br />
arbeitet _für<br />
Person*<br />
getArbeitnehmer(string name)<br />
...<br />
1..*<br />
Arbeitnehmer<br />
FirmaA<br />
FirmaB<br />
Liste <br />
Arbeitgeber<br />
...<br />
Person<br />
Firma*<br />
getArbeitgeber(string name)<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 217<br />
...<br />
Maier<br />
Müller
5.2 Umsetzung von UML-Klassen in C++<br />
Umsetzung von Assoziationsklassen<br />
* 1..*<br />
A B<br />
C<br />
n� a kennt 1..n Objekte der Klasse B <strong>und</strong><br />
daran „hängt“ je ein Objekt der Klasse C<br />
n� a wählt ein Objekt der Klasse B aus <strong>und</strong><br />
erhält dazu ein Objekt c<br />
A B<br />
n� a kennt 1..n Objekte der Klasse C <strong>und</strong><br />
daran hängt je ein Objekt der Klasse B<br />
n� a durchsucht die Objekte der Klasse C<br />
bis das gesuchte b gef<strong>und</strong>en ist<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 218<br />
1<br />
1..*<br />
C<br />
*<br />
1
5.2 Umsetzung von UML-Klassen in C++<br />
Beispiel: Assoziationsklassen<br />
2.<br />
*<br />
Firma Person<br />
Arbeitgeber<br />
arbeitet _für<br />
Anstellung<br />
Gehalt<br />
urlaub_von_bis<br />
Urlaub_beantragen<br />
Firma<br />
Liste <br />
Arbeitnehmer<br />
...<br />
Anstellung*<br />
getAnstellung(Person* p)<br />
...<br />
1..*<br />
Arbeitnehmer<br />
1.<br />
Anstellung<br />
Firma* Arbeitgeber<br />
Person* Arbeitnehmer<br />
...<br />
Firma*<br />
getArbeitgeber()<br />
Person*<br />
getArbeitnehmer()<br />
...<br />
Firma Person<br />
Anstellung<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 219<br />
1<br />
1..*<br />
Person<br />
Liste <br />
Arbeitgeber<br />
...<br />
Anstellung*<br />
getAnstellung(Firma* f)<br />
...<br />
*<br />
1
5.2 Umsetzung von UML-Klassen in C++<br />
Beispiel: Assoziationsklassen (I)<br />
class Anstellung {<br />
protected:<br />
Firma* m_Arbeitgeber; // Referenz auf assoziiertes Objekt<br />
Person* m_Arbeitnehmer; // Referenz auf assoziiertes Objekt<br />
unsigned int Gehalt; // Attribut der Assoziation<br />
string urlaub_von_bis; // Attribut der Assoziation ...<br />
public:<br />
virtual Person* getArbeitnehmer (void) const{ return (m_Arbeitnehmer); }<br />
virtual Anstellung* setArbeitnehmer (const Person* einArbeitnehmer){<br />
m_Arbeitnehmer = einArbeitnehmer;<br />
return (this);<br />
}<br />
virtual Firma* getArbeitgeber (void) const{ return (m_Arbeitgeber);}<br />
virtual Anstellung* setArbeitgeber (const Firma* einArbeitgeber){<br />
m_Arbeitgeber = einArbeitgeber;<br />
return (this);<br />
}<br />
virtual void Urlaub_beantragen (string anfang_ende){<br />
urlaub_von_bis = anfang_ende;<br />
};<br />
...<br />
} // class Anstellung<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 220
5.2 Umsetzung von UML-Klassen in C++<br />
Beispiel: Assoziationsklassen (II)<br />
class Person {<br />
protected:<br />
Liste m_Arbeitgeber;<br />
public:<br />
Anstellung* getAnstellung (const Firma* dieFirma) const {<br />
// Navigieren auf dem Container gemäß gegebener Datenstruktur (Liste).<br />
// Liefert die Referenz auf das Objekt der Assoziationsklasse, das die<br />
// Referenz auf die übergebene Firma hält. So ist das Setzen <strong>und</strong> Lesen von<br />
// Attributen bzw. das Ausführen von Methoden der Assoziation möglich.<br />
}<br />
virtual unsigned getAnstellungsGehalt (const Firma* derArbeitgeber) const {<br />
// Zugriff auf ein Assoziationsklassen-Attribut:<br />
return (getAnstellung (derArbeitgeber)-> getGehalt());<br />
}<br />
void do_Anstellung_Urlaub_beantragen (const Firma* derArbeitgeber, string<br />
anfang_ende) {<br />
// Ausführen einer Assoziationsklassen-Methode:<br />
getAnstellung(derArbeitgeber)->Urlaub_beantragen(string anfang_ende);<br />
}<br />
...<br />
} // class Person<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 221
5.2 Umsetzung von UML-Klassen in C++<br />
Umsetzung von ternären <strong>und</strong> höherwertigen Assoziationen<br />
Verein Spieler<br />
*<br />
Statistik<br />
Siege<br />
Niederlagen<br />
Unentschieden<br />
Gegentore<br />
*<br />
Saison<br />
Torwart<br />
*<br />
Verein<br />
Liste<br />
<br />
dieStatistik<br />
Spieler<br />
Liste<br />
<br />
dieStatistik<br />
Saison<br />
Liste<br />
<br />
dieStatistik<br />
Statistik<br />
Verein* v<br />
Spieler* p<br />
Saison* s<br />
int Siege<br />
int Niederlagen<br />
int Unentschieden<br />
int Gegentore<br />
ð� Falls keine Assoziationsklasse existiert, lege eine (leere) Assoziationsklasse an<br />
ð� Ergänze die Attribute der Assoziationsklasse um die Referenzen auf alle 3 bzw. n<br />
assoziierten Objekte<br />
ð� In den assoziierten Objekten ergänze die Liste der Referenzen auf die Objekte<br />
der Assoziationsklasse<br />
- Sowohl die Assoziationsklasse als auch die assoziierten Klassen bieten Operationen,<br />
über die zu n assoziierten Objekten navigiert werden kann.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 222<br />
1<br />
1<br />
1<br />
*<br />
*<br />
*
5.2 Umsetzung von UML-Klassen in C++<br />
Umsetzung von Aggregation <strong>und</strong> Komposition<br />
Computersystem<br />
n� Normale Aggregation (Shared Aggregation)<br />
ð� Attribut vom Typ Zeiger auf das aggregierte Objekt<br />
(d. h. genau wie eine Assoziation)<br />
n� Komposition (Unshared Aggregation)<br />
1 0..1<br />
1 1..* 1..*<br />
Motherboard Festplatte<br />
Netzwerkkarte<br />
ð� Attribut vom Typ der Klasse selbst<br />
(Die Klasse ist im aggregierenden Objekt integriert)<br />
Monitor<br />
Stirbt das Ganze,<br />
leben die Teile weiter!<br />
Stirbt das Ganze,<br />
sterben auch die Teile!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 223
5.2 Umsetzung von UML-Klassen in C++<br />
Komposition<br />
n� Umsetzung der Komposition zwischen Computersystem <strong>und</strong> Motherboard aus<br />
unserem Beispiel<br />
1<br />
Computersystem Motherboard<br />
Computersystem<br />
Motherboard m_Motherboard<br />
...<br />
Motherboard getMotherboard()<br />
...<br />
...<strong>und</strong> wie sieht der C++Code aus?<br />
Motherboard<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 224<br />
...<br />
...
5.2 Umsetzung von UML-Klassen in C++<br />
Beispiel: Komposition als Klassenattribute in C++<br />
// Spezifikation von Computersystem<br />
class Computersystem {<br />
}<br />
protected:<br />
public:<br />
...<br />
Motherboard m_Motherboard;<br />
Motherboard getMotherboard();<br />
// Spezifikation von Motherboard<br />
class Motherboard {<br />
}<br />
protected:<br />
...<br />
public:<br />
...<br />
kein Pointer, sondern echte<br />
Instanz der Klasse!<br />
Frage: Was ändert sich<br />
(im Diagramm <strong>und</strong> im Code),<br />
wenn es mehrere Motherboards<br />
geben darf?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 225
5.2 Umsetzung von UML-Klassen in C++<br />
Kontrollfragen<br />
n� Wissen Sie jetzt, wie die UML Konstrukte auf C++ abgebildet werden?<br />
ð� Klassen mit Attributen <strong>und</strong> Methoden<br />
ð� Generalisierung/Spezialisierung<br />
ð� Abstrakte Klasse/Schnittstelle<br />
ð� Assoziationen: (normale) Assoziationen: einfache, mehrfache<br />
ð� Aggregation<br />
ð� Komposition<br />
ð� Navigationsrichtung<br />
ð� Assoziationsklassen<br />
Sie können jetzt ein UML-Klassendiagramm<br />
in C++-Code überführen!?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 226
Hochschule Darmstadt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong><br />
<strong>Objektorientierte</strong> <strong>Analyse</strong> <strong>und</strong> <strong>Design</strong><br />
5.3 Darstellung der Dynamik eines Systems<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong>
5.3 Darstellung der Dynamik eines Systems<br />
Grenzen von Klassendiagrammen<br />
n� Klassendiagramme liefern einen Überblick über die Bestand-<br />
teile des Systems <strong>und</strong> deren Beziehungen untereinander<br />
ð� Klassen mit Attributen, Methoden <strong>und</strong> Spezifikation beschreiben die<br />
(potenziellen) Fähigkeiten <strong>und</strong> die Verantwortlichkeiten der Bestandteile<br />
ð� Assoziationen stellen logische Beziehungen zwischen Klassen dar <strong>und</strong> zeigen<br />
(potenzielle) Kommunikations- <strong>und</strong> Verknüpfungsmöglichkeiten zwischen<br />
Objekten der Klassen<br />
ð� Beschreibung der Statik des Systems: „Strukturdiagramme“<br />
n� sie liefern keine Information darüber in welcher Art <strong>und</strong> Reihenfolge Objekte <strong>und</strong><br />
Methoden interagieren müssen, um eine geforderte Funktionalität zu liefern!<br />
ð� Ergänze die Beschreibung des Systems um<br />
„Verhaltensdiagramme“<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 228
5.3 Darstellung der Dynamik eines Systems<br />
Lernziele<br />
n� Sie sollen in diesem Kapitel verstehen,<br />
ð� Was man mit Sequenzdiagrammen ausdrücken kann<br />
ð� Wie man mit Sequenzdiagrammen Programmabläufe ausdrückt<br />
ð� Worauf man bei Sequenzdiagrammen achten muss<br />
ð� Welche Modellierungselemente die UML dafür bietet<br />
ð� Was man mit Kommunikationsdiagrammen ausdrücken kann<br />
ð� Wie Zustandsdiagramme funktionieren<br />
ð� Wozu Zustandsdiagramme eingesetzt werden<br />
Hinterher können Sie die Dynamik eines Systems in<br />
Diagrammen darstellen!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 229
5.3 Darstellung der Dynamik eines Systems<br />
Gr<strong>und</strong>idee<br />
n� Wie stellt man die Dynamik eines Systems dar?<br />
ð� „spiele“ mit Instanzen der (bereits gef<strong>und</strong>enen) Klassen<br />
die Methodenaufrufe durch, die erforderlich sind,<br />
um eine geforderte Funktionalität zu liefern<br />
n� Beschreibe<br />
ð� die Reihenfolge der Interaktionen <strong>beim</strong> Ablauf eines Anwendungsfalls<br />
ð� die (prinzipiellen) Aufrufe im Code<br />
ð� die Interaktion von Objekten<br />
ð� Zustände <strong>und</strong> Übergänge von Objekten<br />
ð� die Erzeugung <strong>und</strong> Zerstörung von Objekten<br />
Aus lauffähigem Code kann die Sequenz der Methodenaufrufe leicht extrahiert<br />
werden, indem man mit dem Debugger die Methodenaufrufe verfolgt!<br />
Wir machen es jetzt andersrum – <strong>und</strong> entwerfen so die Sequenz der Aufrufe!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 230
Hochschule Darmstadt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong><br />
<strong>Objektorientierte</strong> <strong>Analyse</strong> <strong>und</strong> <strong>Design</strong><br />
5.3.1 Darstellung der Dynamik eines Systems:<br />
Sequenzdiagramme<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong>
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Notation am Beispiel<br />
n� Betrachten Sie ein Kino-<br />
Reservierungssystem:<br />
ð� Es gibt Aktoren, Objekte <strong>und</strong><br />
verschiedene Aufrufe<br />
ð� Objekte werden in Bahnen<br />
nebeneinander dargestellt<br />
ð� Die Aktivität eines Objekts wird durch<br />
einen (optionalen) Balken symbolisiert<br />
ð� Nur ein aktiviertes Objekt kann Aufrufe<br />
machen!<br />
Aktor<br />
Objekt<br />
Steuerungsfokus<br />
(Aktivierungsbalken)<br />
Nachricht<br />
Aufruf<br />
Return<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 232
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Notationen für synchrone Aufrufe <strong>und</strong> asynchrone Nachrichten<br />
n� Synchron:<br />
ð� Der Sender wartet, bis der Empfänger die Nachricht empfangen <strong>und</strong> vollständig<br />
abgearbeitet hat. Erst dann arbeitet er weiter.<br />
n� Asynchron:<br />
ð� Sender setzt Nachricht ab <strong>und</strong> arbeitet sofort weiter, ohne auf den Empfänger zu<br />
warten. Der Empfänger arbeitet parallel zum Sender die Nachricht ab.<br />
synchroner Aufruf<br />
Rückgabewert<br />
asynchrone Nachricht<br />
Aufruf einer Operation<br />
Ablauf der Methode<br />
Return der Methode<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 233
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Durchgängiges Beispiel<br />
n� Aufgabe<br />
ð� Wir formulieren nun ein Sequenzdiagramm zu einem konkreten Anwendungsfall:<br />
n� Anwendungsfall „Student immatrikulieren“<br />
ð� Ein Sachbearbeiter der Hochschule erfasst am Bildschirm neue Studenten.<br />
Wurde ein Student bisher noch nicht erfasst, so wird ein neuer Eintrag angelegt<br />
<strong>und</strong> der Sachbearbeiter erhält eine Rückmeldung über den Erfolg der Erfassung.<br />
ð� Die Kommunikation des Systems „Hochschulverwaltung“ mit der Außenwelt<br />
(Sachbearbeiter) soll über Bildschirmmasken erfolgen.<br />
n� Es wurden folgende Klassen identifiziert<br />
ð� Maske, Studentenverwalter, Student, Popup<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 234
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Durchgängiges Beispiel – Lösung<br />
n� Szenario zu Use Case „Student immatrikulieren“:<br />
Objekt<br />
erzeugen<br />
:Klasse<br />
nur die Klasse ist festgelegt –<br />
es ist klar welches Objekt<br />
gemeint ist<br />
Objekt:Klasse<br />
ein bestimmtes<br />
Objekt einer Klasse<br />
Objekt<br />
zerstören<br />
Return ist<br />
optional<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 235
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Durchgängiges Beispiel – Erläuterung<br />
n� Über eine Erfassungsmaske zur Immatrikulation werden Studentendaten erfasst.<br />
Ein Objekt Student wird kreiert, wenn es noch nicht vorhanden ist.<br />
n� Um dies herauszufinden, wird die Klasse StudentenVerwalter befragt, die alle<br />
Studenten kennt <strong>und</strong> verwaltet.<br />
n� Ist die Immatrikulation (das Kreieren des Studenten) erfolgreich, so teilt dies der<br />
neu angelegte Eintrag dem Sachbearbeiter selbst mit, indem er ein Popup mit<br />
der entsprechenden Nachricht öffnet, die bestätigt werden muss.<br />
In UML 1.x wurden zur Verwaltung<br />
der Gesamtheit aller<br />
Klasseninstanzen so genannte<br />
„Multi Object Icons“ eingesetzt.<br />
Diese gibt es in UML 2.x nicht mehr!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 236
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Anmerkungen<br />
n� UML-CASE-Tools<br />
ð� bieten Ihnen <strong>beim</strong> Erstellen eines Sequenzdiagramms<br />
die in den Klassen vorhandenen Operationen zur Auswahl an.<br />
Neue Operationen können aus neu definierten<br />
Aufrufen erzeugt werden bzw.<br />
ð� erlauben oft nur Operationen, die bereits in Klassen definiert sind<br />
n� ein Sequenzdiagramm konkretisiert häufig einen<br />
Anwendungsfall<br />
n� ein Sequenzdiagramm kann aber auch Sachverhalte illustrieren, die den<br />
Anwender nicht interessieren (z. B. zur Veranschaulichung der Initialisierung)<br />
n� Konventionen<br />
ð� Sequenzdiagramme haben die Leserichtung links→rechts, oben→unten<br />
ð� Überkreuzungen von Aufrufen (in der Darstellung) sind möglichst zu vermeiden<br />
ð� Aktoren (d. h. Personen oder andere Systeme, die nicht im modellierten System<br />
enthalten sind) stehen üblicherweise links außen<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 237
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Zweites Beispiel<br />
n� Anwendungsfall „Student exmatrikulieren“<br />
ð� Ein Sachbearbeiter der Hochschule erfasst an einer Bildschirmmaske Studenten,<br />
die exmatrikuliert werden. Die Löschung der Studentenakte darf nur erfolgen,<br />
wenn darin keine entliehenen Gegenstände mehr eingetragen sind. Der<br />
Sachbearbeiter erhält eine Rückmeldung über den Erfolg der Exmatrikulation.<br />
n� Es wurden bereits folgende Klassen identifiziert:<br />
- Maske<br />
- Studentenverwalter<br />
- Student<br />
- Popup<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 238
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Zweites Beispiel – Lösung<br />
n� Szenario zu Use Case „Student exmatrikulieren“:<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 239
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Tipps zur Erstellung von Sequenzdiagrammen<br />
n� Überlegen Sie zuerst, was (nicht) dargestellt werden soll<br />
ð� welche Aufruftiefe soll dargestellt werden?<br />
ð� welche konkreten Abläufe („Szenarien“) sollen dargestellt werden?<br />
(nur wenige Pfade bei Verzweigungen; nicht alle Alternativen gleichzeitig)<br />
n� Achten Sie auf eine geordnete Aufrufreihenfolge<br />
ð� die Aktivierung eines Objekts startet mit einem synchronen Aufruf <strong>und</strong> endet mit<br />
einem „Return“ (auf eine klammerartige Schachtelung achten!)<br />
ð� Methodenaufrufe können nur von „aktiven“ Objekten erfolgen. Wird eine<br />
Methode aufgerufen, geht die Aktivität an dieses Objekt über <strong>und</strong> kommt erst<br />
mit dessen „Return“ zurück<br />
ð� die Kommunikation mit Aktoren <strong>und</strong> anderen eigenständigen Systemen erfolgt<br />
asynchron<br />
ð� stellen Sie – zur Verbesserung der Lesbarkeit – auch optionale Konstrukte dar<br />
(Returns von Konstruktoren/Destruktoren bzw. Aktivierungsbalken)<br />
- Dann kann man die synchronen Aufrufe <strong>und</strong> Returns eines korrekten Diagramms von<br />
oben links nach unten links „durchfahren“.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 240
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Schwierigeres Beispiel<br />
n� Anwendungsfall „Essen zahlen“ (in der Mensa)<br />
ð� Ein Mensak<strong>und</strong>e kommt mit seinem Essen zur Kasse. Die Kassenfrau gibt die<br />
Artikelnummern ein <strong>und</strong> die Kasse zeigt den Betrag an. Der K<strong>und</strong>e schiebt seine<br />
Mensakarte in das Lesegerät <strong>und</strong> der Betrag wird abgebucht. Reicht das<br />
Guthaben nicht aus, wird eine Fehlermeldung angezeigt. Der K<strong>und</strong>e entnimmt in<br />
beiden Fällen seine Karte.<br />
n� Es wurden bereits folgende Klassen identifiziert:<br />
- Kasse<br />
- Display<br />
- LeseSchreibEinheit<br />
- MensaKarte<br />
ð� Welche Aktoren gibt es?<br />
ð� Wie laufen die Aufrufe?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 241
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Schwierigeres Beispiel – Diskussion einer Lösung<br />
Verzweigung<br />
(UML 1.4)<br />
triviale<br />
Returns<br />
fehlen<br />
(optional)<br />
n� Anmerkungen:<br />
ð� In dieser Lösung<br />
kontrolliert die Schreib-<br />
Lese-Einheit den<br />
Gesamtvorgang.<br />
Die Kasse wäre<br />
realistischer.<br />
ð� Der Input ist sichtbar,<br />
der Output nicht.<br />
ð� Gehört die Karte zu<br />
unserem System?<br />
Hat sie wirklich eine<br />
Methode „lies“?<br />
ð� Was würde passieren,<br />
wenn die Bezahlung<br />
durch einen Daumen‐<br />
abdruck <strong>und</strong> direkte<br />
Abbuchung von einem<br />
Bank-Konto ersetzt<br />
würde?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 242
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Häufige Fehler<br />
1. Fehler: Methodenaufruf <strong>beim</strong> Aktor<br />
ð� Ein Aktor ist in der Regel menschlich. Er hat deshalb<br />
keine Methoden, die man aufrufen könnte.<br />
2. Fehler: Kontrollverlust durch synchronen Aufruf<br />
ð� Ein Aktor führt ein eigenständiges Leben. Er hat<br />
seine eigene „CPU“. Wegen des synchronen Aufrufs<br />
darf das aufrufende System aber erst weitermachen,<br />
wenn der Aktor ein Return zurückschickt – <strong>und</strong> das<br />
tut er vielleicht nie. Ein „Timeout-Verhalten“ kann so<br />
nicht mehr implementiert werden.<br />
ð� Richtig wäre, eine asynchrone Nachricht (als<br />
Ausgabe) an den Aktor zu schicken, <strong>und</strong> zu hoffen,<br />
dass er wie gewünscht reagiert. Falls nicht, kann<br />
nach einem Timeout entsprechend reagiert werden.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 243
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Häufige Ungeschicklichkeiten<br />
n� Verletzung der Kapselung<br />
ð� Der Kartenleser sagt der Kasse was sie tun soll<br />
(CheckePin). Der Kartenleser kann (bzw. soll) aber<br />
gar nicht wissen, ob eine Pin geprüft werden muss.<br />
Ob die Prüfung über eine PIN erfolgt (oder über einen<br />
Daumenabdruck) gehört zur Verantwortung der Kasse.<br />
ð� Besser wäre, nur das zu sagen, was in der eigenen<br />
Verantwortung liegt. Dann kann die Kasse so<br />
reagieren wie sie es für richtig hält.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 244
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Schwierigeres Beispiel – 2. Versuch<br />
n� Anwendungsfall „Essen zahlen“ (in der Mensa)<br />
ð� Ein Mensak<strong>und</strong>e kommt mit seinem Essen zur Kasse. Die Kassenfrau gibt die<br />
Artikelnummern ein <strong>und</strong> die Kasse zeigt den Betrag an. Der K<strong>und</strong>e schiebt seine<br />
Mensakarte in das Lesegerät <strong>und</strong> der Betrag wird abgebucht. Reicht das<br />
Guthaben nicht aus, wird eine Fehlermeldung angezeigt. Der K<strong>und</strong>e entnimmt in<br />
beiden Fällen seine Karte.<br />
n� Es wurden bereits folgende Klassen identifiziert:<br />
- Kasse<br />
- Display<br />
- SchreibLeseEinheit<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 245
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Schwierigeres Beispiel – Alternative Lösung<br />
n� Anmerkungen:<br />
ð� In dieser Lösung kontrolliert<br />
die Kasse den Gesamtvor‐<br />
gang. Die RW_Unit küm‐<br />
mert sich bloß um die Karte.<br />
ð� Der Output erfolgt über die<br />
Klasse Display.<br />
ð� Die Karte wird nicht mehr<br />
modelliert, sondern<br />
übergeben.<br />
ð� Was würde jetzt passieren,<br />
wenn die Bezahlung durch<br />
einen Daumenabdruck <strong>und</strong><br />
direkte Abbuchung von<br />
einem Bank-Konto ersetzt<br />
würde?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 246
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Übung: Mikrowellenherd<br />
n� Modellieren Sie einen Mikrowellenherd.<br />
Die Funktionsweise wird stichwortartig zusammengefasst:<br />
ð� die Bedienelemente für den Benutzer sind der Einschaltknopf <strong>und</strong> die Tür<br />
ð� durch Drücken des Knopfes wird die Mikrowelle (die „Backröhre“) eingeschaltet<br />
ð� die Kochzeit wird über eine interne Zeituhr auf eine Minute festgelegt<br />
ð� durch weiteres n-maliges Drücken des Knopfes wird die Kochzeit um n Minuten<br />
verlängert<br />
ð� wenn die Zeit abgelaufen ist, wird die Backröhre ausgeschaltet, ein Piepton<br />
ertönt <strong>und</strong> als nächstes muss die Tür geöffnet werden bevor die Mikrowelle<br />
erneut gestartet werden kann<br />
ð� durch Öffnen der Tür wird die Backröhre abgeschaltet <strong>und</strong> die verbleibende<br />
Kochzeit gelöscht<br />
ð� der Mikrowellenherd startet nur bei geschlossener Tür<br />
ð� wenn die Tür offen ist oder wenn der Herd an ist, leuchtet das Licht<br />
ð� wenn der Mikrowellenherd ein- bzw. ausschaltet, muss die Backröhre ebenfalls<br />
ein- bzw. ausgeschaltet werden<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 247
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Übung: Mikrowellenherd<br />
n� Erstellen Sie<br />
ð� ein Klassendiagramm<br />
- mit Klassen, Attribute, Methoden, Beziehungen<br />
ð� Sequenzdiagramme für die Szenarien<br />
- 2 Minuten kochen<br />
- Tür öffnen <strong>und</strong> schließen<br />
- Kochvorgang mit Abbruch durch Tür öffnen<br />
n� Versuchen Sie die Diagramme selbst zu entwerfen, bevor Sie sich die folgenden<br />
Lösungen anschauen!<br />
ð� Entwickeln Sie zuerst ein Klassendiagramm <strong>und</strong> vergleichen Sie Ihr Ergebnis mit<br />
der Lösung.<br />
ð� Entwickeln Sie die Sequenzdiagramme mit den Klassen <strong>und</strong> Methoden aus dem<br />
Lösungs-Klassendiagramm.<br />
ð� Beachten Sie dabei, dass es nicht nur eine einzige richtige Lösung gibt.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 248
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Lösung Mikrowellenherd: Klassendiagramm<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 249
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Lösung Mikrowellenherd: Sequenzdiagramm „2 Minuten kochen“<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 250
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Lösung Mikrowellenherd: Sequenzdiagramm „Tür öffnen <strong>und</strong> schließen“<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 251
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Lösung Mikrowellenherd: Sequenzdiagramm „Kochen mit Abbruch“<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 252
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Notation in UML 2.x (I)<br />
The image cannot be displayed. Your computer<br />
may not have enough memory to open the<br />
image, or the image may have been corrupted.<br />
Restart your computer, and then open the file<br />
again. If the red x still appears, you may have to<br />
delete the image and then insert it again.<br />
The image cannot be<br />
displayed. Your computer<br />
may not have enough<br />
memory to open the image,<br />
or the image may have been<br />
corrupted. Restart your<br />
computer, and then open the<br />
file again. If the red x still<br />
appears, you may have to<br />
delete the image and then<br />
insert it again.<br />
Klasse, Objekt<br />
In dem Rechteck oberhalb der gestrichelten Linie wird der Objektname<br />
<strong>und</strong> der Klassenname angegeben. Der Name wird unterstrichen.<br />
Die senkrechte, gestrichelte Linie stellt die Lebenslinie<br />
(lifeline) eines Objekts dar. Im diesem zeitlichen Bereich existiert<br />
das Objekt. Das schmale Rechteck auf der gestrichelten Linie<br />
stellt eine Aktivierung dar. Eine Aktivierung ist der Bereich, in<br />
dem eine Methode des Objektes aktiv ist (ausgeführt wird). Auf<br />
einer Lebenslinie können mehrere Aktivierungen enthalten sein.<br />
Nachricht, Botschaft<br />
Objekte kommunizieren über Nachrichten. Nachrichten werden<br />
als Pfeile zwischen den Aktivierungen eingezeichnet. Der Name<br />
der Nachricht steht an dem Pfeil. Eine Nachricht liegt immer<br />
zwischen einem sendenden <strong>und</strong> einem empfangenden Objekt.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 253
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Notation in UML 2.x (II)<br />
The image cannot be displayed.<br />
Your computer may not have<br />
enough memory to open the image,<br />
or the image may have been<br />
corrupted. Restart your computer,<br />
and then open the file again. If the<br />
red x still appears, you may have to<br />
delete the image and then insert it<br />
again.<br />
The image cannot be displayed. Your computer<br />
may not have enough memory to open the<br />
image, or the image may have been corrupted.<br />
Restart your computer, and then open the file<br />
again. If the red x still appears, you may have to<br />
delete the image and then insert it again.<br />
Synchrone Nachricht (Aufruf)<br />
Der Pfeil mit der ausgefüllten Spitze bezeichnet einen synchronen<br />
Aufruf. Der Aufruf erfolgt von der Quelle zum Ziel, d. h. die Zielklasse<br />
muss eine entsprechende Methode implementieren. Die Quelle wartet<br />
mit der weiteren Verarbeitung bis die Zielklasse ihre Verarbeitung beendet<br />
hat <strong>und</strong> setzt die Verarbeitung dann fort. Ein Aufruf muss einen<br />
Namen haben; in r<strong>und</strong>en Klammern können Aufrufparameter angegeben<br />
werden. Der gestrichelte Pfeil ist der Return. Die Bezeichnung des Return<br />
mit einem Namen ist optional.<br />
Asynchrone Nachricht<br />
Mit einer offenen Pfeilspitze werden asynchrone Nachrichten gekennzeichnet.<br />
Der Aufruf erfolgt von der Quelle zum Ziel. Die Quelle wartet<br />
mit der Verarbeitung nicht auf die Zielklasse, sondern setzt ihre Arbeit<br />
nach dem Senden der Nachricht fort. Asynchrone Aufrufe werden verwendet,<br />
um parallele Threads zu modellieren.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 254
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Notation in UML 2.x (III)<br />
The image cannot be<br />
displayed. Your computer may<br />
not have enough memory to<br />
open the image, or the image<br />
may have been corrupted.<br />
Restart your computer, and<br />
then open the file again. If the<br />
red x still appears, you may<br />
have to delete the image and<br />
then insert it again.<br />
Objekt erzeugen, zerstören<br />
Das Erzeugen eines Objektes wird durch eine Nachricht, die im<br />
Kopf des Objekts endet, dargestellt.<br />
Das Zerstören (Löschen) eines Objektes wird durch ein x auf der<br />
Lebenslinie markiert.<br />
Aufruf einer Operation im gleichen Objekt (Rekursion)<br />
Sendet ein Objekt eine Nachricht an sich selbst, so nennt man<br />
dies Rekursion. Das Objekt ruft eine Operation auf, die es selbst<br />
anbietet.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 255
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Erweiterte Notation in UML 2.x (I)<br />
Links oben stehen der<br />
Diagrammtyp (sd) <strong>und</strong> der<br />
Diagrammname (NameSQ).<br />
Der mit ref bezeichnete Block<br />
stellt einen Verweis auf ein<br />
Diagramm mit dem Namen „SQ-<br />
Diagramm 2“ dar, das eine<br />
Verfeinerung des Blockes<br />
enthält. Der mit alt markierte<br />
Block beschreibt eine<br />
Alternative (Verzweigung). Ist<br />
die Bedingung [b=wahr] erfüllt,<br />
wird der Bereich oberhalb der<br />
gestrichelten Linie ausgeführt,<br />
sonst der Bereich unterhalb der<br />
gestrichelten Linie.<br />
kombinierte Fragmente (combined fragment)<br />
Mit kombinierten Fragmenten können in Sequenzdiagrammen die Kontrollstrukturen höherer<br />
Programmiersprachen ausgedrückt werden. Ab der UML 2.0 können damit Sequenzdiagramme<br />
verschachtelt werden. Ein kombiniertes Fragment wird als rechteckiger Block dargestellt. In der<br />
linken, oberen Ecke trägt es eine Bezeichnung, die den Typ der Kontrollstruktur angibt (interaction<br />
operator). Die wichtigsten Interaktionsoperatoren in der UML 2.x sind ref (Verweis), alt<br />
(Alternative) <strong>und</strong> loop (Schleife).<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 256
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Erweiterte Notation in UML 2.x (II)<br />
ref<br />
Sequenzdiagramme können ande‐<br />
re Sequenzdiagramme beinhalten<br />
(als eine Art Unter-Programm).<br />
Dabei können <strong>beim</strong> „Aufruf“ <strong>und</strong> in<br />
der „Definition“ des Unterpro‐<br />
gramms Parameter übergeben<br />
bzw. spezifiziert werden.<br />
loop<br />
Eine Schleife in einem Sequenz‐<br />
diagramm bewirkt, dass die enthal‐<br />
tene Sequenz von Botschaften<br />
solange ausgeführt wird, bis die<br />
Abbruchbedingung erfüllt ist.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 257
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Erweiterte Notation in UML 1.4<br />
n� In UML 1.4 gibt es diese erweiterte Notation nicht.<br />
n� Schleifen, Verzweigungen <strong>und</strong> das Beinhalten von anderen<br />
Sequenzdiagrammen können mit Hilfe von Zeitabschnitten <strong>und</strong> manuell<br />
eingeführten Kommentaren dargestellt werden:<br />
statt in 2.x: in 1.x:<br />
xxx[…]<br />
XXX[...]<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 258
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Anwendung<br />
n� Sequenzdiagramme sind z. B. in folgenden Situationen nützlich:<br />
ð� vor Implementierungsbeginn<br />
- zur Verifikation des <strong>Design</strong>s: besonders interessante (oder schwierige)<br />
Systemzustände anschaulich darstellen <strong>und</strong> „testen“ (z. B. Anwendungsfälle)<br />
- um zu verifizieren ob die Klassenaufteilung (<strong>Design</strong>) gut gewählt ist <strong>und</strong> alle<br />
benötigten Assoziationen vorhanden sind<br />
ð� im Team<br />
- verbesserte Kommunikation der wesentlichen Abläufe<br />
ð� <strong>beim</strong> Test<br />
- kritische Abläufe im System können für Tests spezifiziert (<strong>und</strong> evtl. generiert) werden<br />
Das Sequenzdiagramm ist eines der wichtigsten<br />
Interaktionsdiagramme in der UML!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 259
5.3.1 Darstellung der Dynamik eines Systems: Sequenzdiagramme<br />
Tipps<br />
n� Sequenzdiagramme sind sehr leicht zu lesen…<br />
… aber gar nicht so leicht zu erstellen!<br />
ð� Welche Objekte sind (nicht) erforderlich?<br />
- Auf das Beschränken was wichtig ist bzw. dargestellt werden soll<br />
- aber auch nicht zu wenige Objekte<br />
ð� Wer ruft wen auf?<br />
- Überlegen, wer den Trigger erhält, der die Aktion startet<br />
ð� Welche bzw. wie viele Alternativen sollen dargestellt werden?<br />
- Nur die wichtigsten für das Szenario. Lieber mehrere Diagramme!<br />
- Oder kombinierte Fragmente verwenden – aber bitte nicht programmieren!<br />
- Nicht versuchen, alles auf einmal darzustellen!<br />
Sequenzdiagramme zeigen immer nur je ein Szenario!<br />
ð� Wie wird die Interaktion mit der Außenwelt (Aktoren) modelliert?<br />
- Tipp: Asynchrone Aufrufe <strong>und</strong> I/O-Objekte verwenden<br />
immer iterativ vorgehen!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 260
Hochschule Darmstadt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong><br />
<strong>Objektorientierte</strong> <strong>Analyse</strong> <strong>und</strong> <strong>Design</strong><br />
5.3.2 Darstellung der Dynamik eines Systems:<br />
Kommunikationsdiagramme<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong>
5.3.2 Darstellung der Dynamik eines Systems: Kommunikationsdiagramme<br />
Inhalt<br />
n� Ein Kommunikationsdiagramm beschreibt<br />
ð� die Interaktion zwischen Objekten im Überblick<br />
ð� die zeitliche Reihenfolge, in der die Nachrichten gesendet werden<br />
ð� die Beziehungen zwischen den Objekten <strong>und</strong> die Nachrichten,<br />
die übertragen werden<br />
in UML 1.x:<br />
„Kollaborationsdiagramme“<br />
ð� Dabei steht der Überblick der Kommunikationsstruktur im Vordergr<strong>und</strong><br />
n� Das kommt Ihnen bekannt vor?<br />
ð� Kommunikationsdiagramme werden für die selben Zwecke eingesetzt wie<br />
Sequenzdiagramme!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 262
5.3.2 Darstellung der Dynamik eines Systems: Kommunikationsdiagramme<br />
entspricht der ersten Lösung<br />
Notation am Beispiel: „Essen zahlen“<br />
Der „Mensa-Aufgabe“<br />
als Sequenzdiagramm!<br />
mehrstellige<br />
Nummerierung<br />
gliedert <strong>und</strong> erlaubt<br />
leichtere Änderung<br />
Alternativen<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 263
5.3.2 Darstellung der Dynamik eines Systems: Kommunikationsdiagramme<br />
Kommunikationsdiagramm vs. Sequenzdiagramm<br />
Kommunikationsdiagramm Sequenzdiagramm<br />
Objekte in der Fläche verteilt Objekte in einer Linie<br />
Sequenz der Nachrichten durch<br />
Nummerierung<br />
Stärke: viele Objekte, die wenige<br />
Nachrichten austauschen<br />
Parallelität <strong>und</strong> Alternativen durch<br />
Nummerierung mit Buchstaben<br />
Sequenz der Nachrichten graphisch<br />
auf Zeitachse<br />
Stärke: wenige Objekte, die viele<br />
Nachrichten austauschen<br />
Parallelität durch Asynchronität<br />
(wird mit offenen Pfeilen angedeutet)<br />
Keine Verschachtelung verschachtelte Diagramme möglich<br />
Kommunikationsdiagramme bieten<br />
nur eine Untermenge der Sequenzdiagramme!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 264
5.3.2 Darstellung der Dynamik eines Systems: Kommunikationsdiagramme<br />
Anwendung<br />
n� Kommunikationsdiagramme sind z. B. in folgenden Situationen nützlich:<br />
ð� wenn das Zusammenspiel zwischen vielen interagierenden Teilen möglichst<br />
einfach dargestellt werden soll<br />
ð� wenn es um das gr<strong>und</strong>sätzliche Verständnis des Ablaufs <strong>und</strong> der<br />
Verantwortungen geht – weniger um Details im Timing<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 265
5.3.2 Darstellung der Dynamik eines Systems: Kommunikationsdiagramme<br />
Notation in UML 2.x<br />
The image cannot be displayed. Your<br />
computer may not have enough memory to<br />
open the image, or the image may have been<br />
corrupted. Restart your computer, and then<br />
open the file again. If the red x still appears,<br />
you may have to delete the image and then<br />
insert it again.<br />
The image cannot be displayed. Your computer may not have<br />
enough memory to open the image, or the image may have been<br />
corrupted. Restart your computer, and then open the file again. If<br />
the red x still appears, you may have to delete the image and then<br />
insert it again.<br />
Objekt<br />
Das Rechteck stellt ein Objekt dar. Es kann einen Objekt‐<br />
namen <strong>und</strong> einen Klassennamen tragen.<br />
Beziehung, Nachricht<br />
Die Kommunikationsbeziehungen zwischen Objekten wer‐<br />
den als Linie dargestellt. An die Beziehungen werden die<br />
Nachrichten, die darüber übertragen werden geschrieben.<br />
Die Nummerierung vor den Nachrichtennamen gibt die zeit‐<br />
liche Reihenfolge der Nachrichten an. (2.1, 2.2, ...).<br />
Alternativen (Nebenläufigkeit) werden durch Angabe von<br />
Buchstaben dargestellt (2.3.a, 2.3.b, ...). Der Pfeil gibt die<br />
Richtung der Nachrichten an.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 266
Hochschule Darmstadt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong><br />
<strong>Objektorientierte</strong> <strong>Analyse</strong> <strong>und</strong> <strong>Design</strong><br />
5.3.3 Darstellung der Dynamik eines Systems:<br />
Zustandsdiagramme<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong>
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Beobachtung<br />
n� Betrachten Sie die Zustände, in der sich Ihre Digitalkamera befinden kann:<br />
ð� Das Verhalten der Kamera ist sehr stark davon abhängig, in welchem Zustand<br />
sie sich gerade befindet: Kamera reagiert <strong>beim</strong> Drücken eines Knopfes abhängig<br />
vom Zustand in dem sie sich gerade befindet (z. B. wird durch Drücken des<br />
rechten Knopfes im Zustand Display das nächste Bild angezeigt, im Zustand<br />
Fotografieren der Zustand des Blitzlichtes verändert).<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 268
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Beobachtung<br />
n� Betrachten Sie die Zustände, in denen sich ein<br />
typischer Laserdrucker befinden kann:<br />
Betriebsbereit Papierstau<br />
Kein Papier<br />
eingelegt<br />
Selbsttest<br />
Druckend<br />
Keine Tonerkassette<br />
eingelegt<br />
ð� Das Verhalten eines Druckers ist sehr stark davon abhängig, in welchem<br />
Zustand er sich gerade befindet.<br />
Toner<br />
fast leer<br />
ð� Der Drucker geht unter bestimmten Bedingungen von einem Zustand in den<br />
anderen über.<br />
Es handelt sich offensichtlich um die Dynamik eines Systems,<br />
aber wie beschreiben <strong>und</strong> implementieren wir das?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 269
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Gr<strong>und</strong>idee Zustandsautomat (State Machine)<br />
n� Wie stellt man die Zustände <strong>und</strong> Übergänge eines Systems dar?<br />
ð� Modelliere das System als eventgetriebenes System mit<br />
Zuständen, Übergängen <strong>und</strong> Ereignissen<br />
ð� „Zustandsdiagramm“ (State (Machine) Diagram)<br />
Schranke offen<br />
Öffnen<br />
Schließen<br />
Schranke geschlossen<br />
Es ist immer nur ein Zustand in einem Zustandsautomaten aktiv!<br />
Anfangszustand<br />
Zustand<br />
Ereignis<br />
Zustandsübergang<br />
Endzustand<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 270
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Interpretation des Beispiels<br />
n� Zustandsdiagramm zu einer Schranke<br />
ð� Eine Schranke wird eingebaut <strong>und</strong> erreicht nach ihrer Fertigstellung<br />
ihren Anfangszustand (hier: Schranke offen). Sie ist betriebsbereit.<br />
Während ihrer Existenz kann sie die Zustände „Schranke offen“ <strong>und</strong><br />
„Schranke geschlossen“ einnehmen.<br />
ð� Durch die Ereignisse „Schließen“ <strong>und</strong> „Öffnen“, die von anderen Objekten<br />
(z. B. einem Benutzer, Kontaktschleife) verursacht werden, ändert sie ihren<br />
Zustand. Die Schranke reagiert aber in jedem Zustand nur auf bestimmte<br />
Ereignisse. Ist die Schranke im Zustand geschlossen, so reagiert sie nur auf das<br />
Ereignis „Öffnen“. Ist die Schranke im Zustand offen, so reagiert sie nur auf das<br />
Ereignis „Schließen“.<br />
ð� Alle Nachrichten, die in einem Zustand eines Objektes nicht sinnvoll sind (es<br />
existiert kein vom Zustand herausführender Pfeil mit diesem Ereignis), werden<br />
ignoriert <strong>und</strong> verursachen keine Reaktion des Objekts.<br />
Beispiel: Öffnen im Zustand „Schranke offen“<br />
ð� Das Erreichen des finalen Zustandes bedeutet die Zerstörung des Objekts.<br />
ð� Das Modell könnte bei Bedarf um weitere Zustände ergänzt werden:<br />
z. B. „Schranke öffnend“, „Schranke schließend“<br />
Öffnen<br />
Schranke offen<br />
Schließen<br />
Schranke geschlossen<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 271
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Was ist ein Zustand?<br />
n� Der Zustand eines Objekts ist eine Zeitspanne, in der<br />
ð� das Objekt eine bestimmte Aktivität ausführt <strong>und</strong><br />
ð� das Objekt auf ein oder mehrere bestimmte Ereignisse wartet oder<br />
ð� das Objekt wartet, bis eine bestimmte Bedingung erfüllt ist<br />
Schranke<br />
offen<br />
n� Ein Objekt kann sich im Laufe der Zeit in verschiedenen, klar voneinander<br />
abgegrenzten Zuständen befinden<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 272
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Was ist kein Zustand?<br />
n� Verwechseln Sie die Zustände, die ein Objekt oder das System<br />
einnehmen kann, nicht<br />
ð� mit den Objekten oder Komponenten des Systems selbst<br />
ð� oder mit Aktivitäten<br />
n� Beispiel: Betrachten Sie die Steuerung einer Parkhausschranke.<br />
ð� Falsch:<br />
ð� Richtig:<br />
Schranke<br />
Schranke<br />
offen<br />
oder<br />
Schranke öffnen<br />
Schranke<br />
geschlossen<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 273
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Zustandsübergänge benötigen keine Zeit!<br />
Was ist ein Zustandsübergang?<br />
Die Aktionen müssen entsprechend schnell<br />
ablaufen!<br />
n� Beispiel:<br />
ð� Betrachten Sie einen typischen Laserdrucker.<br />
Der Toner ist leer <strong>und</strong> Sie legen eine neue Tonerkassette ein.<br />
- Erkennen Sie einen Übergang von einem Zustand zu einem anderen?<br />
- Welche Elemente sind an dem Übergang beteiligt?<br />
ð� Beschreibung: „Wenn der Drucker keinen Toner mehr hat <strong>und</strong> eine<br />
Tonerkassette eingelegt wird <strong>und</strong> der Deckel geschlossen wird, dann wird ein<br />
Reset durchgeführt <strong>und</strong> anschließend ist der Drucker im Zustand ‚Selbsttest‘.“<br />
n� Ein Zustandsübergang („Transition“) liegt vor, wenn ein Objekt<br />
ð� in einem bestimmten Zustand ist <strong>und</strong><br />
ð� ein bestimmtes Ereignis eintrifft <strong>und</strong><br />
ð� bestimmte Bedingungen erfüllt sind <strong>und</strong><br />
ð� dann eine bestimmte (kurze) Aktion ausgeführt wird <strong>und</strong><br />
ð� das Objekt sich anschließend in einem anderen Zustand befindet.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 274
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Notation von Zustandsübergängen<br />
n� Zustandsübergänge werden durch Pfeile zwischen dem aktuellen Zustand <strong>und</strong><br />
einem Folgezustand dargestellt.<br />
n� An einem solchen Pfeil werden die Details des Zustandsübergangs notiert:<br />
Liste von Auslösern<br />
(„Trigger“)<br />
(durch Kommata<br />
getrennt)<br />
Tür zu<br />
EC-Karte ins<br />
Lesegerät<br />
gesteckt<br />
Eine optionale<br />
Bedingung („Guard“)<br />
(in eckigen Klammern)<br />
[EC-Karte ist gültig]<br />
/ Kartennummer<br />
mit Zeitstempel<br />
ins Logfile schreiben;<br />
Tür öffnen<br />
Für einen Trigger sollte immer nur<br />
ein Zustandsübergang möglich sein!<br />
Aktionen („Action“) die<br />
<strong>beim</strong> Zustandswechsel<br />
stattfindet<br />
(durch/abgetrennt)<br />
Tür offen<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 275
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Verhalten in Zuständen<br />
Vorgänge, die Zeit kosten, müssen innerhalb<br />
der Zustände umgesetzt werden!<br />
n� Beispiel:<br />
ð� Betrachten Sie einen Beamer, den Sie anschalten.<br />
- Erkennen Sie Aktivitäten, die dann ausgeführt werden? Wann werden Sie ausgeführt?<br />
ð� Im Zustand „Systemstart“ wird zuerst eine rote LED angeschaltet, dann wird die<br />
Birne vorgewärmt bis die Betriebstemperatur erreicht ist. Ist dies der Fall, wird<br />
der Beamer aktiviert <strong>und</strong> statt der roten eine grüne LED angeschaltet. Während<br />
der Aufwärmphase wird alle 5 Sek<strong>und</strong>en geprüft, ob die Temperatur erreicht ist.<br />
n� Verhalten in einem Zustand tritt auf, als<br />
ð� Eintrittsverhalten (entry behavior)<br />
- Verhalten eines Objekts, wenn es einen bestimmten Zustand einnimmt<br />
ð� Zustandsverhalten (state behavior oft auch do behavior)<br />
- Verhalten eines Objekts, solange es sich in dem Zustand befindet<br />
ð� Austrittsverhalten (exit behavior)<br />
- Verhalten eines Objekts, wenn es den Zustand verlässt<br />
ð� Interne Transition (internal transition)<br />
- bedingtes Verhalten bei Ereignissen, die den Zustand nicht verlassen<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 276
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Notation des Verhaltens<br />
n� Darstellung in einem eigenen Bereich unterhalb des Zustandsnamens<br />
ð� Das Verhalten wird mit Schrägstrich von den Labels entry, do <strong>und</strong> exit abgetrennt<br />
ð� Interne Übergänge werden analog zu Transitionen beschrieben<br />
ð� Mehrere Aktionen werden durch, getrennt<br />
Eintrittsverhalten<br />
Aktionen, die <strong>beim</strong> Eintritt in den<br />
Zustand ausgeführt werden<br />
Zustandsverhalten<br />
Aktivitäten, die ausgeführt werden, solange<br />
man sich in dem Zustand befindet (es findet<br />
jedoch keine automatische Wiederholung statt)<br />
Austrittsverhalten<br />
Aktionen, die <strong>beim</strong> Verlassen des<br />
Zustands ausgeführt werden<br />
Interne Transition<br />
Aktionen, die ausgeführt werden, wenn der Trigger (hier<br />
Time-Trigger) auftritt <strong>und</strong> der (optionale) Guard erfüllt ist<br />
Systemstart<br />
entry / roteLEDan()<br />
do / Birne aufheizen()<br />
exit / roteLEDaus()<br />
alle 5 Sek. [true] / checkTemp()<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 277
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Aktionen <strong>und</strong> Aktivitäten<br />
n� Aktionen („actions“)<br />
ð� sind ein nicht unterbrechbares Verhalten, das an bestimmten Stellen in einem<br />
Zustandsautomat ausgeführt wird<br />
ð� von Aktionen wird angenommen, dass Sie keine Zeit verbrauchen<br />
ð� eine Aktion kann wiederum aus einer Sequenz von Aktionen bestehen, die dann<br />
wieder nicht unterbrechbar ist<br />
ð� in Zustandsübergängen können Aktionen ausgeführt werden<br />
ð� eine Aktion kann daraus bestehen eine Nachricht an andere Objekte (oder sich<br />
selbst) verschicken<br />
n� Aktivitäten („activities“)<br />
ð� sind Verhalten, die endliche Zeit benötigen<br />
ð� Aktivitäten werden nur innerhalb des Zustandsverhaltens ausgeführt<br />
(do behavior)<br />
ð� Aktivitäten bestehen normalerweise aus mehreren Aktionen<br />
ð� Aktivitäten werden unterbrochen, wenn ein Ereignis einen Zustandswechsel auslöst<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 278
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Reihenfolge der Aktionsausführung nach Eingang eines Triggers<br />
n� Bei einem Zustandsübergang werden<br />
die Aktivitäten in folgender Reihenfolge ausgeführt<br />
ð� Do-Aktivität wird unterbrochen<br />
ð� Austrittsverhalten des alten Zustands<br />
ð� Aktionen, die zur Transition gehören<br />
ð� Eintrittsverhalten des neuen Zustands<br />
ð� Zustandsverhalten des neuen Zustands<br />
n� Auch bei rekursiven Transitionen (Loops)<br />
werden alle diese Aktionen ausgeführt<br />
n� Bei internen Transitionen<br />
ð� werden nur die Aktivitäten ausgeführt, aber<br />
kein Exit <strong>und</strong> kein Entry behavior<br />
ð� wird eine laufende do-Aktivität unterbrochen, die<br />
Aktionen der internen Transition ausgeführt <strong>und</strong><br />
anschließend wird die do-Aktivität fortgeführt<br />
LOOP<br />
entry/ z=read()<br />
INT<br />
entry/ z=read()<br />
alle 5 Sek. / doIt()<br />
Exit behavior<br />
(actions) des<br />
vorhergehenden<br />
Zustands<br />
Transition<br />
actions<br />
Entry<br />
behavior<br />
(actions)<br />
State behavior<br />
(activity)<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 280
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Transitionen im Detail<br />
n� Transition ohne Trigger (Automatische Transition/Completion Transition)<br />
ð� 1. Fall: ohne Guard<br />
ð� feuert von selbst, sobald das Zustandsverhalten (do behavior) abgearbeitet ist<br />
A<br />
do / grinsen<br />
ð� 2. Fall: mit Guard<br />
ð� feuert von selbst, sobald das Zustandsverhalten (do behavior) abgearbeitet ist,<br />
aber nur wenn der Guard erfüllt ist<br />
ð� ist der Guard nicht erfüllt, kann der Zustand nur über eine andere Transition<br />
verlassen werden<br />
A<br />
do / lachen<br />
[Bauch tut weh]<br />
- Nach dem Lachen werden – falls der Bauch weh tut – die Muskeln gelockert<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 281<br />
B<br />
do / Muskeln lockern<br />
B<br />
do / Muskeln lockern
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Transitionen im Detail II<br />
n� Änderungsauslöser (Change Trigger)<br />
ð� an der Transition steht eine When-Bedingung<br />
ð� falls die Bedingung erfüllt ist, erfolgt die Transition (auch vor oder während der<br />
do-Aktivität)<br />
ð� falls die Bedingung nicht erfüllt ist, erfolgt der Zustandsübergang dann, wenn sich<br />
die Bedingung von false auf true ändert<br />
ð� die Bedingung wird „ständig“ neu ausgewertet <strong>und</strong> bei Erfüllung wird die<br />
Transition ausgelöst<br />
- damit die Auswertung der Bedingung technisch möglich ist, wird die Überwachung in<br />
der Praxis auf bestimmte Zeitpunkte, bestimmt Ereignisse oder die Attribute des<br />
Zustands eingeschränkt<br />
A<br />
do / lachen<br />
when (Bauch tut weh)<br />
- Das Lachen wird unterbrochen, sobald der Bauch weh tut!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 282<br />
B<br />
do / Muskeln lockern
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Ereignisse im Detail<br />
n� Wenn ein Ereignis eintrifft, gibt es entweder<br />
ð� eine Transition, die feuern kann<br />
- das ist der Normalfall; im Beispiel für z='+'<br />
ð� mehrere Transitionen, die feuern können<br />
- Der Trigger passt zu mehreren Transitionen <strong>und</strong> der Guard<br />
liefert „true“; im Beispiel für z='*'<br />
- das Verhalten der Zustandsmaschine ist nicht vorhersagbar;<br />
es wird eine zufällig bestimmte Transition durchlaufen<br />
- Dieser Fall sollte vermieden werden!<br />
ð� keine Transition, die feuern kann<br />
- Der Trigger passt zu keiner Transitionen oder der Guard<br />
liefert „false“; im Beispiel für z='/'<br />
- dann verfällt das Ereignis <strong>und</strong> es wird keine Transition ausgeführt<br />
n� Bei Automatischen Transitionen (Transitionen ohne Ereignis)<br />
gilt das Gleiche – auch wenn es kein echtes Ereignis gibt<br />
Ereignis1 [z!='/']<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 283<br />
SX<br />
entry/ z=read()<br />
Ereignis1 [z='*']<br />
[z!='/']<br />
SY<br />
entry/ z=read()<br />
[z='*']
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Sonderfälle: Kreuzungen vs. Entscheidungen<br />
n� Eine Kreuzung erlaubt, bei Kombinationen von Zustandsübergängen das<br />
Diagramm zu vereinfachen.<br />
ð� Aber Vorsicht – es gibt einen wichtigen Unterschied zu Entscheidungen<br />
Kreuzung<br />
B<br />
A<br />
do / z = 17<br />
Trigger / z++<br />
[z gerade] [z ungerade]<br />
Entscheidung<br />
C B<br />
Trigger / z++<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 284<br />
A<br />
do / z = 17<br />
[z gerade] [z ungerade]<br />
C
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Kreuzungen vs. Entscheidungen (Darstellung transformiert)<br />
n� Die Kreuzung kann als 2 Transitionen, die Entscheidung mit 3 Transitionen <strong>und</strong><br />
Zwischenzustand dargestellt werden:<br />
A<br />
Kreuzung Entscheidung<br />
do / z = 17<br />
Trigger [z gerade]<br />
/ z++<br />
B<br />
Trigger [z ungerade]<br />
/ z++<br />
C B<br />
ohne Aktivitäten oder Aktionen<br />
Trigger / z++<br />
ð� Die Auswertung der Bedingung erfolgt bei der Kreuzung VOR der Ausführung der<br />
Aktion; bei der Entscheidung nach der Aktion!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 285<br />
A<br />
do / z = 17<br />
[z gerade] Zwischenzustand<br />
[z ungerade]<br />
C
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Wie findet man Zustände, Übergänge <strong>und</strong> Ereignisse?<br />
n� Analysiere, in welchen unterschiedlichen Zuständen<br />
sich das System befinden kann<br />
ð� Suche nach gleichem Verhalten über einen Zeitraum<br />
n� Analysiere welche Ereignisse in dem System auftauchen<br />
ð� löst das Ereignis einen Zustandsübergang aus?<br />
ð� welche Aktion erfolgt als Reaktion auf das Ereignis?<br />
ð� welche Aktionen werden dauerhaft ausgeführt <strong>und</strong> welche Aktionen nur <strong>beim</strong><br />
Eintreten oder Verlassen eines Zustands?<br />
n� Analysiere die Übergänge zwischen den Zuständen<br />
ð� sollte es einen Übergang zwischen einem Zustandspaar geben?<br />
ð� achte darauf, dass jedes Ereignis höchstens einen Übergang auslöst<br />
Analysiere auch vorliegende<br />
Use Cases <strong>und</strong> Sequenzdiagramme!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 286
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung der Übung: C++ Kommentarfilter<br />
“*” im /* Kom. gelesen<br />
[z='*']<br />
[z!='*' && z!='/']<br />
entry/ z=read()<br />
[z!='“']<br />
/write(z)<br />
[z='*']<br />
[z='/']<br />
in String<br />
entry/ z=read()<br />
In “/*”-Kommentar<br />
entry/ z=read()<br />
[z!='/' && z!='“' && z!=EOF]<br />
/write(z)<br />
[z='“']<br />
/write(z) [z='“']<br />
/write(z)<br />
im Progr-Code<br />
entry/ z=read()<br />
[z!='*']<br />
[z='/']<br />
[z='*']<br />
[z!='/' && z!='*']<br />
/write('/'); write(z);<br />
[z!=EOLN<br />
&& z!=EOF]<br />
Ein “/” gelesen<br />
entry/ z=read()<br />
[z='/']<br />
[z=EOLN]<br />
/write(z);<br />
[z=EOF]<br />
/write(z) In “//”-Kommentar<br />
entry/ z=read()<br />
[z=EOF] / write(z);<br />
Finden Sie noch<br />
einen Fehler?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 288
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Beschreibung des Zustandsverhaltens<br />
n� Gr<strong>und</strong>sätzlich kann das Zustandsverhalten (do / Zustandsverhalten) auch<br />
außerhalb des Zustandsdiagramms näher beschrieben werden:<br />
ð� verbal<br />
ð� als Aktivitätsdiagramm<br />
ð� als weiteres Zustandsdiagramm (ein Zustand wird in Unterzustände mit<br />
Zustandsübergängen zerlegt)<br />
ð� oder auch mit dem Konzept der zusammengesetzten Zustände<br />
(siehe nächste Folie)<br />
Systemstart<br />
entry / roteLEDAn()<br />
do / Birne aufheizen()<br />
exit / roteLEDAus()<br />
alle 5 Sek. [true] / CheckTemp()<br />
Birne aufheizen<br />
Damit die Birne...<br />
Birne aufheizen<br />
The image cannot be displayed. Your computer may<br />
not have enough memory to open the image, or the<br />
image may have been corrupted. Restart your<br />
computer, and then open the file again. If the red x<br />
still appears, you may have to delete the image and<br />
then insert it again.<br />
Birne aufheizen<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 289
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Zusammengesetzte Zustände (composite states)<br />
n� Bisher haben wir nur einfache Zustände betrachtet<br />
ð� Ein Zustand kann jedoch selbst wiederum als ein Automat mit Unterzuständen<br />
beschrieben werden<br />
ð� Das Vorhandensein von Unterzuständen kann durch das Composite-Icon<br />
(„Brille“) angedeutet werden<br />
Zustandsname<br />
entry / Eintrittsverhalten<br />
do / Zustandsverhalten<br />
exit / Austrittsverhalten<br />
UZ1 UZ1<br />
Zustandsname<br />
entry / Eintrittsverhalten<br />
do / Zustandsverhalten<br />
exit / Austrittsverhalten<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 290
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Eintritt in einen zusammengesetzten Zustand<br />
n� Ein zusammengesetzter Zustand kann wie folgt betreten werden:<br />
ð� Default entry<br />
Die Pfeilspitze des Zustandsübergangs zeigt<br />
auf den Rand des zusammengesetzten Zustands.<br />
Damit wird der Startzustand des zusammengesetzten<br />
Zustands implizit als Folgezustand ausgewählt.<br />
ð� Explicit entry<br />
Die Pfeilspitze zeigt direkt auf einen bestimmten<br />
Unterzustand eines zusammengesetzten Zustands.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 291<br />
UZ<br />
UZ1<br />
UZ2
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Verlassen eines zusammengesetzten Zustands<br />
n� Ein zusammengesetzter Zustand kann auf folgende Arten verlassen werden:<br />
ð� Der zusammengesetzte Zustand erreicht seinen Endzustand (weiter mit C).<br />
ð� Ein Unterzustand wechselt explizit in einen anderen Zustand außerhalb des<br />
zusammengesetzten Zustands (B nach D).<br />
ð� Ein Auslöser weg von dem zusammengesetzten Zustand findet statt<br />
(Wechsel nach E – egal aus welchem Zustand).<br />
C<br />
A B<br />
T1[G1]/A1<br />
T2[G2]/A2<br />
Was passiert, wenn T1 eintrifft <strong>und</strong> G1 erfüllt ist, während der Do-Teil von A ausgeführt wird?<br />
Was passiert, wenn T1 eintrifft <strong>und</strong> G1 erfüllt ist, während der Do-Teil von B ausgeführt wird?<br />
Was passiert, wenn T2 eintrifft <strong>und</strong> G2 erfüllt ist, während der Do-Teil von A ausgeführt wird?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 292<br />
D<br />
E
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Zwischenstand Zustandsdiagramme<br />
n� Modellierungselemente<br />
ð� Zustände <strong>und</strong> Verhalten in Zuständen<br />
ð� Transitionen <strong>und</strong> Aktionen<br />
ð� Ereignisse<br />
ð� Zusammengesetzte Zustände<br />
n� Bisher:<br />
ð� Beschreibung von zustandsbasierten Vorgängen (Laserdrucker, Tür)<br />
ð� Beschreibung von Algorithmen (C++-Parser)<br />
ð� eher als Mittel für die <strong>Analyse</strong><br />
Aber wie funktioniert das im <strong>Design</strong>,<br />
d. h. mit Objektorientierung – mit Klassen <strong>und</strong> Objekten?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 294
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Erste Beobachtung<br />
n� Betrachten Sie die Zustände, in denen<br />
sich ein typisches Objekt befinden<br />
kann:<br />
ð� Objekt wird angelegt (Konstruktor)<br />
ð� Objekt ist vorhanden<br />
- empfängt Nachrichten<br />
bzw. macht Methodenaufrufe<br />
- je nach Aufruf <strong>und</strong> Attributen des<br />
Objekts werden Attribute verändert<br />
oder weitere Nachrichten verschickt<br />
- Ereignisse (z. B. Timer) können<br />
Aktionen auslösen<br />
ð� Objekt wird zerstört (Destruktor)<br />
... durchläuft<br />
mehrere<br />
Zustände<br />
Ein Objekt<br />
wird erzeugt...<br />
Aktiv<br />
… <strong>und</strong> stirbt<br />
Der Lebenszyklus von Objekten einer Klasse kann durch Zustandsdiagramme<br />
beschrieben werden!<br />
Neu<br />
Sterbend<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 295
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Zweite Beobachtung<br />
n� Objekte in einem Sequenzdiagramm zeigen Zustände an!<br />
ð� eingehende Signale ändern den Zustand<br />
Waiting<br />
Checking Student<br />
Exmatriculating<br />
Zustandsdiagramm<br />
Exmatrikulationsmaske<br />
in(MatrNr)<br />
return (ExStudi) d. h.<br />
when Studi existiert<br />
Waiting<br />
Checking Student<br />
entry/SV.existiertStud(MatrNr)<br />
Exmatriculating<br />
entry/ExStudi.exmatrikulieren()<br />
return(ok), d. h.<br />
when Studi exmatrikuliert<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 296
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Von Sequenzdiagrammen zum Zustandsdiagramm<br />
n� Vorgehen zum Herausarbeiten der Zustände<br />
1. Wähle ein Objekt aus <strong>und</strong> analysiere ein Sequenzdiagramm in dem es vorkommt<br />
2. Markiere eintreffende Ereignisse für das betreffende Objekt<br />
3. Wähle ein Paar von „benachbarten“ Ereignissen<br />
4. Analysiere was das Objekt zwischen den beiden Ereignissen tut <strong>und</strong> vergebe<br />
einen entsprechenden Namen für diesen Zustand<br />
5. Führe den vorigen Schritt für alle benachbarten Paare durch<br />
6. Wiederhole das Vorgehen für weitere Sequenzdiagramme<br />
n� Zeichne ein Zustandsdiagramm<br />
1. Beginne das Diagramm mit einem Startzustand <strong>und</strong> den gef<strong>und</strong>enen Zuständen<br />
2. Zeichne Transitionen zwischen Zuständen, die im Sequenzdiagramm<br />
benachbart sind<br />
3. Ergänze das Diagramm um Ereignisse, Aktionen <strong>und</strong> bei Bedarf um einen<br />
Endzustand<br />
4. Überprüfe, ob es weitere Transitionen geben sollte, die nicht in den<br />
Sequenzdiagrammen vorkommen<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 297
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Übung: Mikrowellenherd<br />
n� Modellieren Sie einen Mikrowellenherd.<br />
Die Funktionsweise wird stichwortartig zusammengefasst:<br />
ð� Die Bedienelemente für den Benutzer sind der Einschaltknopf <strong>und</strong> die Tür<br />
ð� Durch Drücken des Knopfes wird die Mikrowelle (die „Backröhre“) eingeschaltet<br />
ð� Die Kochzeit wird über eine interne Zeituhr auf eine Minute festgelegt<br />
ð� Durch weiteres n-maliges Drücken des Knopfes wird die Kochzeit um n Minuten<br />
verlängert<br />
ð� Wenn die Zeit abgelaufen ist, wird die Backröhre ausgeschaltet, ein Piepton<br />
ertönt <strong>und</strong> als nächstes muss die Tür geöffnet werden bevor die Mikrowelle<br />
erneut gestartet werden kann<br />
ð� Durch Öffnen der Tür wird die Backröhre abgeschaltet <strong>und</strong> die verbleibende<br />
Kochzeit gelöscht<br />
ð� Der Mikrowellenherd startet nur bei geschlossener Tür<br />
Die Aufgabe kennen Sie aus<br />
dem Kapitel Sequenzdiagramme!<br />
ð� Wenn die Tür offen ist oder wenn der Herd an ist, leuchtet das Licht<br />
ð� Wenn der Mikrowellenherd ein- bzw. ausschaltet, muss die Backröhre ebenfalls<br />
ein- bzw. ausgeschaltet werden<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 298
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Übung: Mikrowellenherd<br />
n� Erstellen Sie<br />
ð� ein Klassendiagramm<br />
- mit Klassen, Attribute, Methoden, Assoziationen<br />
ð� die Zustandsdiagramme der Klassen. Suchen Sie dazu:<br />
- Zustände (z. B. auch in den Sequenzdiagrammen)<br />
- Ereignisse<br />
- Zustandsübergänge<br />
- Aktivitäten<br />
ð� Die Sequenzdiagramme für folgende Szenarien sollen abgedeckt werden<br />
- 2 Minuten kochen<br />
- Tür öffnen <strong>und</strong> schließen<br />
- Kochvorgang mit Abbruch durch Tür öffnen<br />
Die Aufgabe kennen Sie aus<br />
dem Kapitel Sequenzdiagramme!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 299
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung Mikrowellenherd: Klassendiagramm<br />
Die Lösung kennen Sie aus<br />
dem Kapitel Sequenzdiagramme!<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 300
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung Mikrowellenherd: Sequenzdiagramm „2 Minuten kochen“<br />
wartend<br />
kochend<br />
kochen fertig<br />
n� Analysiere die Objekte auf Zustände<br />
ð� Backröhre<br />
- an<br />
- aus<br />
ð� Licht<br />
- an<br />
- aus<br />
ð� Timer<br />
- aus<br />
- aktiv<br />
ð� Mikrowelle<br />
- wartend<br />
- kochend<br />
- kochen fertig<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 301
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung Mikrowellenherd: Sequenzdiagramm „Tür öffnen <strong>und</strong> schließen“<br />
n� Analysiere die Objekte auf Zustände<br />
ð� Backröhre<br />
- an<br />
- aus<br />
ð� Licht<br />
- an<br />
- aus<br />
ð� Timer<br />
- aus<br />
- aktiv<br />
ð� Mikrowelle<br />
- wartend<br />
- geöffnet<br />
schon bekannt<br />
neu<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 302
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung Mikrowellenherd: Sequenzdiagramm „Kochen mit Abbruch“<br />
n� Analysiere die Objekte auf Zustände<br />
ð� Backröhre<br />
- an<br />
- aus<br />
ð� Licht<br />
- an<br />
- aus<br />
ð� Timer<br />
- aus<br />
- aktiv<br />
ð� Mikrowelle<br />
- wartend<br />
- kochend<br />
- geöffnet<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 303
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung Mikrowellenherd: Zustandsdiagramme für Licht <strong>und</strong> Backröhre<br />
Licht<br />
Licht an<br />
entry / lichtstatus = on;<br />
an aus<br />
Licht aus<br />
entry / lichtstatus = off;<br />
Backroehre<br />
Backröhre an<br />
entry / backstatus = on;<br />
an aus<br />
Backröhre aus<br />
entry / backstatus = off;<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 304
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung Mikrowellenherd: Zustandsdiagramm Timer<br />
Timer<br />
Timer aus<br />
entry / reset()<br />
erhoehe / zeit++;<br />
start when<br />
zeit==0<br />
/myback.alert<br />
Timer aktiv<br />
do / zähle zeit runter<br />
erhoehe / zeit++;<br />
stop<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 305
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung Mikrowellenherd: Zustandsdiagramm Mikrowelle<br />
Mikrowelle<br />
wartend<br />
entry /MyBack.aus,<br />
MyLicht.aus, MyTimer.reset<br />
Tür_zu<br />
Knopf<br />
/ MyTimer.<br />
erhoehe<br />
Tür_auf / MyLicht.an<br />
kochend<br />
entry / MyBack.an,<br />
MyLicht.an, MyTimer.start<br />
exit / MyBack.aus<br />
Knopf /MyTimer.erhoehe<br />
geöffnet<br />
kochen fertig<br />
entry / MyLicht.aus, out(Piep)<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 306<br />
alert<br />
Tür_auf / MyTimer.stop<br />
Tür_auf / MyLicht.an
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Lösung Mikrowellenherd: Bewertung<br />
n� Aktionen können häufig an verschiedenen Stellen umgesetzt werden<br />
ð� z. B. als Austrittverhalten des alten Zustands oder als Aktion, die zur Transition<br />
gehört oder auch als Verhalten des neuen Zustands<br />
ð� achten Sie darauf, dass Aktionen nicht unnötig oder mehrfach ausgeführt wird<br />
ð� bedenken Sie, dass nur das Zustandsverhalten länger dauern darf<br />
ð� bei zyklischen Transitionen wird jeweils das Exit <strong>und</strong> Entry behavior ausgeführt<br />
- bei internen Transitionen nicht!<br />
kochend<br />
entry / MyBack.an,<br />
MyLicht.aus, MyTimer.start<br />
exit / MyBack.aus<br />
Knopf / MyTimer.erhoehe<br />
Knopf<br />
/ Timer.erhoehe<br />
kochend<br />
entry / MyBack.an,<br />
MyLicht.aus, MyTimer.start<br />
exit / MyBack.aus<br />
n� Die Verwendung des Exit Verhaltens im Zustand „kochend“ verhindert, dass in<br />
einem anderen Zustand versehentlich die Backröhre „an“ ist<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 307
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Orthogonale zusammengesetzte Zustände<br />
n� Der Inhalt eines Zustands ist schwer auf Korrektheit zu prüfen, wenn darin<br />
mehrere eigenständige Objekte behandelt werden<br />
ð� üblicherweise bei einer Aggregation im Klassendiagramm<br />
(z. B. auch Timer, Licht, Backröhre)<br />
n� Ein Zustand kann zur Verbesserung der Übersichtlichkeit in sogenannte<br />
Regionen (oder Gebiete) aufgeteilt werden<br />
ð� jede enthält einen parallel ausführbaren<br />
(„orthogonalen“) Unterzustandsautomaten<br />
ð� wenn der Oberzustand betreten wird,<br />
werden alle Unterzustandsautomaten<br />
parallel betreten<br />
ð� Auftretende Ereignisse werden<br />
für jede Region betrachtet<br />
ð� das Ein- <strong>und</strong> Austrittsverhalten wird analog<br />
zu den zusammengesetzten Zuständen<br />
dargestellt<br />
kochend<br />
Backröhre<br />
an<br />
entry / an<br />
exit / aus<br />
Licht<br />
an<br />
entry / an<br />
Timer<br />
aktiv<br />
entry / start<br />
Knopf / zeit++<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 308
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Weitere Modellierungselemente: Gabelung <strong>und</strong> Vereinigung<br />
n� Um parallele Abläufe für orthogonal zusammengesetzte Zustände explizit zu<br />
machen, gibt es die Gabelung („Fork“)<br />
ð� die ausgehenden Kanten enthalten weder Trigger<br />
noch Bedingung<br />
ð� jede ausgehende Kante führt in eine (andere) Region<br />
ð� nun können mehrere (Unter-)Zustände aktiv sein, allerdings müssen Sie<br />
unabhängig voneinander sein <strong>und</strong> können deshalb auch leicht sequentialisiert<br />
werden<br />
n� Um die Synchronisation von parallelen Abläufen (innerhalb von orthogonal<br />
zusammengesetzten Zuständen) explizit zu machen, gibt es die<br />
Vereinigung („Join“)<br />
ð� jede der eingehenden Kanten stammt aus einer Region<br />
ð� die eingehenden Kanten haben weder Trigger<br />
noch Bedingung<br />
n� Die Verfolgung der aktiven Unterzustände erfolgt nach dem Tokenprinzip<br />
Auslöser [Bedingung]<br />
Verhalten Verhalten<br />
Verhalten Verhalten<br />
Auslöser [Bedingung]<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 309
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Weitere Modellierungselemente: Gr<strong>und</strong>idee Historie<br />
n� Unterzustandsautomaten können auch komplizierter sein, als im<br />
vorherigen Beispiel<br />
ð� Stellen Sie sich z. B. ein Autoradio vor, das CD-Player, Radio usw. enthält<br />
ð� dann wird das Autoradio zu einem Zustandsautomaten, der viele Zustände<br />
enthält <strong>und</strong> wiederum selbst Unterzustandsautomaten für CD <strong>und</strong> Radio enthält<br />
ð� <strong>beim</strong> Wiedereintritt in einen Unterzustand wäre es oft praktisch zu wissen, in<br />
welchem Zustand der Unterautomat zuletzt war<br />
- z. B. war das Radio auf MW, oder auf UKW, bevor Sie zur CD wechselten?<br />
ð� Man braucht so etwas wie einen „intelligenten Eingangszustand“, der sich den<br />
letzten Zustand merkt<br />
ð� dann wird <strong>beim</strong> Wiedereintritt<br />
in den Unterautomaten<br />
der vorherige Zustand<br />
wiederhergestellt<br />
ð� „Historie“<br />
CD Betrieb<br />
Taste RADIO<br />
[CD eingelegt]<br />
Radiobetrieb<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 310<br />
FM<br />
Taste AM<br />
Taste FM<br />
AM
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Weitere Modellierungselemente: Flache Historie<br />
n� Eine flache Historie („Shallow History“)<br />
ð� merkt sich den Zustand der <strong>beim</strong> Verlassen eines Unterzustandsautomaten<br />
zuletzt aktiv war<br />
ð� kann eine Transition definieren, die ausgeführt wird, wenn die Historie noch nicht<br />
„gesetzt“ ist bzw. gelöscht wurde<br />
ð� wird gelöscht (d. h. der Inhalt), wenn ein Endzustand des<br />
Unterzustandsautomaten erreicht wird<br />
ð� merkt sich NICHT die Zustände von verschachtelten Unterzustandsautomaten<br />
CD Betrieb<br />
Taste RADIO<br />
when(CD eingelegt)<br />
definiert Zielzustand<br />
bei leerer Historie<br />
H<br />
FM<br />
Radiobetrieb<br />
flache Historie<br />
Taste AM<br />
Taste FM<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 311<br />
AM
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Weitere Modellierungselemente: Tiefe Historie<br />
n� Eine tiefe Historie („Deep History“)<br />
ð� merkt sich den zuletzt aktiven Unterzustand in der aktuellen <strong>und</strong> in allen weiteren<br />
Unterzustandsautomaten<br />
ð� kann eine Transition definieren, die ausgeführt wird, wenn die Historie noch nicht<br />
„gesetzt“ ist bzw. gelöscht wurde<br />
ð� wird gelöscht (d. h. der Inhalt), wenn ein Endzustand des<br />
Unterzustandsautomaten erreicht wird<br />
ð� merkt sich die Zustände von allen verschachtelten Unterzustandsautomaten<br />
CD Betrieb<br />
Taste RADIO<br />
[CD eingelegt]<br />
H*<br />
FM1<br />
FM<br />
Taste FM<br />
Taste FM<br />
tiefe Historie<br />
Radiobetrieb<br />
FM2<br />
Taste AM<br />
Taste FM<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 312<br />
AM
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Vom Zustandsautomat zum laufenden Code (Prinzip)<br />
n� Umsetzung eines Systems mit Zustandsautomaten<br />
ð� Die Implementierung der Klassen mit Methoden <strong>und</strong> Attributen ist bekannt<br />
ð� Die Zustände <strong>und</strong> Ereignisse kann man mit Switch/Case <strong>und</strong> Enums umsetzen<br />
ð� Das Eintreffen eines Ereignisses kann man durch Methodenaufrufe realisieren<br />
ð� Das ist für jeden Zustandsautomat das Gleiche!<br />
ð� Verwende eine generische Laufzeitumgebung für Zustandsdiagramme!<br />
n� Es gibt mächtige Tools/Frameworks für Zustandsautomaten (z. B. Rhapsody)<br />
ð� lesen Zustandsautomaten bzw. -diagramme ein<br />
ð� erzeugen lauffähigen Code<br />
ð� stellen die erforderliche Infrastruktur bereit (Timer, Messaging,...)<br />
- zum Verschicken von Nachrichten, zum Aufrufen von Methoden, zum Verfolgen des<br />
aktiven Zustands, usw.<br />
ð� unterstützen bei der Entwicklung mit „Debugger“, <strong>Analyse</strong>verfahren usw.<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 313
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Parallelität, synchron oder asynchron? Aktive Objekte<br />
n� In den Zustandsdiagrammen tauchen mehrere Objekte auf, die offensichtlich<br />
eigenständig „leben“<br />
ð� z. B. muss der Timer weiterzählen, während die Mikrowelle auf einen<br />
Tastendruck wartet; das heißt die Mikrowelle <strong>und</strong> der Timer arbeiten parallel<br />
ð� <strong>und</strong> die Backröhre heizt eigentlich für eine längere Zeitdauer – wir haben das<br />
einfach auf das An-/Ausschalten beschränkt<br />
ð� in den Sequenzdiagrammen wurde das Problem schon angedeutet<br />
(durch asynchrone Nachrichten mit einer in()-/out()-Notation)<br />
– aber dort dürfen auch mehrere Objekte gleichzeitig aktiv sein!<br />
ð� In einem Zustandsautomaten darf immer nur ein Zustand aktiv sein!<br />
n� Eigentlich braucht man mehrere Zustandsautomaten, die parallel arbeiten <strong>und</strong><br />
Nachrichten austauschen können!<br />
ð� Das Konzept der „aktiven Objekte“ erlaubt dies <strong>und</strong> die zuvor erwähnten Tools<br />
unterstützen auch diese Fähigkeit<br />
ð� Durch Multitasking, kritische Bereiche, asynchrone Kommunikation etc. wird die<br />
Umsetzung dann deutlich komplizierter... (<strong>und</strong> wird deshalb hier nicht behandelt)<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 314
5.3.3 Darstellung der Dynamik eines Systems: Zustandsdiagramme<br />
Kontrollfragen<br />
n� Welche Verhalten können innerhalb eines Zustands auftreten?<br />
n� Wie ist die Ausführungsreihenfolge bei einem Zustandsübergang?<br />
n� Was passiert, wenn es mehr als eine Transition gibt, deren Wächter <strong>und</strong> Trigger<br />
erfüllt sind?<br />
n� Was bedeutet eine Transition, die keinen Trigger hat, sondern nur einen<br />
Wächter?<br />
n� Was haben Zustandsdiagramme mit Objekten zu tun?<br />
n� Wie extrahiert man aus Sequenzdiagrammen die Zustände?<br />
n� Wie kann man Zustandsautomaten ausführbar machen?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 315
Hochschule Darmstadt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong><br />
<strong>Objektorientierte</strong> <strong>Analyse</strong> <strong>und</strong> <strong>Design</strong><br />
5.3.4 Darstellung der Dynamik eines Systems:<br />
Zusammenfassung<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong>
5.3.4 Darstellung der Dynamik eines Systems: Zusammenfassung<br />
Kontrollfragen<br />
n� Warum sind Verhaltensdiagramme eine wichtige Ergänzung zu<br />
Strukturdiagrammen?<br />
n� Welche Elemente enthält ein Sequenzdiagramm?<br />
n� Gehört ein Aktor zum System?<br />
n� Wann verwendet man (a)synchrone Aufrufe?<br />
n� Welche Bedeutung hat die Aktivierung?<br />
n� Was sind „Combined Fragments“?<br />
n� Sind Sequenzdiagramme ausführbar?<br />
n� Welchen Vorteil bieten Kommunikationsdiagramme?<br />
n� Wann verwenden Sie Zustandsdiagramme?<br />
n� Sind Zustandsdiagramme ausführbar?<br />
Können Sie jetzt die Dynamik eines Systems<br />
in Diagrammen darstellen?<br />
OOAD, Dr. Eicke Godehardt WS2012/13, h_da, <strong>Fachbereich</strong> <strong>Informatik</strong> 317