Zum Inhalt springen

Aufgabe 11 - Komposition statt Vererbung

Zu Zen-Modus wechseln

In Aufgabe 10 ist der Paladin an der Vererbung gescheitert. Jetzt bauen Sie die Alternative wirklich: Fähigkeiten als eigene Objekte, die eine Figur hat statt ist (siehe Kapitel Vererbung, Abschnitt “ist-ein oder hat-ein”). Am Ende vergleichen Sie beide Entwürfe systematisch und leiten eigene Faustregeln ab. Die Wahl zwischen Vererbung und Komposition gehört zu den häufigsten Entwurfsentscheidungen der Objektorientierung; wer beide Seiten einmal selbst gebaut hat, entscheidet später begründet statt aus Gewohnheit.

  • Kapitel Vererbung; Aufgabe 10 samt Ihrer Arena.
  • Python, VS Code.
  • Sie setzen Komposition um: Verhalten entsteht aus zusammengesteckten Objekten.
  • Sie lösen dieselbe Anforderung mit zwei Entwurfsmustern und vergleichen die Ergebnisse.
  • Sie formulieren belastbare Kriterien für die Wahl zwischen Vererbung und Komposition.
  • Reproduktion: das Kompositionsmuster nach Vorlage umsetzen (Teil A).
  • Reorganisation und Transfer: die Arena auf den neuen Entwurf umbauen und den Problemfall lösen (Teile B und C).
  • Reflexion, Problemlösung und Urteilsbildung: beide Entwürfe vergleichen, bewerten und Entwurfsregeln ableiten (Teil D).

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

  1. Definieren Sie Ability mit name und der Methode use(actor, target). Implementieren Sie drei konkrete Fähigkeiten als Subklassen: SwordStrike (Schaden in Höhe der Stärke des Anwenders), Fireball (kostet 10 Mana, doppelter Schaden; ohne Mana passiert nichts außer einer Meldung), Healing (+20 Punkte beim Ziel, Obergrenze 100).
  2. Testen Sie jede Fähigkeit einzeln an zwei einfachen Figuren, bevor Sie weiterbauen.
  1. Bauen Sie Character um: keine Subklassen für Figurentypen mehr. Jede Figur hat name, health, strength, mana und eine Liste abilities, dazu use_ability(index, target) und take_damage(points).
  2. Erzeugen Sie mit dieser einen Klasse einen Ritter (nur SwordStrike), einen Magier (SwordStrike und Fireball) und einen Heiler (SwordStrike und Healing). Halten Sie fest: Wie viele Klassen brauchte Aufgabe 10 für dieselben drei Figuren, wie viele brauchen Sie jetzt?
  3. Portieren Sie Ihre Arena-Kampfschleife aus Aufgabe 10 auf den neuen Entwurf. Sie sollte fast unverändert übernehmbar sein; notieren Sie, was Sie anpassen mussten.
  1. Erzeugen Sie den Paladin: SwordStrike und Healing in der Fähigkeitenliste. Zählen Sie die dafür nötigen neuen Codezeilen und vergleichen Sie mit Ihrer Analyse aus Aufgabe 10 Teil D.
  2. Demonstrieren Sie eine Änderung zur Laufzeit: Ein Magier findet im Kampf einen Trank und lernt Healing dazu (abilities.append(...)). Erklären Sie in zwei Sätzen, warum das im Vererbungsentwurf strukturell unmöglich war (die Klasse eines Objekts steht fest).
  3. Lassen Sie den Paladin in einem Demo-Kampf 2 gegen 2 mitkämpfen.

Teil D - Expertenteil: Das Urteil und die Grenze der Komposition

Abschnitt betitelt „Teil D - Expertenteil: Das Urteil und die Grenze der Komposition“
  1. Vergleichen Sie beide Arena-Versionen in einer Tabelle: Anzahl der Klassen, Aufwand für eine neue Figurenart, Aufwand für eine neue Fähigkeit, Möglichkeit von Laufzeitänderungen, Lesbarkeit der Figurendefinition.
  2. Entwerfen Sie eine Fähigkeit mit eigenem Zustand: PowerStrike darf nur jede dritte Runde eingesetzt werden (Abklingzeit als Attribut der Fähigkeit, nicht der Figur). Implementieren Sie sie und erklären Sie, warum dieser Zustand in der Fähigkeitsklasse gut aufgehoben ist.
  3. Auch Komposition hat Grenzen. Die Rüstung des Ritters (halber Schaden, aus Aufgabe 10) ist keine einsetzbare Fähigkeit, sondern verändert take_damage. Diskutieren Sie in drei bis fünf Sätzen, wie Sie Rüstung im Kompositionsentwurf abbilden würden (Vorschläge: ein armor-Attribut; eine Liste passiver Modifikatoren, die take_damage durchläuft) und welche Variante Sie warum wählen.
  4. Formulieren Sie zwei Faustregeln für Ihre künftigen Entwürfe: In welchen Situationen greifen Sie zu Vererbung, in welchen zu Komposition? Stützen Sie jede Regel auf eine konkrete Beobachtung aus den Aufgaben 10 und 11.
  1. Was bedeutet “hat-ein” gegenüber “ist-ein”, und wie sieht der Unterschied im Code aus?
  2. Wie viele Subklassen erspart die Komposition bei vier frei kombinierbaren Fähigkeiten? Rechnen Sie kurz vor.
  3. Warum kann eine Figur zur Laufzeit Fähigkeiten dazulernen, aber nicht die Klasse wechseln?
  4. Ability mit den Subklassen SwordStrike, Fireball, Healing: Hier steckt weiterhin Vererbung im Entwurf. Wofür ist sie an dieser Stelle zuständig, und warum ist das kein Widerspruch zur Übungsidee?
  5. Nennen Sie Ihre zwei Faustregeln aus Teil D auswendig.

arena_composition.py mit Demo-Kampf (der Paladin kämpft mit), die Vergleichstabelle und die Diskussionen aus Teil D.