Start: Seite 209
Besprechung Schachspiel
- Komposition zwischen Figuren und Mannschaft nötig, damit man weiß, dass genau 1 König zu der Mannschaft gehört.
Multiplizitäten
- Umsetzung von Klassen und Assoziationen
- Attribute und Methoden können in objektorientierten Sprachen direkt umgesetzt werden
- Generalisierung wird mittels Vererbung umgesetzt
- Schnittstellen finden sich in abstrakten Klassen mit rein virtuellen Methoden wieder
- Umsetzung von einfachen Assoziationen geschieht über Referenz auf ein anderes Objekt
- Die Multiplizitäten „0..1“ und „1..1“ werden mittels eines Zeigers umgesetzt
- Die Multiplizitäten „0..*“ bzw. „1..*“ werden über Zeigermengen dargestellt, wie z.B. Vektoren oder Arrays
- Der Name des Attributs ist der Name der assoziierten Klasse
// Spezifikation von Veranstaltung class Veranstaltung { protected: Dozent* Referent; public: ... } } // Spezifikation von Dozent Liste<Veranstaltung*> gehaltene_Veranstaltung; public: class Dozent { protected: ... }
Assoziationsklassen
- Realisierung durch „Einschub“ einer Klassen zwischen den bestehenden Klassen
- Die Rollen-Namen werden auch in den Zwischenklassen-Zeigern beibehalten
- Die Zwischenklasse braucht Zeiger auf beide verbundenen Klassen
- Multiplizitäten an den Klassen werden substituiert und durch 1 ersetzt A * ↔ 1..* B A 1 ↔ 1..* C * ↔ 1 B
class Anstellung {
protected:
Firma* m_Arbeitgeber; // Referenz auf assoziiertes Objekt
Person* m_Arbeitnehmer; // Referenz auf assoziiertes Objekt
unsigned int Gehalt; // Attribut der Assoziation
string urlaub_von_bis; // Attribut der Assoziation ...
public:
virtual Person* getArbeitnehmer (void) const{ return (m_Arbeitnehmer); }
virtual Anstellung* setArbeitnehmer (const Person* einArbeitnehmer){
m_Arbeitnehmer = einArbeitnehmer;
return (this);
}
virtual Firma* getArbeitgeber (void) const{ return (m_Arbeitgeber);}
virtual Anstellung* setArbeitgeber (const Firma* einArbeitgeber){
m_Arbeitgeber = einArbeitgeber;
return (this);
}
virtual void Urlaub_beantragen (string anfang_ende){
urlaub_von_bis = anfang_ende;
};
...
}
class Person {
protected:
Liste<*Anstellung> m_Arbeitgeber;
public:
Anstellung* getAnstellung (const Firma* dieFirma) const {
// Navigieren auf dem Container gemäß gegebener Datenstruktur (Liste).
// Liefert die Referenz auf das Objekt der Assoziationsklasse, das die
// Referenz auf die übergebene Firma hält. So ist das Setzen und Lesen von
// Attributen bzw. das Ausführen von Methoden der Assoziation möglich.
}
virtual unsigned getAnstellungsGehalt (const Firma* derArbeitgeber) const {
// Zugriff auf ein Assoziationsklassen-Attribut:
return (getAnstellung (derArbeitgeber)-> getGehalt());
}
void do_Anstellung_Urlaub_beantragen (const Firma* derArbeitgeber, string anfang_ende){
// Ausführen einer Assoziationsklassen-Methode:
getAnstellung(derArbeitgeber)->Urlaub_beantragen(string anfang_ende);
}
...
}
Gesprächs-Ebenen
- A: Analyse
- T: Design
Aggregation und Komposition
- Aggregation: Wird mit einem Zeiger realisiert
- Komposition: Teilklassen sind Member-Attribute der Komposition
Kommunikation zwischen Objekten
- Objekte kommunizieren mittels Methoden miteinander
- Objekt X sagt Objekt Y „Führe y.a() aus“.
- Objekt Y gibt den Wert zurück
- Aufrufe
- Synchron:
- Während Y.a() ausgeführt wird, ist X im idle-Modus (tut nichts)
- Deterministisch: a b
- Ausgefüllter Pfeil
- Asynchron:
- X arbeitet direkt weiter und übergibt Y die „Verantwortung“
- Nicht deterministisch: / b a / a b / …
- Pfeilspitzen
- Synchron:
Klausur
- Sequenzdiagramme sind wichtig!
Sequenzdiagramme
- Objekte die oben stehen, existieren bereits zu beginn
- Objekte, die tiefer stehen, werden erst im Verlauf erzeugt
- Returnpfeile sind optional, aber sind empfohlen
- Jedes Objekt hat seine eigene Bahn
- So ist eindeutig, wer Nachrichten an wen übermittelt
- Nachrichten, die geschickt werden, sind genau die Methoden, die angeboten werden
Synchrone Nachrichten
- Nach Senden einer Nachricht, wartet der Sender, bis der Empfänger die Nachricht empfangen hat und diese vollständig abgearbeitet wurde. Dann kann er weitersenden.
- Die Kontrolle wird abgegeben
- Synchrone Nachrichten sind Methodenaufrufe.
- Wird eine Methode aufgerufen, so wird gewartet, bis die Methode abgearbeitet wurde.
- Darstellung: schwarz gefüllter Pfeil
Asynchrone Nachrichten
- nach Senden einer Nachricht, kann der Sender sofort weitersenden, während der Empfänger die Nachricht abarbeitet.
- paralleles Arbeiten von Sender und Empfänger
- Benachrichtigungen an bzw. vom Benutzer sind immer asynchron.
- Eingaben, Ausgaben
- Darstellung: normaler Pfeil
Der Unterschied zwischen synchronen und asynchronen Nachrichten ist wahrscheinlich Teilthema der Klausur. Objekte, die sich in einem Sequenzdiagramm am oberen Rand befinden, sind zu Beginn des Szenarios schon vorhanden. Objekte, die sich weiter unten befinden werden erst später erstellt.