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

06.06.2009, 01:11

[D3D10]Device Kapseln

Ich habe mein ID3D10Device* in meiner Window Klasse gekapselt. Folgendes Problem tritt jetzt auf, wenn ich jetzt eine Shader Klasse schreibe, so brauch die Shader Klasse das ID3D10Device* objekt, um ID3D10Effect* zu initialisieren. Ich will es möglichst vermeiden, das alle möglichen Klassen, die ein ID3D10Device* brauchen diesen im Konstruktor übergeben bekommen. Was fändet ihr schöner, das device global zu machen und dafür die übergabe bei den Konstruktoren zu sparen, oder das device weiterhin gekapselt zu lassen und dafür jeder Klasse, die es benötigt, das Device zu übergeben?

Asmodiel

Treue Seele

Beiträge: 150

Wohnort: Schweiz

Beruf: Applikationsentwickler

  • Private Nachricht senden

2

06.06.2009, 01:18

Global, pfui! Solche Devices sind bei mir normalerweise Singletons. (Wenn unbekannt -> Google)

-> Übergabe an Konstruktoren nicht nötig
-> Global (und damit die Sünde ;)) vermieden
-> Sollte ja eh nur ein Device geben (normalerweise jedenfalls)
Eat a beaver - Save a tree.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

06.06.2009, 11:04

Zitat von »"Asmodiel"«

Global, pfui! Solche Devices sind bei mir normalerweise Singletons.
[...]
-> Global (und damit die Sünde ;)) vermieden
Was war noch gleich der Sinn eines Singletons? Mir dämmert da was vonwegen Objekte global verfügbar machen ;) Singletons sind "nur" eine andere Art das zu verpacken.

Eine schönere Argumentation wäre gewesen, dass man mit Singletons elegantere global verfügbare Objekte bereitstellt, als mit static, extern, namespaces oder sonstigen Methoden die dafür gepriesen werden.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

4

06.06.2009, 11:14

erstell doch mit der window klasse den effekt.

C-/C++-Quelltext

1
windowClass->CreateEffect(&result, .....);

so musste die device nicht übergeben ;)

5

06.06.2009, 11:34

@Asmodiel: Statt dem Singleton könnt ich die Variable gleich global machen.

@BlackSnake: Dann muss ich jedem Objekt, das in einer dieser Factories gebaut wird, das ID3D10Device als pointer übergeben, doch ich wollte, soweit es geht, Direct3D spezifische Strukturen kapseln und es vermeiden mit Direct3D spezifischen Objekten um mich zu werfen.

6

06.06.2009, 13:33

Zitat von »"Das Gurke"«

Zitat von »"Asmodiel"«

Global, pfui! Solche Devices sind bei mir normalerweise Singletons.
[...]
-> Global (und damit die Sünde ;)) vermieden
Was war noch gleich der Sinn eines Singletons? Mir dämmert da was vonwegen Objekte global verfügbar machen ;) Singletons sind "nur" eine andere Art das zu verpacken.
Was war noch gleich der Sinn von Singletons? Einzigartige Objekte?
Ich finde wenns nur um globale Variablen geht, sollte man es nicht mit Singletons verschönern. Ob ich jetzt Device-> oder Device::getInstancePtr()-> schreibe macht keinen Unterschied, wenn keine weiteren Sicherheitsabfragen o.ä. vorgesehen sind.
Getter und Setter sind ja auch dazu da, Sicherheitsabfragen zu ermöglichen und Falscheingaben o.ä. zu überprüfen.

P.S. Wer möchte, darf mich jetzt steinigen. ;)

Asmodiel

Treue Seele

Beiträge: 150

Wohnort: Schweiz

Beruf: Applikationsentwickler

  • Private Nachricht senden

7

06.06.2009, 15:18

Gegenüber globalen Variablen bieten Singletons (meist) einige Vorteile, was ich selbst besonders bei solchen Devices schon merken durfte. Daher mein Vorschlag. Zudem ist die globale Zugänglichkeit lediglich ein netter Nebeneffekt (bez. auf die Parameterübergabe.) Und naja, so etwas hässliches wie globale Variablen verwende ich höchstens bei irgendwelchen winzigen Testprogrammen, ansonsten wurde mir das schon längst auf brutale Art und Weise ausgetrieben. xD Mich dürft ihr jetzt auch steinigen. ;)

@OnSoL: http://c2.com/cgi/wiki?GlobalVariablesAreBad

Darin grad noch entdeckt:

Zitat

Really Bad Reasons to Use Global Variables
"What's a 'local variable'?"
"What's a 'data member'?"
"I'm a slow typist. Globals save me keystrokes."
"I don't want to pass it around all the time."
"I'm not sure in what class this data belongs, so I'll make it global."


Na, passt ja grad wunderbar. ;)
Eat a beaver - Save a tree.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

06.06.2009, 15:49

Zitat von »"Asmodiel"«

Gegenüber globalen Variablen bieten Singletons (meist) einige Vorteile, was ich selbst besonders bei solchen Devices schon merken durfte. Daher mein Vorschlag. Zudem ist die globale Zugänglichkeit lediglich ein netter Nebeneffekt (bez. auf die Parameterübergabe.) Und naja, so etwas hässliches wie globale Variablen verwende ich höchstens bei irgendwelchen winzigen Testprogrammen, ansonsten wurde mir das schon längst auf brutale Art und Weise ausgetrieben. xD Mich dürft ihr jetzt auch steinigen. ;)


Du verwendest statt hässlichen globalen Variablen halt lieber hässliche Singletons, die genauso globalen Objektzugriff ermöglichen und in dieser Hinsicht nicht besser sind als globale Variablen. Die "netten" Nebeneffekte mögen ja, im ein oder anderen Fall ganz angemessen sein, aber im Allgemeinen sollte man mit Singletons genauso vorsichtig umgehen wie mit globalen Variablen, zumal globale Variablen durchaus auch Vorteile gegenüber Singletons haben können: z.B. globale Referenzen.

Asmodiel

Treue Seele

Beiträge: 150

Wohnort: Schweiz

Beruf: Applikationsentwickler

  • Private Nachricht senden

9

06.06.2009, 16:20

Ich sagte ja nicht, dass ich immer und überall Singletons verwende. Für diesen Fall hielt ich das aber für angemessen. Gerade wegen den eigenen Erfahrungen mit Devices. Dort konnte ich die Eigenschaften von Singletons optimal für Erweiterungen nutzen, was ich auch oft tun musste. Da war ich froh, dass ich nicht komplett umdesignen oder irgend ein hässliches Gewurschtel hincoden musste.

Zitat

Du verwendest statt hässlichen globalen Variablen halt lieber hässliche Singletons, die genauso globalen Objektzugriff ermöglichen und in dieser Hinsicht nicht besser sind als globale Variablen.


Ach, komm schon. Der globale Zugriff ist bei weitem nicht das Hässlichste an globalen Variablen.

Zudem... In der Regel ist beim Einsatz von globalen Variablen entweder der Entwickler sehr faul oder es passt etwas mit dem Design nicht so recht. Natürlich gibt es immer Ausnahmen, aber im Allgemeinen bei grösseren Projekten gesehen werden mir da wohl nicht viele widersprechen. Singleton habe ich ihm empfohlen, da ein Device so oder so einzigartig sein sollte. Bei globalen Variablen können trotzdem tonnenweise weitere Devices gemacht werden. Klar, wird er eh nicht machen. Aber wenn, dann doch richtig. Die Nebeneffekte von Singletons passten grad auf seine Wünsche, also wieso nicht?
Eat a beaver - Save a tree.

10

06.06.2009, 17:26

Jedes mal das Device übergeben zu müssen ist nicht wirklich das Gelbe vom Ei. Die Singleton Methode sagt mir mehr zu, doch Singletons sind auch nicht wirklich toll. Langsam muss ich aber auch eine Entscheidung treffen, sonst häng ich wieder jahrelang an einem Designproblem und werd nicht fertig.

Ich würde eine Klasse bauen, die eine Mischung aus "Factory und Singleton" ist, die mir jegliche Pointer auf DirectX devices zurückgibt, jedoch werde ich diese Klasse nicht dem Klient öffentlich machen und nur für Interne Zwecke nutzen. Ist dieser Designansatz einigermaßen "schön"?

Werbeanzeige