Aufgabe 05 - Factory im Einsatz
Aufgabe 05 - Factory im Einsatz
Abschnitt betitelt „Aufgabe 05 - Factory im Einsatz“Worum geht es?
Abschnitt betitelt „Worum geht es?“Sie setzen Factory und Singleton in einem kleinen, realistischen Export-Szenario gezielt ein und erleben den Unterschied zwischen “Muster gelesen” und “Muster gebaut”. Am eigenen Code erfahren Sie, wie eine Factory das Open-Closed-Prinzip stützt und was ein Singleton im Test kostet (siehe Kapitel Entwurfsmuster I).
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel Entwurfsmuster I (Factory, Registry, Singleton, Dependency Injection, Open-Closed).
- Ein TypeScript-Projekt mit Testrunner (vitest); Ihr Vertragstest-Handwerk aus der 3. Klasse.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie implementieren eine Factory mit Interface und Registry und fügen Varianten ohne Änderung am Kern hinzu.
- Sie bauen einen Singleton und weisen seine Testabhängigkeit praktisch nach.
- Sie ersetzen globalen Zustand durch Dependency Injection und begründen die Abwägung.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: die naive
switch-Lösung und ihre Kosten benennen (Teil A). - Reorganisation und Transfer: die Lösung als Factory umbauen und erweitern (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: globalen Zustand auflösen und die Muster-Wahl bewerten (Teil D).
Szenario: Export-Modul
Abschnitt betitelt „Szenario: Export-Modul“Ihre Anwendung soll Berichte in verschiedenen Formaten exportieren: als Text, als CSV, als HTML - und nächste Woche bestimmt auch noch als Markdown.
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Teil A - Ohne Muster (bewusst)
Abschnitt betitelt „Teil A - Ohne Muster (bewusst)“Schreiben Sie die naive Version: eine Funktion exportReport(report, format) mit einem switch über das Format, die Logik inline. Sie funktioniert. Notieren Sie in zwei Sätzen, was beim Hinzufügen des vierten Formats alles angefasst werden muss, und gegen welches SOLID-Prinzip das verstößt.
Teil B - Mit Factory
Abschnitt betitelt „Teil B - Mit Factory“- Interface
Exporter(export(report): string,fileExtension), drei Implementierungen (Text, CSV, HTML). createExporter(format)liefert den passenden Exporter; ein unbekanntes Format ergibt einen aussagekräftigen Fehler (eigene Fehlerklasse).- Tests, parametrisiert über alle Formate (Ihr Vertragstest-Handwerk).
Teil C - Erweitern und der Singleton
Abschnitt betitelt „Teil C - Erweitern und der Singleton“- Ergänzen Sie den Markdown-Exporter ausschließlich mit neuen Zeilen. Zeigen Sie am Diff, dass der Aufrufer und die Factory-Kernlogik unangetastet bleiben.
- Der Export soll zählen, wie oft jedes Format verwendet wurde:
ExportStatisticsals Singleton. - Schreiben Sie zwei Tests, die beide exportieren und die Statistik prüfen. Laufen sie unabhängig, egal in welcher Reihenfolge? Vermutlich nicht - der Singleton-Zustand klebt. Dokumentieren Sie das beobachtete Verhalten.
Teil D - Expertenteil: Registry und Dependency Injection
Abschnitt betitelt „Teil D - Expertenteil: Registry und Dependency Injection“- Bauen Sie die Factory zur Registry um: eine Tabelle, in die sich Exporter eintragen. Ziel ist, dass ein neues Format null Änderungen an der Factory-Funktion braucht - nur eine Registrierungszeile. Weisen Sie das nach, indem Sie ein fünftes Format (etwa JSON) allein durch Registrierung hinzufügen.
- Lösen Sie das Singleton-Problem aus Teil C durch Dependency Injection: Die Statistik wird hereingereicht statt global geholt. Zeigen Sie an denselben zwei Tests, dass sie jetzt in beliebiger Reihenfolge grün sind, weil jeder Test eine frische Instanz bekommt.
- Abwägung in drei bis vier Sätzen: Wann war der Singleton bequem, was hat er im Test gekostet, und woran erkennt man, dass die injizierte Variante die robustere ist?
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Warum stützt eine Factory das Open-Closed-Prinzip?
- Was ist der Vorteil einer Registry gegenüber einem
switchin der Factory? - Warum überlebt der Zustand eines Singletons von einem Test in den nächsten, und warum ist das gefährlich?
- Wie beseitigt Dependency Injection genau dieses Problem?
- Was gewinnt der Aufrufer dadurch, dass er nur das Interface
Exporterund keine konkrete Klasse kennt?
Git-Repository mit beiden Versionen (Teil A als erster Commit, damit die Historie den Weg zeigt), der Registry-Umbau, die injizierte Statistik, alle Tests grün und das Fazit aus Teil D.