Löst die Mehrfachvererbung nicht alle Probleme, die Entitätssysteme verursachen?

9

Die Frage ist ziemlich selbsterklärend: Löst die Mehrfachvererbung nicht alle Probleme, die auch Entitätssysteme lösen?

Ich habe mich gerade an einen Begriff erinnert, der "Mehrfachvererbung" genannt wird, und der viele Probleme zu lösen scheint, die die klassische Vererbung mit sich gebracht hat.

jcora
quelle
1
Die Mehrfachvererbung ähnelt Entitätssystemen, ist jedoch nicht identisch. Beispielsweise können bei mehreren Vererbungsentitäten zur Laufzeit keine Komponenten hinzugefügt und entfernt werden. Auch unterstützen nicht alle Sprachen die Mehrfachvererbung. Sie können auch davon ausgehen, dass die Komposition in derselben Kategorie wie die Entität / Komponenten liegt.
MichaelHouse
2
Wenn Ihre Klassen bereits so ordentlich sind, dass Sie sie nahtlos nach Belieben zusammen erben können, können sie auch bereits Komponenten sein. Komponenten erlauben auch Komposition / Aggregation zur Laufzeit
Nun, es ist komplexer und weniger fehleranfällig. Warum also lieber?
API-Beast
2
MI geht auch nicht wirklich auf "Aufblähungs" -Probleme ein, da das Erben eines Überschusses an Schnittstelle von einer übergeordneten Klasse oder Klassen eher ein Symptom für die schlechte Verwendung eines Vererbungsmechanismus ist als für die einfache oder mehrfache Vererbung. Das gleiche "Aufblähen" kann auch bei einer kompositionsorientierten Herangehensweise an ein Problem erreicht werden.
@ MrBeast meinst du komplexer / fehleranfälliger, weniger komplex / fehleranfällig oder "warum nicht bevorzugen?"
3Dave

Antworten:

9

Nein, Mehrfachvererbung löst nicht dieselben Probleme wie Entitätssysteme: Entitätssysteme und Mehrfachvererbung sind zwei sehr unterschiedliche Dinge. Sie können ein Entitätssystem mit oder ohne Mehrfachvererbung erstellen und auf ähnliche Weise Mehrfachvererbung verwenden, ohne ein Entitätssystem zu erstellen.

Traditionell werden komponentenorientierte Entitätssysteme entwickelt, um sich von schwerer Vererbung in irgendeiner Form zu entfernen und stattdessen auf Komposition zu zielen . Es gibt an anderer Stelle genügend Literatur und Diskussion zu diesem Sprichwort, zum Beispiel über die Programmierer SE oder SO selbst , und die größere Frage, warum Komposition bevorzugt wird, ist für die Spieleentwicklung eher ein Off-Topic. Kurz gesagt, es handelt sich jedoch um einen Ansatz, der sich tendenziell für eine verbesserte Veränderlichkeit und Wartbarkeit eignet.

Gemeinschaft
quelle
1

Joshs Antwort ist großartig, aber ich möchte hinzufügen:

Eine der coolsten Funktionen von Entity / Component ist die datengesteuerte Art und Weise, wie jedes "Ding" in Ihrem Spiel erstellt und verwaltet wird. Nach dem, was ich gesehen habe, können Sie, sobald Sie eine schöne Bibliothek mit Komponententypen und -systemen erstellt haben, mit minimalen Codemodifikationen so gut wie alles erstellen. (Hinweis: minimal! = 0 )

Indem Sie Ihr Spiel in Bezug auf das Verhalten definieren und sich die Möglichkeit geben, diese Verhaltensweisen im laufenden Betrieb zu ändern - zur Laufzeit, während der Initialisierung, indem Sie sie aus einem Skript oder einer Datenbank usw. laden -, eröffnen Sie eine ganze Welt neuer Möglichkeiten. Möchten Sie sehen, warum Ihre Schatten nicht dort landen, wo Sie es erwarten würden? Fügen Sie Ihrem Licht eine Kamera / POV-Komponente hinzu.

Mit Entity / Component können Sie alles erstellen, was Sie möchten, solange Sie die Blöcke erstellt haben.

Auch die Mehrfachvererbung verursacht das gleiche Problem wie die Einzelvererbung. Wenn Sie der Hierarchie ein Attribut oder Verhalten hinzufügen, wird es weitergegeben. Solange Sie tiefe Hierarchien erstellen, werden Sie auf Situationen stoßen, in denen Sie unnötiges Gewicht haben, Code duplizieren oder Konflikte lösen. Das meiste davon kann vermieden werden, wenn Sie sich Ihr Spiel als Daten vorstellen.

Ich habe gerade in den letzten Wochen angefangen, damit zu spielen, aber ich bin beeindruckt, wie einfach die Dinge geworden sind. Es ist keine Silberkugel - ich bin auf einige Fälle gestoßen, in denen das Anbringen eines Lambda an einer Komponente der sauberste und zweckmäßigste Weg war, um ein Problem zu lösen - aber es ist ein ziemlich gutes Muster, wenn man es so nennen kann.

Ein wenig verwandter Hinweis: Einer der großen, langweiligen Wartungsgeneratoren in datenzentrierten Anwendungen (Websites usw.) ordnet hierarchische Objekte relationalen Datenbanken zu. Wir haben viele raffinierte Lösungen, aber letztendlich sind es alle Hacks, die Hierarchien reduzieren sollen. Anstatt Ihr Modell so zu erstellen, dass es dem Zweck der Anwendung dient, müssen Sie einen Kompromiss zwischen einer effektiven Hierarchie und einer logischen relationalen Darstellung eingehen. Ich habe mit der Idee gespielt, eine ziemlich große Hierarchie in einer meiner Apps als Entitäts- / Komponentensystem neu aufzubauen - die Hierarchie aufzugeben und die Datenbank zum Goldstandard für den Rest der Implementierung zu machen - und sie ist vielversprechend.

Wenn Sie Funktionen wie dynamische Codegenerierung / Code-Caching integrieren, mit denen Leistungsprobleme behoben werden können, erhalten Sie eine schnelle, flexible und logische Architektur, die das wiederverwendbare Codeziel von OOP möglicherweise viel besser verwirklicht.

3Dave
quelle