Paket-weite Variable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich verstehe dein Problem nicht. Wenn du ein Singleton nutzen möchtest, dann implementiere halt eines. Mir wäre neu, dass sinnvoll genutzte Singletons irgendwie schlecht in Python sind. Beim Testen könntest du halt auf Identität (`is`) prüfen. Ich würde vom Gefühl her (d.h. ohne Details zu kennen) aber nach wie vor eine Liste von Spielern empfehlen, wobei der aktuelle Spieler mit einem Flag gekennzeichnet wird. Ich würde aber sagen: Mach erstmal wie du meinst und später stellst du es eventuell um. Wichtig ist ja in dem Moment, dass es erstmal läuft und man von alleine auf etwaige Unstimmigkeiten stößt, wenn die Klasse halt in der Praxis angewendet wird. Eventuell bist du auch zufrieden mit deiner Lösung - wer weiß (auch wenn mir ein als Singleton implementierter aktueller Spieler äußerst komisch vorkommt). Wäre ja nicht das erste Mal, dass ich mit meinen Ideen / Einwänden auf die Nase falle (aber damit lebe ich gerne, solange ich einen Lerneffekt dabei habe). ;)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@snafu
Um den Spieler geht es mir gar nicht mehr, der ist jetzt bei den anderen eingeordnet und es gibt ein Beobachter-Objekt, wie BlackJack es vorgeschlagen hatte.
Das Singleton/Borg(S/B) zu implementieren ist auch nicht das Problem, sondern wie man damit dann arbeiten kann. Denn wenn du eines dieser Muster in einem Klassenobjekt benutzt macht es dieses ja abhängig vom Zustand des S/B. Zum testen müsste ich dann immer den Zustand des S/B [wiederh]erstellen. Bei dem Logger ist das kein Problem, aber bei den Managern ist das nicht gerade einfach.

Deswegen stehe ich wiedermal auf dem Schlauch :? Doch besser gleich prozedural programmieren :mrgreen:
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Na, die Implementierung eines Singleton an sich besteht aus maximal 3 Zeilen und dürfte hinlänglich bekannt / zu ersuchen sein. Ich sag ja: Probier es in der Praxis aus. Als ordentlicher Programmierer willst du bestimmt einen neuen Zweig dafür erschaffen. ;)

Eventuell reden wir aber auch mal wieder aneinander vorbei. Ein Manager darf in meinen Augen durchaus theoretisch mehrere Exemplare haben und muss eigentlich nicht explizit als Singleton implementiert sein. Mehrere Manager benutzen will aber vermutlich eh niemand. Ist halt irgendwo die Gratwanderung zwischen dem Einbeziehen aller möglichen Eventualitäten und dem Aufblähen von Code. Überleg dir halt mal, wie deine Funktionen und Klassen wohl üblicherweise genutzt werden bzw wie wahrscheinlich es ist, dass jemand mehrere Manager benutzen möchte oder (noch wichtiger) inwieweit man etwas kaputt machen könnte, wenn man mehrere Manager-Exemplare benutzt. Sofern du merkst, dass es im Prinzip egal ist, würde ich halt auch das Singleton weglassen.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Na ja, rein theoretisch braucht man S/Bs eigentlich nie, man kann ja auch einfach eine einzelne Instanz auf Modulebene platzieren und dann immer diese nutzen. Die Nutzung dessen ist genau gleich, nur könnte man dann halt weitere Instanzen erzeugen.

Ja, Manager könnten mehrfach instanziert und genutzt werden, hier wäre aber die Frage nach dem Sinn. Z.B. der Resourcenmanger beinhalten das Pfad-Prefix für die Resourcen und parst die Konfigurationsdateien für die Resourcen und beinhaltet dann die Tilesets. All das muss nur einmal geladen werden, wenn man ihn mehrmals instanzieren würde müsste man die Resourcen auch wieder einlesen. Man könnte die Resourcen auch als *statische* Variablen einbauen, aber da man das dann mit allen machen müsste, kann man auch wieder ein S/B nehmen.

Nochmal als Erklärung für die jenigen den es noch nicht klar ist was die Manager machen. Es gibt einige XML-Dateien, welche die Daten bereitstellen z.B. Pfade zu Bildern-, Ton- oder anderen XML-Dateien und Daten wie Id, Name, Gewicht und anderes. Diese werden von den Managern ausgelesen und weiter verarbeitet, wird zum Beispiel ein Bild benötigt erstellt es der Resourcen-Manager zu dem Zeitpunkt an dem es benötigt wird und speichert es. Wird es nochmal benötigt weist er einfach nur auf das Bild, sollte dies geändert werden erstellt er es neu. Bilder können aus mehreren Ebenen bestehen.
Also habe ich hier einen Denkfehler? Denn im Endeffekt mache ich so doch alle Objekte die Resourcen benötigen von dem Zustand des Managers abhängig.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das, was du beschreibst, klingt für mich eher danach, als willst du einen Cache implementieren, halt um einmal geladene Daten wiederverwenden zu können (meinetwegen auch mittels wie auch immer geartetem Zugriff über einen Manager). Dafür braucht es aber keine "S/B-Implementierung", sondern hier genügt in meinen Augen ein simples Dictionary, welches entweder alle benötigten Daten bei Programmstart lädt oder aber diese Daten auf Anfrage einliest, nachdem erkannt wurde, dass noch kein entsprechender Schlüssel existiert. Aber gut, ich dürfte nun zu Genüge geäußert haben, dass ich bei diesem Anwendungsfall nichts von Borgs halte. Vielleicht kommen ja auch noch ein paar Meinungen von anderen Leuten... ;)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ein Wörterbuch dient im Manager zur Datenspeicherung, aber der Manager soll mehr können als nur Daten speichern. Er soll diese ja verwalten(deswegen auch der Name). So hat dieser halt Methoden zum lesen, schreiben, finden, ... von Daten im Wörterbuch.
Ich könnte das ganze jetzt natürlich funktional schreiben in dem ich nur die verschiedenen Funktionen nehme und das Wörterbuch und die Pfade übergebe. Aber wenn ich das nur per Wörterbuch mache, brauche ich dieses und die Funktion überall dort wo ich vorher den Manager gebraucht habe. Ich sehe da keinen großen Unterschied.

Ich hoffe ja auch das jemand bei mir noch das Licht einschalten kann :? .
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten