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

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

11

30.11.2012, 20:49

@NachoMan:

Vielleicht erzählst du Müll? Der Post hat auf jeden Fall bereits geholfen. :thumbsup:

Wieso erzähle ich, dass Init-Methoden sinnvoll sind?
Ich gebe Wissen wieder von anderen Menschen den ich aufgrund ihrer bereits realisierten Projekte ( in diesem Fall Thief, Ultima und Sims ) vertrauen schenke. Deshalb habe ich es auch bis jetzt so wie McShaffry gehandhabt.

Da ihr aber gebündelt andere Meinung seid, ich es nicht besser weiß, bitte ich um Bespiele und mehr Infos. Danke!

PS: Warum sollen globale Zeiger so bescheiden sein? Mir ist klar, dass man sie sparsam benutzen muss, aber einen globalen Zeiger zur Game Logic kann ich doch haben!?

lg René
Liebe Grüße,
René

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

30.11.2012, 20:54

Da ihr aber gebündelt andere Meinung seid, ich es nicht besser weiß, bitte ich um Bespiele und mehr Infos. Danke!

Nun, ich versuche dir, diese Info zu geben, aber dazu müsstest du mal auf meine Antworten eingehen... ;)


PS: Warum sollen globale Zeiger so bescheiden sein? Mir ist klar, dass man sie sparsam benutzen muss, aber einen globalen Zeiger zur Game Logic kann ich doch haben!?

Globale Zeiger haben die gleichen Probleme wie aller globaler Zustand. Ein paar Dinge die mir schnell mal so in den Sinn kommen:
  • Verschleierung von Abhängigkeiten (Dealbreaker!)
  • Potential für völlig undurchsichtiges Verhalten.
  • Thread Safety
  • Verpesten den globalen Namesraum.
  • Die Wiederverwendbarkeit von Code, der von globalen Variablen abhängt, geht gegen 0.
  • Problematisch in automatischen Tests

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (30.11.2012, 21:07)


Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

13

30.11.2012, 21:07

Weil er C++ nicht verstanden hat!?

Das kann ich nicht beurteilen.
Da kann ich nur zustimmen. Ich seh aber nicht, was du mir damit sagen willst bzw. wieso Konstrukturen dabei ein Problem darstellen würden.

Ich kann mir vorstellen, das man vielleicht bereits das Objekt "Devices" erzeugen möchte, aber zu dem Zeitpunkt noch nicht weiß, welche Inputdevices der Benutzer überhaupt besitzt. So wäre es mir doch möglich, erst den Controller zu initialisieren, wenn der Spieler ihn auswählt?
Ok, ich versteh aber leider nicht, inwiefern Konstrukturen diesem Ziel im Wege sein sollen.

Das habe ich bereits versucht zu erklären. Was ist wenn ich versuche mit eigenserstellten DialogBoxen Fehler abzufangen, aber das FontSystem korrumpiert ist aufgrund von kaputter Fontdatein? Sollte ich hier nicht versuchen das ganze mit einer Init-Methode sicherzustellen?

Das stimmt nur bedingt. Die Initialisierungsreihenfolge globaler Objekte in der selben Übersetzungseinheit (im selben .cpp File) ist wohldefiniert. Modulübergreifend kann man Funktionen benutzen, die eine Referenz auf eine lokale statische Variable returnen um dieses Problem elegant zu lösen. Sofern man bei derlei Konstrukten überhaupt von "elegant" sprechen kann...

McShaffry sagt aber, dass es nicht wohldefiniert ist. Hast du 'ne Quelle? Dein Beispiel klingt nach Singleton?


Was hat das eine mit dem anderen zu tun?

HRESULT als Rückgabewert zur Analyse ob die Funktion korrekt ausgeführt wurde?

lg René
Liebe Grüße,
René

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

30.11.2012, 21:15

Was hälst du von globalen Zeigern?
McShaffry führt auch dann recht schnell auf, dass globale Zeiger besser sind als globale Variablen

Globale Zeiger sind auch globale Variablen. Globale Variablen sind Mist, weil unsauber und schlampig. Das ist so. Ob nun statisch oder dynamisch allokiert, das ändert am Problem nichts.

Wieso erzähle ich, dass Init-Methoden sinnvoll sind?

Gute Frage. Vermutlich weil Du ein schlechtes Buch gelesen hast, in welchem die Autoren noch nicht von Exceptions gehört haben und sich fröhlich an C klammern statt an C++. Die Verwendung von Fehlercodes zeigt das sehr sehr deutlich.
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

15

30.11.2012, 21:15

Sorry, für den angeschlagenen Ton. Allerdings kann ich es einfach nicht ertragen, wenn jemand zwei offensichtlich wesentlich besser informierten Programmierern widerspricht und jemanden eine völlig falsche/veraltete Empfehlung gibt.

Du hast ein Buch gelesen, das von alten Hasen geschrieben wurde. Globale Variablen können funktionieren, verursachen aber Probleme(wovon dot ja schon einige aufgezählt hat).

Ich habe in C++, seitdem ich angefangen habe zu lernen, höchstens in winzigen Testprogrammen globale Variablen genutzt. Und ich entwickel seit ca. einem Jahr Multiplayergames und in dem Bereicht würden mir globale Variablen so vielArbeit machen, dass ich mit ihnen ein vielfaches der Zeit benötigen würde. Code den ich die 4 Jahre zuvor geschrieben habe könnte ich nicht wieder verwenden, wenn ich globale Variablen genutzt hätte.

Durch den absoluten Verzicht auf globale Variablen hatte ich in kürzester Zeit ein Lokalisierungssystem, eine SQLite Datenbank, ein Chatsystem und vieles mehr in meinem aktuellen Projekt.

Wer globale Variablen jeglicher Art nutzt, spart im ersten Moment vielleicht ein wenig Zeit. Auf langer Sicht kostet jede globale Variable aber ein vielfaches der Zeit.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

16

30.11.2012, 21:19

Alles was einen Fehler erzeugen kann, gehört in eine Init-Methode. Warum? Weil der Konstruktor trotzdem ausgeführt wird und kein Rückgabewert besitzt. Was gibt es schlimmeres als gar kein Objekt im Speicher? Genau! Ein beschädigtes Objekt im Speicher das nicht funktioniert.
Es wurde schon einiges geschrieben, aber ich kann dazu nur (auch) sagen: In so einem Fall schmeißt man eine Exception. Das einzige Problem was dann bleibt, ist dass Exception performancetechnisch aufwendig sein kann. Aber eine Exception sollte, wie der Name schon sagt, im Normalfall gar nicht auftreten. Sauberer als eine Init-Methode mit Rückgabewert ist so ein Vorgehen auf jeden Fall.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

30.11.2012, 21:22

Weil er C++ nicht verstanden hat!?

Das kann ich nicht beurteilen.
Da kann ich nur zustimmen. Ich seh aber nicht, was du mir damit sagen willst bzw. wieso Konstrukturen dabei ein Problem darstellen würden.

Ich kann mir vorstellen, das man vielleicht bereits das Objekt "Devices" erzeugen möchte, aber zu dem Zeitpunkt noch nicht weiß, welche Inputdevices der Benutzer überhaupt besitzt. So wäre es mir doch möglich, erst den Controller zu initialisieren, wenn der Spieler ihn auswählt?

Mit anderen Worten: Ich erzeuge das Controller Objekt erst, wenn der Spieler ihn auswählt. Ich seh grad keinen Grund für eine Init Methode...

Ok, ich versteh aber leider nicht, inwiefern Konstrukturen diesem Ziel im Wege sein sollen.

Das habe ich bereits versucht zu erklären. Was ist wenn ich versuche mit eigenserstellten DialogBoxen Fehler abzufangen, aber das FontSystem korrumpiert ist aufgrund von kaputter Fontdatein? Sollte ich hier nicht versuchen das ganze mit einer Init-Methode sicherzustellen?

Wieso kann nicht einfach der Konstruktor des FontSystems eine Exception werfen? Dann würde das FontSystem Objekt gar nicht erst erzeugt werden...

Das stimmt nur bedingt. Die Initialisierungsreihenfolge globaler Objekte in der selben Übersetzungseinheit (im selben .cpp File) ist wohldefiniert. Modulübergreifend kann man Funktionen benutzen, die eine Referenz auf eine lokale statische Variable returnen um dieses Problem elegant zu lösen. Sofern man bei derlei Konstrukten überhaupt von "elegant" sprechen kann...

McShaffry sagt aber, dass es nicht wohldefiniert ist. Hast du 'ne Quelle?]

Natürlich:

Zitat von »ISO/IEC 14882:2011 §3.6.2/2«

Other non-local variables with static storage duration have ordered initialization. Variables with ordered initialization defined within a single translation unit shall be initialized in the order of their definitions in the translation unit.


Dein Beispiel klingt nach Singleton?

Gut erkannt, die übliche Implementierung des Singleton Pattern (Meyers Singleton) bedient sich genau der selben Methode. Das heißt aber nicht, dass ich hier von einem Singleton spreche; ich würde niemals so weit gehen, jemandem zu einem Singleton zu raten.

Was hat das eine mit dem anderen zu tun?

HRESULT als Rückgabewert zur Analyse ob die Funktion korrekt ausgeführt wurde?

Exceptions? ;)

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (30.11.2012, 21:45) aus folgendem Grund: Typo ;)


Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

18

30.11.2012, 21:24

@NachoMan:

Das klingt schon viel besser und eine ganze Spur un-provokanter.

Woher kann ich denn bitte offensichtlich wissen, das hinter Synonymen wesentlich besser informierte Programmierer sitzen, wenn man nicht darüber diskutiert?

Dann ist es wohl so, dass ich eine veraltete Technik gelesen / gelernt habe. Ich habe nie C gelernt oder mir großartig angesehen und bin mir manchmal nicht im Klaren, wenn ältere Programmierer solche Relikte mit in C++ bringen - da sie zu meist auch sehr glaubhaft klingen. Ich finde es gut das wir hier diskutieren und fände es noch besser, wenn man nicht gleich bei anderen Betrachtungsweisen an die Decke geht. Ich habe mich damit beschäftigt, aber woher soll ich es in meiner Unwissenheit besser wissen, als im ersten Moment einem Buch zu trauen?

Ich bedanke mich für die Infos und möchte an dieser Stelle auch gerne aufhören, da ich denke es geblickt zu haben.

lg René
Liebe Grüße,
René

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

30.11.2012, 21:29

Schau dir einfach mal Exceptions an, die werden dein Leben verändern... ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

30.11.2012, 21:30

Gern geschehen. Und freut mich zu sehen, dass Du es scheinbar sogar anerkennst. :)
Dass Bücher mit solch merkwürdigem Zeug kommen ist doch sehr häufig. Schade und traurig. Gerade wenn sie Anfängern etwas beibringen, was schon seit 20 Jahren keiner mehr machen sollte.
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