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

Noctarius

Treue Seele

Beiträge: 120

Wohnort: Düsseldorf

Beruf: Manager of Developer Relations at Hazelcast, Inc. & Consultant for Scaleable Gameserver Systems

  • Private Nachricht senden

11

24.02.2013, 10:12

Dein Konzept spricht jetzt aber nicht direkt gegen Singletons. Du schreibst die Klassen sollen testbar sein. Ein Singleton kann man natürlich auch testen. Es verändert ein Objekt ja jetzt nicht so, dass es nicht mehr testbar ist. Da verstehe ich den Zusammenhang nicht ganz. Und auch für den Editor. Wenn das ganze über ein Singleton implementiert wäre, könnte man es dennoch austauschen. Das Singleton sagt ja erst mal nur, dass das Objekt nur ein mal da ist. Es sagt aber nicht, dass ein Singleton kein Interface implementieren kann, welches auch von einer anderen Klasse implementiert wird. Du kannst ein Singleton global beziehen, musst dies aber nicht tun. Von daher ist das eher wieder ein Punkt der gegen globale Variablen spricht, was hier ja am Ende mit reinkommt.
Naja ein Singleton ist nur bedingt testbar, da es über mehrere Tests seinen internen State behält, genau das ist ja der Sinn - nur genau eine Instanz. Wenn man nun Test-Mapdaten in so etwas läd, müsste man immer eine Art Reset- / Clear-Methode bauen um ihn sauber neu zu initialisieren. Wir verwenden in unseren Gameservern (leider) sowohl Singletons, als auch rein statische Klassen. Wenn man die Tests in Random-Reihenfolge ausführen lässt gibt es Kombinationen in denen die Tests laufen und manchmal geht es einfach nicht, weil irgendwer nicht daran gedacht hat, dass eben "reinitialisiert" werden muss.
Wenn man nur sauber testbare Klassen nutzt kann so etwas nicht passieren, da der Test niemals laufen wird ohne eine saubere Umgebung zu initialisieren.

Wenn man "Singletons" benötigt sollte man Dependency Injection Frameworks einsetzen (die für C++ sind leider nicht ganz so hübsch), denn das Problem ansich ist nicht der Wunsch nach einer Klasse mit genau einer Instanz, sondern das Singleton-Pattern (nach Gang-Of-Four) selber. Bei DI kümmert sich der Container darum, dass du innerhalb dieses Containers immer die selbe Instanz bekommst, ein paralleler DI-Container kann aber eine andere Instanz besitzen (wenn man z.B. Tests parallel starten lässt). Der Effekt für die Anwendung ist der Selbe, die Implementierung aber sauber und jederzeit testbar (und bringt Modularisierung und Dynamik in die Anwendung).

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

12

02.03.2013, 15:19

Habe es jetzt so gelöst, dass der Manager jetzt über den StateManager zum GameState übergeben wird. Bei dieser Gelegenheit habe ich auch noch ein paar andere Sachen mitübergeben. Lustig wird's dann, wenn ich noch mehr Manager brauch :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

02.03.2013, 20:18

Dann kannst du diese ja in einer Struct oder Class zusammenfassen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

14

02.03.2013, 22:57

Ja, das ist mir auch aufgefallen, aber nachdem ich diesen post geschrieben habe :D
Ich werde das so umsetzen, wenn ich wieder einen Manager brauch.

15

03.03.2013, 00:13

Verstehe ich das richtig, dass du den Waffenlader an den StateManager übergibst, der dann den Waffenlader an die GameStates weiterreicht?
Warum nicht den Waffenlader an den GameState übergeben und DANN den GameState an den StateManager. So übergibst du alles nur da, wo du es auch brauchst.

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

16

03.03.2013, 18:14

Das liegt daran, dass der GameState im StateManager initialisiert wird.

17

03.03.2013, 20:19

Dann initialisier ihn doch außerhalb und füg ihn später hinzu ;)

https://www.youtube.com/watch?v=RlfLCWKxHJ0

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

03.03.2013, 20:23

Nun, es kann in seiner Architektur durchaus Sinn machen, dass nur der StateManager die States kennt und nicht irgendjemand anderes.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

19

03.03.2013, 20:27

Mag sein, aber zählt nicht auch das gleich Argument für den StateManager, der jetzt weiß, das der GameState einen WeaponManager braucht?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

03.03.2013, 20:30

Wenn er den GameState erzeugen muss, muss er wohl auch die Parameter kennen. Aber der Besitzer des StateManagers muss nicht wissen, welche States es gibt. Das ist ein ganz anderer Bekanntschaftsgrad.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige