Sowas gehört vorher eingeplant. Nach der Planung sollte man möglichst nichts mehr an den Strukturen ändern sonst bricht das Chaos los.Chromanoid hat geschrieben:Dieser Editor soll dann mehrere Instanzen des Spiels direkt erstellen und ansprechen können.
Wenn ein Konzept nicht zur Planung passt dann muss man eben ein anderes anwenden.
Übrigens spricht nichts dagegen den Editor zwei mal aufzurufen, wenn man mal wirklich sowas brauchen sollte (wobei ich eigentlich gar keinen Sinn darin sehe).
Nicht, wenn man die Kapselung nur dazu nutzt ein unikates Objek zu erzeugen.Chromanoid hat geschrieben:Wenn man es dann schon kapselt, würde eine Variante ohne Singleton doch einen viel höheren Mehrwert bedeuten
Das Konzept ist ausreichend gut durchdacht dass es schon in viele Anwendungen Platz gefunden hat (laut ihm in so einigen Spieletiteln an denen der Buchautor mitgearbeitet hat).dot hat geschrieben:Denn anstatt die Abhängigkeiten explizit im Code zu haben, sind die dann schön versteckt, sodass sie erst auffallen, wenn der Singleton zum Problem wird, sodass du ihn dann mühsam herausoperieren darfst.
Wenn es irgendwann mal nicht mehr ausreicht, so wird sich was neues ausgedacht wie mit allen anderen Konstrukten auch.
Davon mal abgesehen: Inwiefern macht das einen Unterschied zu dem Zugriff über eine Globale?
Genau das habe ich bereits gemacht, weswegen ich eigentlich schon eine Vorstellung hatte wie man auf meine Anfrage regaieren würde.dot hat geschrieben:Thread hier mal aufmerksam zu lesen, wir haben das imo wirklich schon zur Genüge diskutiert
Ich habe keine deutliche (Begründete) Aussage finden können, die exakt beschreibt, warum man "niemals Singletons benutzen" sollte.
Alles was ich hier fand war nur "Singletons sind einfach nur sch..._nicht_so_gut".
Sorry aber das sagt für mich garnichts aus. Davon abgesehen hat es sehr wohl seine Vorteile (auch wenn es nur "Bequemlichkeiten" sind wie du es nennst).dot hat geschrieben:Es hat Nachteile ohne einen Vorteil zu bieten
Außerdem würde man das in der Praxis nicht einsetzen wenn dem wirklich so wäre.
Der Vergleich scheint mir aus der Luft gegriffen zu sein. Ich habe nicht von dem Muster allgemein gesprochen, sondern für diese eine Anwendung.dot hat geschrieben:"Meine Wohnung ist das Zentrum meines täglichen Lebens. Darum darf es in meinem Leben um jeden Preis bis ans Ende aller Tage nur eine Wohnung haben."
Um es explizit hervorzuhebendot hat geschrieben:Wenn man das will. Aber warum sollte man das hier wollen?
Welche gäbe es denn noch, wenn man nicht extra eine Referenz auf das Objekt in jeder einzelnen Komponente haben will?dot hat geschrieben:Wer sagt, dass eine globale Variable die Alternative ist?
Ich mag mich vielleicht nicht günstig ausgedrückt haben: Ich meinte nicht, dass Singletons ein Ersatz für globale Variablen sind. Mit einem Singleton kann man diese jedoch "umgehen".
Ich will nicht sagen, dass das immer sinnvoll ist, jedoch ist es ein "netter" Nebeneffekt, wenn man das Design sowieso schon so aufbauen will (oder auch nicht, jedem das seine).
Der Log ist kein Singleton und jede Komponente die ein eigenes Log haben will kann sich eine egene Instanz erstellen. Anderen Komponenten bleiben unangetastet, Problem gelöst, guten morgen!dot hat geschrieben:Und eines Tages will man, dass eine Komponente in ein andres Log logged als der Rest. Gute Nacht.
Diese Aussage trifft auf so ziemlich alles zu.dot hat geschrieben:Und zwar genau so lange, bis man merkt wie unpraktisch es eigentlich ist
Falsch, es geht hier nicht um irgendjemandes Konstrukt, sondern um das Eigene. Wenn man sich nicht mal selbst an eigene Konventionen hält, dann kann man sich das alles eigentlich auch sparen (genauso überhaupt irgendwelche Gedanken über die Softwarearchitektur).waigie hat geschrieben:Das liegt aber nur daran das sich jeder bei Singletons an diese Namenkonvention hält.
Warum sollte man bei dem einen nicht wissen worum es sich handelt?waigie hat geschrieben:Bei dem einen weiß ich genau worum es sich handelt beim anderen nicht.
Das wage ich jetzt mal zu bezweifeln. Es ist eine Sache die man mit ziemlicher Sicherheit nicht beweisen kann. Ich lasse mich jedoch gern mit handfesten Argumenten vom Gegenteil überzeugen.waigie hat geschrieben:Singletons eigentlich immer Fehl am Platz sind.
-------
Zu der Frage, warum ich gegen eine globale Variable bin:
Eine globale Variable, sei diese noch so gut benannt, kann nicht per IntelliSense erreicht werden (und nein ich will kein extra Namespace da drum machen).
Ein GameApp::getInstance() Aufruf kann ich übrigens viel leichter im Code erkennen, als g_myGame (weil der Zugriffsoperator :: kaum zu übersehen ist und der Funktionsaufruf dahinter wird bei mir mit Visual Assist extra eingefärbt).
------
Ich hätte da noch einen Grund warum ein Singleton für diesen Anwendungsfall angebracht sein kann:
Ein GameApp Objekt verwaltet im Prinzip alles was in der Applikation so drin ist. Dazu verbraucht es sehr viel Ressourcen des Systems und nimmt sich alles was es kriegen kann.
Erlaube ich eine zweite, komplett andere Instanz, dann müssen sich die beiden Objekte die Ressourcen teilen was erstmal nicht so schlimm wäre wenn man aber:
Habe ich z.B. eine selbst verwaltende SceneManager Komponente, welche Daten von der Festplatte streamen kann und ich habe jetzt eine weitere Instanz der Containerklasse dann habe ich zwei SceneManager welche sich gegenseitig stören und quasi, wenn überhaupt, nur schwer synchronisiert werden können und somit gleichzeitig die Festplatte und den Datenbus in die Knie zwingen (sofern man Multithreading benutzt und wenn nicht dann hat man nur die halbe Rechenzeit).
Beide GameApp Objekte würden sich um den Grafikadapter streiten, und ihre Geometrie (nach jedem "restore") zum Rendern schicken. Ist die Anwendung Multithreaded würde man die Grafikkarte schon allein durch ständiges (und überflüssiges) wechseln der Materialien ausbremsen.
Wenn ich also sowieso nur Probleme mit mehreren Objekten habe, warum dann nicht ausschließen, dass so etwas vorkommt?