Klassen nur 1x initialisieren
-
Ich denke im Moment über sowas nach und meine das irgendwo schon mal gesehen zu haben... Wie würde man sowas angehen? Im Grunde soll einfach verhindert werden, dass die Klasse mehrfach aufgerufen wird zwecks Performanceschonung.
Ich würde ja hingehen und eine statische Variable einführen, die beim Konstruktor aufgerufen wird... Aber da könnte man ja genauso gut hingehen und alle Methoden als statisch deklarieren.
Was wäre die bessere Methode? Die Initialisierung eines Objektes abzubrechen geht ja kaum... Und in jeder Methode den Status der Variable prüfen ist auch Schwachsinn. Da fände ich es sinnvoller Namespaces oder statische Funktionen zu verwenden.
Eure Meinung ist gefragt.
Gruß,
DarkDragon1993
-
-
Darf ich dich um ein wenig Kontext bitten? Deine Ausführungen machen nämlich nicht viel Sinn. Meinst du vielleicht ein Builder pattern? Oder einen Object pool?
Da ich aber auch schon länger in diesem Forum lese und daher weiß, wie Leute denken, die solche Fragen stellen: Gib mal ein konkretes Beispiel. Wenn du in die Schublade mit den oben genannten Leuten passt, dann hast du nämlich falsche Vorstellungen, was überhaupt Zeit kostet und was nicht.
-
Oh, Singletons... Da könnte ich das auch schon mal her haben. Danke für den Link.

Ein Beispiel...? Konkret habe ich eigentlich keines, bastele momentan daran in der Theorie während ich nichts zu tun habe.
Zum Kontext: Dieses ganze Projekt mag JETZT vielleicht noch nicht viel Performance kosten. Doch später hinaus wird das sehr wohl sinnvoll sein, da es eigentlich eine Übung in Sachen Spiel-Engine-Programmierung ist. Sprich einfachste Aufgaben müssen so schnell wie möglich erledigt werden und in der ganzen Angelegenheit ist es einfach unnötig zur selben Zeit eine 2. Engine zu initialisieren.Fragt sich nur noch, warum ich das unbedingt verhindern möchte... Ich werde ja wohl kaum so blöd sein und meine eigene Engine in meinem eigenen Code 2x initialisieren. xD
Zur Info: Die Übung wurde mir von jemand anderem gegeben. Es soll nichtmal grafisch ausgelegt sein, einfach nur ein Text basiertes Spiel.Und, passe ich noch immer in die selbe Schublade mit "oben" genannten? ;P
Gruß,
DarkDragon1993
-
DarkDragon1993 schrieb:
Und, passe ich noch immer in die selbe Schublade mit "oben" genannten? ;P
Ja. Wie die Faust auf's Auge.
-
Grundsätzlich:
1. Schreib sauberen Code, der das gewünschte Ziel erfüllt.
2. Wenn dieser zu langsam ist: Messe nach (Profiler) wo das Problem ist.
3. Optimiere nur die Stellen, die sich auch beim messen als Performancebremse heraus stellen.Und Punkt 3 heißt nicht zwangsweise das man Code massiv an der Stelle ändert, es kann auch einfach der Austausch eines Containertyps sein, oder das überarbeiten eines Algorithmus.
Zudem: Ob man Klassen nur 1x initialisiert oder nicht, hat nichts mit der Performance zu tun, sondern eher mit der Aufgabe der Klasse. Normalerweise ist eine Klasse mit nur einer Datenhaltung wenig sinnvoll, kann aber in seltenen Fällen richtig sein (Nach meiner Erfahrung gibt es aber wenn nur sehr, sehr wenige Klassen in einer Anwendung, die als Singleton Sinn machen könnten).
-
DarkDragon1993 schrieb:
Klassen nur 1x initialisieren
Klassen werden nicht initialisiert. Sie werden deklariert, definiert, instanziiert, aber nicht initialisiert.
DarkDragon1993 schrieb:
Im Grunde soll einfach verhindert werden, dass die Klasse mehrfach aufgerufen wird zwecks Performanceschonung.
Klassen werden auch nicht aufgerufen.
DarkDragon1993 schrieb:
Ich würde ja hingehen und eine statische Variable einführen, die beim Konstruktor aufgerufen wird...
Und Variablen werden nicht aufgerufen. Funktionen kann man aufrufen.
DarkDragon1993 schrieb:
Aber da könnte man ja genauso gut hingehen und alle Methoden als statisch deklarieren.
Was wäre die bessere Methode? Die Initialisierung eines Objektes abzubrechen geht ja kaum...Klar geht das. Du kannst eine Ausnahme werfen.
Tipp: Verrate etwas über Dein eigentliches Problem. Es kann gut sein, dass dann ein paar schöne Design-Ansätze als Antworten dabei sind.
-
termi-know-logy schrieb:
Klassen werden nicht initialisiert. Sie werden deklariert, definiert, instanziiert, aber nicht initialisiert.
Klassen werden auch nicht aufgerufen.
Und Variablen werden nicht aufgerufen. Funktionen kann man aufrufen.
Ich nehm das nicht ganz so genau, weiß ja jeder was gemeint ist...
termi-know-logy schrieb:
DarkDragon1993 schrieb:
Aber da könnte man ja genauso gut hingehen und alle Methoden als statisch deklarieren.
Was wäre die bessere Methode? Die Initialisierung eines Objektes abzubrechen geht ja kaum...Klar geht das. Du kannst eine Ausnahme werfen.
Daran hab ich noch nicht gedacht. Danke.
termi-know-logy schrieb:
Tipp: Verrate etwas über Dein eigentliches Problem. Es kann gut sein, dass dann ein paar schöne Design-Ansätze als Antworten dabei sind.
Das eigentliche Problem ist... naja, die Schonung der Performance. Sehr viel Code steckt noch nicht drin...
SeppJ schrieb:
DarkDragon1993 schrieb:
Und, passe ich noch immer in die selbe Schublade mit "oben" genannten? ;P
Ja. Wie die Faust auf's Auge.
War klar. Sagt man immer wenn man keine Ahnung hat, wie der / die betreffende Person/en sind... Ich hab ja keine Ahnung wie die anderen sind und du keine wie ich bin... Finde auch man sollte jeden als Individuum betrachten, nicht als einer von vielen. Aber das ist ja nicht das Thema der Sache.
asc schrieb:
Zudem: Ob man Klassen nur 1x initialisiert oder nicht, hat nichts mit der Performance zu tun, sondern eher mit der Aufgabe der Klasse. Normalerweise ist eine Klasse mit nur einer Datenhaltung wenig sinnvoll, kann aber in seltenen Fällen richtig sein (Nach meiner Erfahrung gibt es aber wenn nur sehr, sehr wenige Klassen in einer Anwendung, die als Singleton Sinn machen könnten).
Ich dachte nur - und glaube gerade irgendwie da ist was falsch an der Denkensweise, sollte mir Objekte allgemein nochmal anschauen oO - , dass jede Klasse ihre "eigene" Funktion mitbringt und dass es eben, wenn auch nicht viel, die Performance beeinflusst, eine bestimmte "Kopie" der jeweiligen Funktion aufzurufen.
Werde mich noch laaaange mit diesem Thema beschäftigen...
Jedenfalls, danke für eure Antworten. Jetzt weiß ich wieder, wo noch Überarbeitungsbedarf in meinem Wissen liegt und kann weiterarbeiten.
Mit freundlichen Grüßen,
DarkDragon1993
-
Gut, dann war meine Vermutung, dass ich falsch gedacht habe, richtig. Danke.
-
Achja, danke für den Link. Und Entschuldigung für den Doppelpost, aber bearbeiten geht ja nicht.
Es ist nur etwas witzig... Ich habe mir ein E-Book besorgt, das genau entgegen diesem Prinzip arbeitet. Es lässt nicht einmal zufällige Zahlen "berechnen", sondern speichert diese in einem Array, das durchlaufen wird. Sehr übertrieben, wie ich finde... Aber da es eben in diesem Buch stand, dachte ich sowas wie "Hm... Vielleicht ist ja was dran".
-
DarkDragon1993 schrieb:
SeppJ schrieb:
DarkDragon1993 schrieb:
Und, passe ich noch immer in die selbe Schublade mit "oben" genannten? ;P
Ja. Wie die Faust auf's Auge.
War klar. Sagt man immer wenn man keine Ahnung hat, wie der / die betreffende Person/en sind...
Du zeigst jedenfalls alle Zeichen derer, die an der falschen Stelle beginnen.
Performance ist zwar nicht unwichtig, aber viel wichtiger ist fehlerfreier Code, der möglichst noch wartbar ist. Und nicht selten stellt sich sauber programmierter Code als mindestens genauso schnell heraus, als Code der wegen falschen Vorstellungen auf Performance getrimmt wurde. Letzter stellt sich nicht selten dann auch noch als sehr fehlerhaft heraus, und ist am Ende nur noch dafür gut, als schlechtes Beispiel zu dienen.
Viele der "Neuen" in diesem Forum stellen Fragen, die genau in diese Problematik passen.
Ich gebe dir wirklich einen Tip: Versuch erst einmal die Programmierung als solches wirklich zu verstehen (u.a. den Unterschied zwischen Objekt und Klasse), und sauberen Code zu schreiben. Performance sollte man zwar nicht ganz aus den Augen verlieren, nur wichtiger ist immer das ein Programm erst einmal das tut was es soll (zumal man in 90% der Fälle in seiner Annahme falsch liegen wird, wo die Performance in einem Programm wirklich verloren geht).
-
Ich such schon was das Zeug hält, nur dummerweise suche ich anscheinend falsch denn ich finde nur Beispiele wie man Klassen überhaupt implementiert und nicht das "technische" Zeugs dahinter.
Hättest du irgendwelche Verweise für mich, die beispielsweise genau DAS behandeln? Die technischen Hintergrundinformationen. Und wie gesagt, das mit dem "Performance zuerst" kam daher, dass ich das in diesem E-Book gelesen habe.

Beispiele für das, was der Autor alles "bedacht" hatte:
- "Zufallszahlen" werden in ein Array geschrieben, welches dann durchlaufen wird um die "unnötige" Zeit bei der Berechnung der neuen Zufallszahl zu vermeiden
- Sinus-, Cosinus- und Tangens-Arrays damit diese nicht noch zusätzlich berechnet werden müssen
- Wurzel-Arrays, ebenfalls zum Zeit Sparen beim Berechnen
- und und und, viele Beispiele hab ich wieder vergessen weil ich ehrlich gesagt finde, dass dieses Buch es übertreibt...Bei mir kam das, denke ich, ob ihr das so seht oder nicht, durch fremden Einfluss, nicht durch freies Denken, der sagen würde "Die PCs sind mittlerweile eh so schnell, dass ein paar "fressende" Stellen nichts aus machen."
Gruß,
DarkDragon1993
-
Ich würde sogar eher vermuten, dass die Techniken aus dem Buch langsamer sind als die normale Vorgehensweise. Gerade bei so Simpelrechnungen wie Zufallszahlen die man in wenigen CPU-Takten erzeugen kann, dürfte ein ungepufferter Speicherzugriff weitaus schwerer wiegen. Von wann ist denn das Buch?
Und zum technische Hintergrund von Klassen: Es gibt keinen. Klassen sind reine Abstraktion auf Quellcodeebene. Dies ist auch der Grund, warum man sich hier im Thread eher amüsiert über dein Vorhaben.
-
Hm... Hier steht 2003...
Um mich nicht noch mehr zu blamieren werde ich mich jetzt von diesem Forum erstmal distanzieren.