Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.08.2011, 17:57

Frage zum Design - Switch Konstrukt oder (eine Art) Strategy Pattern?

Hallo, zur Zeit entwickle ich ein binäres Dateiformat das ich für Leveldateien meines Spiels benutzen möchte. Das schreiben in die Dateien habe ich bereits implementiert aber beim Lesen sind bei mir einige "Design-spezifische" Fragen aufgetreten. Und zwar:

(erst einige Hintergrundinformationen: )

Die Informationen in einer Datei meines Formats sind folgendermaßen geordnet:
[ein byte mit eindeutiger ID der Struktur/Klasse][Informationen die von der neu erstellten Instanz der Struktur/Klasse gelesen werden sollen (viele bytes)]

D.h. wenn z.B. eine ID mit dem wert 16 gelesen wird (welche dem Typ "Tree" zugeordnet ist) soll eine Instanz vom Typ "Tree" erstellt werden. Diese ruft dann eine, von der Basisklasse aller Spielobjekte geerbte, virtuelle, Memberfunktion "__read(FILE* f)" die dann selbstständig alle benötigten Informationen ausliest.

Ich bin mir aber etwas unsicher wie ich die Erkennung des benötigten Typs anhand der ID implementieren soll. Die aller primitivste Variante die mir einfällt ist die Benutzung des Switch-Case Konstruktes, d.h.

C-/C++-Quelltext

1
2
3
GameObject* gobj;
switch (ID){    case 0: gobj = Instantiate(f); break;
case 1: gobj = Instantiate(f); break;    /* Und so weiter... */}



Allerdings finde ich diese Vorgehensweise etwas "unelegant". Was ich mir noch überlegt habe ist die Erstellung einer "Instantiator" Klasse für jeden Typ. Dann wird jew. 1 Instanz von jedem Instantiator-Typ in einen Map Container (mit einem uint8_t als Key) eingefügt. Dann könnte man nach dem Einlesen der ID mit der selbigen die oben erwähnte STL-Map indexieren. Also ungefähr so:

C-/C++-Quelltext

1
2
3
GameObject* gobj;

gobj = Instantiators[ID]->Instantiate(f);


Doch ich frage mich jetzt ob das nicht leicht "overdesigned" ist.

Und nun wollte ich Fragen welche der beiden Methoden eurer Meinung nach besser ist. Und wenn es andere Alternativen gibt, spricht selbstverständlich nichts dagegen diese hier zu äußern :D .

Vielen Dank im Voraus!
mfg
Alex

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

14.08.2011, 18:28

Hi,

die zweite Variante ist auf jeden Fall flexibler. Von der Idee her entspricht das einer "Factory" und ist für das Problem eine gute Lösung.
@D13_Dreinig

3

17.08.2011, 00:32

OK, danke für die schnelle Antwort. Habe die 2te Variante in der Zwischenzeit mal implementiert und habs bis jetzt nicht bereut :) . Danke!

4

17.08.2011, 21:33

Guck dir mal Googles Protocol Buffers an - damit hast du eine elegante Lösung, um effizient binäre Daten zu lesen und zu schreiben, ohne die Kapselung selbst vorzunehmen. Und generisch ists obendrein noch.


MfG
dispy

5

19.08.2011, 21:21

Danke für den Tipp. Ich schaus mir an. :)

Werbeanzeige