CommunityCodierung & Entwicklunggithub.com

Komposition vor Vererbung

Bietet eine strukturierte Entscheidungsfindung und Migrationsstrategie für die Wahl zwischen Komposition, ADT und Vererbung in der Softwareentwicklung.

Was ist Komposition vor Vererbung?

Diese Fähigkeit bietet einen umfassenden Leitfaden für Entwickler, um die architektonische Entscheidung zwischen Komposition, Algebraischen Datentypen (ADTs) und Vererbung zu treffen. Sie ist plattformunabhängig und richtet sich an Entwicklerteams, die ihre Codebasis warten und weiterentwickeln. Der Leitfaden enthält eine schrittweise Vorgehensweise zur Bewertung des aktuellen Modells, zur Auswahl des geeigneten Mechanismus (standardmäßig Komposition), zum Entwurf der Zielstruktur, zur inkrementellen Migration und zur Validierung durch Checklisten und CI-Metriken. Er definiert nicht verhandelbare Standards, wie die Bevorzugung von Komposition und die Vermeidung von Vererbung nur zur Wiederverwendung von Code. Die Fähigkeit behandelt auch Randfälle wie framework-erzwungene Vererbung und leistungskritische Pfade. Ein konkretes Beispiel zeigt die Anwendung auf eine `BaseReport`-Hierarchie mit 12 Unterklassen, bei der eine Umstellung auf Komposition (Strategy + optional Decorator) empfohlen wird.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add msewell/agent-stuff

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Komposition vor Vererbung anwenden

Schnellstart

  1. Die Variationsachse identifizieren: Datenvariante, Algorithmus, querschnittliches Verhalten oder Framework-Einschränkung.
  2. Standardmäßig Komposition verwenden, es sei denn, Vererbung ist durch Substituierbarkeit und Stabilität explizit gerechtfertigt.
  3. Wenn die Variantenmenge geschlossen und datenförmig ist, einem ADT/versiegelten Typ gegenüber offener Vererbung den Vorzug geben.
  4. Einen konkreten Migrationsplan mit Tests, Rollout-Reihenfolge und Überprüfungspunkten erstellen.

Referenznavigation (gestaffelte Offenlegung)

Nur die für die aktuelle Aufgabe benötigte Datei lesen:

Standard-Workflow

  1. Aktuelles Modell bewerten

    • Basisklassen, Anzahl der Unterklassen, Hierarchietiefe und bekannte Problemstellen auflisten.
    • Jede Variation als Datenvariante, Verhaltensstrategie oder Infrastrukturbelang markieren.
  2. Mechanismus wählen (Standard zuerst)

    • Komposition wählen für Verhaltensvariation, Austausch zur Laufzeit oder Änderung auf mehreren Achsen.
    • ADT/versiegelten Typ wählen für geschlossene, datentragende Varianten, die eine erschöpfende Behandlung erfordern.
    • Vererbung nur wählen, wenn alle Bedingungen zutreffen: echte Ist-ein-Beziehung, Liskov-konforme Substituierbarkeit und stabile Hierarchie.
  3. Zielstruktur entwerfen

    • Minimale Kollaborateur-Verträge definieren; Schnittstellen/Protokolle einführen, wo Flüchtigkeit, mehrere Implementierungen oder unabhängige Tests dies rechtfertigen.
    • Konstruktorinjektion für erforderliche Kollaborateure verwenden.
    • Vererbungstiefe flach halten (Ziel ≤2 unter unvermeidlichen Framework-Basen).
  4. Migration inkrementell planen

    • Zuerst Charakterisierungstests hinzufügen.
    • Eine Nahtstelle (Schnittstelle/Fassade) einführen, bevor interne Teile ersetzt werden.
    • Jeweils einen Unterklassenpfad migrieren.
    • Tote Hierarchieteile erst entfernen, wenn Paritätstests bestanden sind.
  5. Validieren und absichern

    • Checklisten-gesteuertes Review durchführen.
    • CI-Metriken/Prüfungen für DIT, Überschreibungsverhältnis und Dekorierertiefe hinzufügen.
    • Explizite Ausnahmen für framework-erforderte Vererbung festhalten.

Nicht verhandelbare Standards

  • Standardmäßig Komposition bevorzugen.
  • Vererbung nicht nur zur Wiederverwendung von Code einführen.
  • Kollaborateur-Schnittstellen schmal halten.
  • Service-Locator-Muster vermeiden; Abhängigkeiten müssen explizit sein.
  • Tiefe Dekoriererstapel (>3) und breite Vererbungsbäume als Design-Gerüche behandeln.

Ausgabe-Vertrag

Wenn um Beratung gebeten wird, diese Abschnitte in der angegebenen Reihenfolge zurückgeben:

  1. Entscheidung: Komposition, ADT oder Vererbung.
  2. Warum: Kopplung, Änderungsachse, Laufzeitanforderungen und Auswirkungen auf die Testbarkeit.
  3. Entwurfsskizze: Ziel-Schnittstellen/-Typen und Kompositionswurzel.
  4. Migrationsschritte: Kleine umkehrbare Schritte mit Validierungspunkten.
  5. Review-/CI-Prüfungen: Checklistenpunkte und messbare Schwellwerte.

Randfälle

  • Framework-erzwungene Vererbung: Vererbung an der Grenze belassen; intern komponieren.
  • Sprache fehlt Delegationssyntaktik: Kleine Hilfsgeneratoren/Vorlagen für die Weiterleitung verwenden.
  • Leistungskritische Pfade: Dispatch-Overhead messen, bevor Indirektion hinzugefügt wird.
  • Winzige stabile Domänen: Versiegelte Vererbung kann akzeptabel sein, wenn Erschöpfung erforderlich ist.

Beispiel

Eingabe: „Wir haben BaseReport mit 12 Unterklassen und jedes neue Format fügt eine weitere Unterklasse hinzu. Was sollen wir tun?“

Ausgabe (Form):

  • Entscheidung: Hierarchie durch Komposition ersetzen (Strategy + optional Decorator).
  • Begründung: Mehrdimensionale Variation und überschreibungsintensive Unterklassen deuten auf Taxonomie-Drift hin.
  • Entwurfsskizze: ReportRenderer, HeaderPolicy, FooterPolicy, OutputFormatter-Schnittstellen, komponiert in einem ReportService.
  • Migration: Charakterisierungstests → Strategy-Extraktion → Migration pro Unterklasse → Löschen der Unterklassen.
  • Absicherungen: DIT-Warnung >3, Überschreibungsverhältnis-Warnung >0.5, Dekorierertiefe-Warnung >3.

Verwandte Skills