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
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sacaldur« (22.08.2016, 14:28)
Zitat
Statische Konstruktoren gibt es aber in jeder Sprache
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (16.08.2016, 21:47)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Wenn ich zum Beispiel Button/HUD-Texturen lade, die ich permanent und überall brauche, dann will ich die ja nicht mehrfach laden oder mehrere Instanzen haben, wo die immer gleichen Texturen drin liegen. Also gibt es es eine statische Klasse
Treue Seele
EDIT:
Zur Diskussion stimme ich übrigens Dots Debunking voll zu.
Ich hab noch nie ein Singleton gebraucht. Globale Variablen sind auch nicht gut, aber in einigen Fällen (zB. wegen wenig durchdachter Abhänigkeiten in der Softwarearchitektur) eine Lösung (Notlösung).
Singletons hingegen verkomplizieren das nur ohne weiteren Grund.
An den Stellen, wo man einen Logger braucht, jedes mal ein Objekt erstellen, Daten schreiben, Objekt wegwerfen? Das macht den Code ja unheimlich "hübsch".
Was genau soll eine "statische Klasse" sein?
Einfach mal "statische Klasse" googlen. ;-) In C# gibt es statische Klassen. Davon erzeugst du selber keine Instanz, das macht die CLR. Die haben sogar auch statische Konstruktoren, allerdings kann man da nicht beeinflussen, wann dieser aufgerufen wird, weil du genau wie bei der GC nicht weißt, wann die intern instanziiert werden. Aus diesem Grund gibt es bei mir zusätzlich eine Methode, die ich unter Kontrolle habe.
Ich glaube, wir haben uns hier missverstanden. Auch ich bin kein Freund von Singletons und habe auch noch nie einen explizit implementiert. Wir sind hier also absolut auf der gleichen Seite. Mein Beispiel sollte veranschaulichen, dass C# mit den statischen Klassen eine nette Alternative zu globalen Variablen bereitstellt, da man diese schön strukturieren und auch schachteln kann. Dadurch bekomme ich dann die Möglichkeit des Zugriffs über z.B.
Textures.HUD.ButtonXY
Textures.Icons.Multiplayer
etc. Der Vorteil davon ist eben, dass man die ganzen geschachtelten Elemente nicht alle einzeln instantiieren braucht, da das die Runtime tut. Das ist aber eben auch gleichzeitig der größte Nachteil, da man nicht unter Kontrolle hat, wann die Klasse instantiiert wird.
Ich stimme dem allgemein zu, allerdings gibt es schon ein paar Fälle, wo man etwas an sehr vielen Stellen braucht, ob man das nun als static, singleton oder globale Variable braucht, ohne dass es ein Architektur No-Go ist.
Da Frage ich mich: wie implementiert ihr dann einen allgemeinen Logger für eine komplexe Anwendung/Spiel? Und ich meine jetzt nicht so einen popeligen File-Logger, sondern bitte einen der Kategorien, Logging in mehreren Dateien nach Kategorien und einer kummulierten Datei, asynchrones schreiben usw. unterstützt. An den Stellen, wo man einen Logger braucht, jedes mal ein Objekt erstellen, Daten schreiben, Objekt wegwerfen? Das macht den Code ja unheimlich "hübsch".
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (18.08.2016, 11:10)
Treue Seele
Ich weiß schon, dass es in C# statische Klassen gibt, das war eher eine rhetorische Frage. Die gibt es dort halt imo nur als Krücke, weil man aus irgendeinem Grund keine freien Funktionen einbauen wollte. Wann etwas instanziert wird, weißt du übrigens auch mit GC; was du nicht weißt, ist wann etwas zerstört wird...
Öffentliche, statische Variablen sind Objekte, die von jedem Punkt im Programm aus erreichbar sind. Damit handelt es sich dabei nicht um eine Alternative zu globalen Variablen, sondern um nichts Anderes als globale Variablen...
Durch die statischen Klassen kannst du eben zusätzlich noch eine Schachtelung/Strukturierung erhalten, die ich zumindest als angenehmer empfinde, als "echte" globale Variablen, die ich erst manuell mit Instanzen irgendwelcher anderer Klassen, die irgendwelche Eigenschaften haben, initialisieren müsste.
Wie würde eine "echte" globale Variable in C# deiner Meinung nach denn aussehen und was genau können die nicht, was deine statischen Variablen können? Auf Beispiele bin ich gespannt...
Werbeanzeige