Zum Inhalt springen

Aufgabe 07 - Strategie und Kommando

Zu Zen-Modus wechseln

Zwei Verhaltensmuster an je einem Szenario: austauschbare Preisregeln (Strategy) und ein Editor mit Undo/Redo (Command). Beide stecken Verhalten in Objekte, aber aus unterschiedlichem Grund - und die scharfe Abgrenzung ist genau die Kompetenz, die das Fachgespräch abfragt (siehe Kapitel Entwurfsmuster II).

  • Kapitel Entwurfsmuster II (Strategy, Command, Kernfragen-Tabelle).
  • Ein TypeScript-Projekt mit Testrunner; die Stack-Datenstruktur aus der 2. Klasse.
  • Das Steckbrief-Format der Muster-Sammlung.
  • Sie kapseln ein Verfahren als austauschbare Strategie und tauschen es zur Laufzeit aus.
  • Sie verdinglichen Aktionen als Command-Objekte mit execute/undo und verwalten sie in einer Historie.
  • Sie grenzen Strategy und Command an ihrer Kernfrage voneinander ab.
  • Reproduktion: die beiden Muster nach dem Kapitel implementieren (Teile A und B).
  • Reorganisation und Transfer: Verhalten zur Laufzeit tauschen und eine Undo-Historie aufbauen (Teile A und B).
  • Reflexion, Problemlösung und Urteilsbildung: die Muster scharf abgrenzen und zu einem Makro-Kommando kombinieren (Teile C und D).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

Ein Kino berechnet Preise nach wechselnden Regeln: Normalpreis, Kinotag (alles 7 €), Gruppenrabatt (ab 5 Tickets -20 %), Schüleraktion (50 % mit Ausweis).

  1. Interface PricingStrategy (calculate(order): number); die vier Regeln als Implementierungen; die Checkout bekommt die Strategie injiziert und kennt keine konkrete Regel.
  2. Skizzieren Sie (nur skizzieren), wie die Checkout mit if/else-Ketten aussähe und was bei jeder neuen Aktion passiert - benennen Sie das verletzte SOLID-Prinzip.
  3. Tests je Strategie plus ein Kassentest mit zur Laufzeit ausgetauschter Strategie (“ab 20:00 gilt Kinotag”).

Ein Editor für die Schulradio-Playlist: Songs hinzufügen, entfernen, verschieben, mit unbegrenztem Undo/Redo.

  1. Interface Command (execute(), undo()); drei Kommandos; eine History mit zwei Stacks (Undo/Redo - hier hat der Stack aus der 2. Klasse seinen großen Auftritt).
  2. Regeln: Eine neue Aktion leert den Redo-Stack (mit begründendem Kommentar); das undo eines Verschiebens stellt die exakte Vorher-Position wieder her.
  3. Tests: eine Sequenz ausführen → zweimal undo → einmal redo → den Zustand exakt prüfen.

Grenzen Sie beide Muster scharf ab (vier bis sechs Sätze): Was parametrisiert Strategy, was verdinglicht Command? Woran erkennen Sie in fremdem Code, welches von beiden vorliegt? Erstellen Sie die Steckbriefe “Strategy” und “Command” für die Muster-Sammlung.

Teil D - Expertenteil: Makro-Kommando und Zusammenspiel

Abschnitt betitelt „Teil D - Expertenteil: Makro-Kommando und Zusammenspiel“
  1. Implementieren Sie ein Makro-Kommando (Composite): ein Kommando, das mehrere Kommandos bündelt und als einen Schritt ausführt und rückgängig macht (das undo nimmt die Teilaktionen in umgekehrter Reihenfolge zurück). Anwendungsfall: “Album einfügen” fügt zehn Songs auf einmal ein, und ein einziges Undo entfernt alle zehn.
  2. Lassen Sie die beiden Muster zusammenspielen: Eine Preisänderung im Editor (Strategie wechseln) wird als undoable Command ausgeführt, sodass auch der Regelwechsel rückgängig gemacht werden kann. Zeigen Sie an einem Test, dass Undo den vorherigen Preis wiederherstellt.
  3. Beurteilen Sie in drei Sätzen: Warum ist das Makro-Kommando selbst wieder ein Command (und kein Sonderfall in der Historie), und welches Prinzip guten Entwurfs zeigt sich daran?
  1. Was ist die Kernfrage, die Strategy beantwortet, und was die, die Command beantwortet?
  2. Warum leert eine neue Aktion den Redo-Stack?
  3. Wieso muss beim Command jede Aktion wissen, wie sie sich selbst umkehrt, und nicht die Historie?
  4. Warum ist ein Makro-Kommando ebenfalls ein Command - und welches Muster steckt in dieser Verschachtelung?
  5. Wann lohnt sich eine Strategie als eigenes Interface gegenüber einer einfach übergebenen Funktion?

Git-Repository mit beiden Teilen, Tests, der Abgrenzung aus Teil C, dem Makro-Kommando und dem Muster-Zusammenspiel aus Teil D sowie den zwei Steckbriefen.