Vorlesung Informatik II Universität Augsburg Wintersemester 2011/2012 Prof. Dr. Bernhard Bauer Folien von: Prof. Dr. Robert Lorenz Lehrprofessur für Informatik 11. UML: Sequenzdiagramm 1
Motivation Es gibt verschiedene UML-Diagramme, um (noch programmiersprachenunabhängig) die Implementierung von Operationen zu modellieren Sequenzdiagramme: Berücksichtigen Nebenläufigkeit (kausale Unabhängigkeit) von Anweisungen Zustandsautomaten Aktivitätsdiagramme 2
Sequenzdiagramme veranschaulichen den Ablauf eines Teils der Anweisungen bei Abarbeitung einer Operation Einfachster Fall: Nur ein alternativer Ablauf ohne Verzweigungen und Wiederholungen wird modelliert Verallgemeinerungen: Mehrere alternative Abläufe zusammenfassen (mittels Verzweigungen und Wiederholungen) 3
Sequenzdiagramme zeigen grafisch die Interaktion zwischen mehreren Kommunikationspartnern Kommunikationspartner: Objekte, Klassen, Benutzer Interaktionen: Operationsaufrufe und Signale (Botschaften) Synchrone Botschaften: Sender wartet mit der eigenen Verarbeitung auf Beendigung der aufgerufenen Operation Asynchrone Botschaften: Sender wartet nicht mit der eigenen Verarbeitung auf Beendigung der aufgerufenen Operation Parallele Verarbeitung 4
Komponenten eines Sequenzdiagramms: Kommunikationspartner Aufrufer (Sender) und Ausführer (Empfänger) von Operationen Angegeben durch ihren Namen in einer rechteckigen Box Klassen: benutze Klassennamen Objekte: benutze Objektnamen oder :<Klassenname (anonymes Objekt) Benutzer hat den Namen Benutzer (User) Nach unten verlaufenden Lebenslinien ausgehend von jedem Kommunikationspartner Stellt Existenzzeit eines Kommunikationspartners dar Angegeben durch gestrichelte Linien 5
Komponenten eines Sequenzdiagramms: Botschaften Angegeben durch durchgezogenen Pfeil von Lebenslinie des Senders zur Lebenslinie des Empfänger Annotiert mit dem Namen (Operation: Benutze Prototyp) Werden von oben nach unten an die Lebenslinien notiert Interpretation: Obere Botschaft kausal vor unterer Botschaft 6
Komponenten eines Sequenzdiagramms: Synchrone Botschaft Durchgezogener Pfeil mit geschlossener Pfeilspitze Rückantwort erforderlich Botschaft kausal vor (oberhalb von) Rückantwort Rückantwort Gestrichelter Pfeil mit geschlossener Pfeilspitze Operationen: annotiert mit Rückgabeobjekt Asynchrone Botschaft: Durchgezogener Pfeil mit offener Pfeilspitze 7
Komponenten eines Sequenzdiagramms: Operationsabarbeitungsdauer Angegeben durch rechteckige Box, über die Lebenslinie gelegt Erlaubt Darstellung, dass bei der Abarbeitung einer Operation andere Operation aufgerufen werden Später: Kontrollstrukturen (Verzweigung, Wiederholung) 8
Komponenten eines Sequenzdiagramms: Anweisungen, die keiner Botschaft entsprechen, können nicht modelliert werden, z.b. Deklarationen Wertzuweisungen an Variablen primitiven Typs 9
Botschaften: Beispiele Synchrone Botschaften: Verwaltungsoperationen Ausnahmebehandlung (später) Asynchrone Botschaften: Konstruktoren Benutzeraktionen (Ereignisse) Aufrufe von Prozessen (später) 10
Operationsaufrufe und Kommunikationspartner Empfänger ist dasjenige Objekt/diejenige Klasse, für das/die die Operationen aufgerufen wird Die Operation gehört zum Verhalten des Objekts/der Klasse Empfänger von Klassenoperationen sind Klassen Empfänger sonstiger Operationen sind Objekte Sender ist dasjenige Objekt/diejenige Klasse, bei dem eine Operationsabarbeitung den Operationsaufruf verursacht Sender ist eine Klasse bei Abarbeitung einer Klassenoperation Sender ist ein Objekt bei Abarbeitung sonstiger Operationen 11
Allgemeine grafische Veranschaulichung Lebenslinie <synchron <synchron <Rückgabeobjek Aufruf bei Abarbeitung <asynchron Botschaft an sich selbst <synchron <asynchron <asynchron <synchron Operationsabarbeitungsdauer 12
Beispiel: ActionListener registrieren (Teil der Implementierung des Konstruktors des Fensters) User new MeinFenster() :MeinFenster close:button new Button() add(close) addactionlistener(this) 13
Beispiel: Auf ActionEvent reagieren (zeigt eine alternative Ausführung) User :Button :MeinFenster System onclick new ActionEvent() e:actionevent actionperformed(e) getactioncommand() s dispose() exit(0) 14
Beispiel: Daten von der GUI in die Fachkonzeptklasse übertragen (Ausschnitt) User speichern:button :MeinFenster onclick new ActionEvent() actionperformed(e) e:actionevent getactioncommand() s new Student() subject:student save() name:textfield gettext() s setname(s) 15
Kausalität in Sequenzdiagrammen: Senden vor Empfangen von Nachrichten Operationsbeginn vor Operationsende Obere vor untere Aktion Nicht kausal geordnete Aktionen sind kausal unabhängig Solche Aktionen heißen nebenläufig 16
Abstraktion in Sequenzdiagrammen: Modellierung in mehreren Phasen: Operationen werden Top-Down verfeinert / implementiert 17
Darstellung verschachtelter Operationsaufrufe der Form <methodeaussen(<methodeinnen())(übergabe von Parametern durch Operationsaufruf) Alternative 1: Verzichte auf Darstellung von <methodeinnen() <methodeaussen(<methodeinnen()) 18
Darstellung verschachtelter Operationsaufrufe der Form <methodeaussen(<methodeinnen())(übergabe von Parametern durch Operationsaufruf) Alternative 2: Zerlege Anweisung in zwei Botschaften <methodeinnen() o <methodeaussen(o) 19
Konsistenz mit Klassendiagramm beachten: Alle Klassen von Kommunikationspartnern müssen im Klassendiagramm vorkommen Alle Operationen müssen in der richtigen Klasse im Klassendiagramm vorkommen Operationen dürfen nur konsistent zu den Navigierbarkeiten der Assoziationen im Klassendiagramm aufgerufen werde (Wer eine Operation eines Objekts aufruft, muss dieses Objekt kennen!) Oft muss das Klassendiagramm nochmal angepasst werden 20
Es gibt etliche Operatoren zur Kombination von Sequenzdiagrammen: Alternativen Wiederholungen u.v.m. 21
Alternative: alt-umgebung zur Unterscheidung mehrerer alternativer Ausführungen in Abhängigkeit von Bedingungen alt <botschaft [Bedingung1] <botschaft <botschaft <botschaft [Bedingung2] 22
Alternative: opt-umgebung zur optionalen Ausführung in Abhängigkeit von einer Bedingung <botschaft opt <botschaft <botschaft <botschaft [Bedingung] 23
Beispiel: Auf ActionEvent reagieren User :Button :MeinFenster System onclick new ActionEvent() e:actionevent actionperformed(e) getactioncommand() s opt [s.equals( close )] dipose() exit( ( 0 24
Wiederholung: loop-umgebung für n-fache Wiederholung <botschaft loop(n) <botschaft <botschaft <botschaft 25
Wiederholung: loop-umgebung für Wiederholung in Abhängigkeit von einer Bedingung <botschaft loop <botschaft <botschaft <botschaft [Bedingung] 26
Beispiel: Akualisierung eines Containers und der GUI nach Datenspeicherung :MeinFenster professoren:professorencontainer addprofessor(subject) update() professorenliste:list removeall() getprofessor(k++) p tostring() s add(s) p:professor loop [0<=k<anzahlProfessoren] 27