Wie wende ich datenorientiertes Design mit objektorientierter Programmierung an? [geschlossen]

17

Ich habe viele Artikel über datenorientiertes Design (Data Oriented Design, DOD) gelesen und verstehe das, aber ich kann ein objektorientiertes Programmiersystem (Object Oriented Programming, OOP) nicht mit DOD im Hinterkopf entwerfen. Ich denke, meine OOP-Ausbildung blockiert mich. Wie soll ich denken, um die zwei zu mischen? Das Ziel ist es, eine schöne OOP-Oberfläche zu haben, während DOD hinter den Kulissen verwendet wird.

Ich habe das auch gesehen, aber nicht viel geholfen: /programming/3872354/how-to-apply-dop-and-keep-a-nice-user-interface

Pombal
quelle
3
Sie müssen etwas viel Spezifischeres (und Spielbezogenes) posten, diese Frage ist viel zu allgemein.
DeadMG
Sie haben Recht, aber ich habe nicht gesehen, dass dies in anderen Bereichen als der Spielprogrammierung diskutiert wird.
Pombal
4
@DeadMG: Ich habe den Begriff datenorientiertes Design, der außerhalb der Spieleentwicklung verwendet wird, nie gesehen, außer wenn er sich auf Praktiken bezieht, die aus der Spieleentwicklung stammen. Wenn Sie an datengesteuertes Design denken, ist das nicht dasselbe.

Antworten:

16

Ich würde sagen, dass der Blog von Noel Llopis wahrscheinlich die beste Anleitung für eine Kombination aus objektorientierter Programmierung und datenorientiertem Design ist. Er ist einer der Begründer des DOD-Begriffs, ein starker C ++ - Programmierer und hat viel über seinen Stil geschrieben und wie er die OO-Funktionen von C ++ nutzt.

Ich denke, wenn ich die Schlüsselelemente der Kombination nennen würde, so Noel:

  • Verwenden Sie so oft wie möglich POD- und Nicht-Mitglieder-Funktionen. Nicht-Mitglieder- und Nicht-Freunde-Funktionen verbessern die Kapselung und sind ein wichtiger Bestandteil der Datenorientierung, da sie die Daten, Daten, enthalten.
  • Vermeiden Sie es, den Status "temporär" auf Ihren Objekten zu speichern. Temporärer Zustand verstopft Ihre Daten. Wenn Sie etwas zwischenspeichern müssen (z. B. für die Leistung), das zu einer neuen Klasse gehört, wobei Nicht-Mitglied-Nicht-Freund-Funktionen die beiden Typen verknüpfen und keine Beziehung besteht.
  • Vermeiden Sie Objekte, die sich in Zustand A oder B befinden können. Wechseln Sie lieber zwischen zwei Objekten, von denen eines A und eines B ist.
  • Vermeiden Sie Polymorphismus, vermeiden virtuelle Funktionen, vermeiden Vorlagen, alles vermeiden , was Ihre Daten haben das macht syntaktischen Aussehen der Gleichheit statt tatsächliche Gleichheit.

Der andere große Name in der DOD-Propaganda ist derzeit Mike Acton von Insomniac, aber wenn ich lese, was er geschrieben hat, würde ich sagen, dass er nicht wirklich pro-OO (oder anti-OO, solange er noch datenorientiert ist) ist.


quelle
Vielen Dank für die Antwort, aber was Sie sagen, ist, was ich tun sollte, um DOD zu verwenden, und nicht, wie ich OO damit verwenden könnte. Ich habe Noels Blog gelesen, Mike Actons Beschimpfungen (: D), DICES Veröffentlichungen unter anderem und ich verstehe, wie man DOD benutzt, nur nicht mit OO gemischt.
Pombal
2
Was denkst du, ist OO? Ich würde zum Beispiel den größten Teil von Noels Code OO nennen - es gibt immer noch Klassen und Instanzen, es gibt immer noch typbasierten Versand, es kann immer noch Vererbung geben (die Definition von POD in C ++ 0x wurde geändert, um dies zu ermöglichen). Man modelliert weiterhin Probleme, die mit Daten beginnen, anstatt mit Operationen.
Zum Beispiel ist Polymorphismus ein bedeutender Teil von OOP, so wie es Objektzustände sind. Das datenorientierte Design sollte so gestaltet sein, dass es Spielelementen Eigenschaften wie Animieren, Interagieren, Bewegen usw. mit Vererbung verleiht. Es hängt alles von einem cleveren Datenmanager ab, der jeder Komponente nur die erforderlichen Entitäten zur Verfügung stellt, z. B. für Physik oder Animation.
Danijar
@sharethis: Wenn ich Ihren Einwand verstehe, ist der Subtyp Polymorphismus ein Schlüsselmerkmal von OO. Ich stimme zu, dass eine Sprache, die behauptet, OO zu sein, ohne Unterstützung dafür, seltsam wäre, aber das bedeutet nicht, dass sie ein Hilfsmittel für die Art von Problemen ist, mit denen man beim Programmieren von Spielen konfrontiert ist, selbst wenn das Spiel in einem OO-Stil programmiert ist . Ich würde auch argumentieren, dass es bei DOD wirklich darum geht, bestimmte Arten von Polymorphismus (nominelle Subtypisierung) zu vermeiden, andere jedoch zu ermutigen (in C ++ Ad-hoc-Polymorphismus mit ADL oder struktureller Polymorphismus durch Garantien über Wertrepräsentationen).