Aufgabe 06 - Observer selbst gebaut
Aufgabe 06 - Observer selbst gebaut
Abschnitt betitelt „Aufgabe 06 - Observer selbst gebaut“Worum geht es?
Abschnitt betitelt „Worum geht es?“Sie bauen das Muster, das Sie seit der 1. Klasse benutzen, diesmal selbst: einen typisierten Event-Emitter, und setzen ihn in einem Live-Anzeige-Szenario ein. Der Kern ist die Entkopplung - der Sender kennt seine Empfänger nicht, und genau das macht das System erweiterbar (siehe Kapitel Entwurfsmuster II).
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel Entwurfsmuster II (Observer mit An-/Abmeldung, Emit über eine Kopie der Liste).
- Ein TypeScript-Projekt mit Testrunner; Generics aus der 4. Klasse.
- Das Steckbrief-Format der Muster-Sammlung (aus Aufgabe 04).
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie implementieren Subject und Observer mit Registrierung, Abmeldung und Benachrichtigung.
- Sie typisieren Events mit Generics und halten den Sender frei von Wissen über die Empfänger.
- Sie erkennen Observer in Frameworks wieder und benennen die Gefahr nicht abgemeldeter Beobachter.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: den Emitter nach dem Kapitelmuster bauen (Teil A).
- Reorganisation und Transfer: ihn in ein entkoppeltes Szenario einsetzen und erweitern (Teil B).
- Reflexion, Problemlösung und Urteilsbildung: das Muster in Frameworks wiedererkennen und einen typisierten Event-Bus entwerfen (Teile C und D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Teil A - Der Emitter
Abschnitt betitelt „Teil A - Der Emitter“- Klasse
EventEmitter<T>mitsubscribe(listener): () => void(gibt die Abmeldefunktion zurück), der Abmeldung über eben diese Funktion, undemit(event: T). - Tests: mehrere Listener erhalten das Event; abgemeldete nicht mehr; ein werfender Listener darf die anderen nicht verhindern (
try/catchpro Listener - mit einem Kommentar, der begründet, warum).
Teil B - Die Anwendung
Abschnitt betitelt „Teil B - Die Anwendung“Szenario Sporttag-Anzeige: Ein Competition-Objekt meldet Ereignisse (newTime, finish). Drei unabhängige Beobachter: Scoreboard (druckt formatiert), RecordWatcher (meldet nur, wenn eine Zeit den Bestwert unterbietet), Statistics (zählt und mittelt).
- Implementieren Sie das Szenario;
Competitionimportiert keinen der drei Beobachter. - Zeigen Sie die Entkopplung: Ergänzen Sie einen vierten Beobachter (
LiveTicker, schreibt in eine Datei), ohneCompetitionanzufassen. - Zeichnen Sie das UML: ein Klassendiagramm und eine Sequenz für eine einzelne Meldung.
Teil C - Der Bogen
Abschnitt betitelt „Teil C - Der Bogen“Beantworten Sie schriftlich (je zwei bis drei Sätze):
- Wo genau ist
addEventListeneraus der 1. Klasse dieses Muster - wer ist Subject, wer Observer, was ist die Abmeldung? - Warum ist Observer in GUI-Frameworks allgegenwärtig?
- Welche Gefahr entsteht, wenn Beobachter nie abbestellt werden (Stichwort aus der Praxis: Memory Leak)?
Teil D - Expertenteil: Ein typisierter Event-Bus
Abschnitt betitelt „Teil D - Expertenteil: Ein typisierter Event-Bus“- Erweitern Sie den Emitter zu einem Event-Bus mit mehreren Ereignisarten:
on(eventName, listener)undemit(eventName, payload), wobei der Payload-Typ vom Ereignisnamen abhängt (diskriminierte Union oder ein Event-Map-Typ). Der Compiler soll einen falschen Payload zum falschen Ereignis ablehnen. - Weisen Sie die Iterations-Sicherheit nach: Schreiben Sie einen Test, in dem sich ein Listener während einer laufenden
emit-Runde abmeldet, und zeigen Sie, dass die übrigen Listener korrekt bedient werden (Emit über eine Kopie der Liste). - Beurteilen Sie in drei Sätzen: An welcher Stelle Ihres Jahresprojekts wäre ein solcher Event-Bus die richtige Entkopplung - und wo wäre er Overkill gegenüber einem direkten Funktionsaufruf?
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Warum gibt
subscribeeine Abmeldefunktion zurück, statt den Listener zum späteren Entfernen zu verlangen? - Warum iteriert
emitüber eine Kopie der Listener-Liste? - Wer ist beim Observer das Subject und wer der Observer, und in welche Richtung fließt das Wissen (wer kennt wen)?
- Was ist die Kernfrage, an der man Observer von Strategy und Command unterscheidet?
- Wie entsteht durch nicht abgemeldete Beobachter ein Memory Leak?
Git-Repository mit Emitter, Szenario, Tests, UML und den Antworten aus Teil C; der typisierte Event-Bus aus Teil D; der Steckbrief “Observer” für die Muster-Sammlung.