Falsches Program design korrigieren
-
Hallo,
ich muss mich um ein Program kuemmern das fuer die neuen Anforderungen leider ein total falsches Desgin hat. Das Problem ist eine statische Klasse, diese wird ueberall verwendet aber sie darf nicht statisch sein, wie kann man das ganze anedern ohne das ganze Program neu schreiben zu muessen, es geht um folgende Klasse:
static ModelManager() { m_instance = new ModelManager(); } private ModelManager() { m_camera = new CameraSceneLattice(); } public static ModelManager Instance { get { return m_instance; } } public MainWindowForm MainWindow { get { return m_mainWindow; } set { m_mainWindow = value; } } public Density1DWindowForm Z3D1DView { get { return m_z3d1dview; } } public Z3DModelRoot LatticeModel { get { return m_model; } } public CameraSceneLattice LatticeCamera { get { return m_camera; } } private static ModelManager m_instance; private MainWindowForm m_mainWindow; private Density1DWindowForm m_z3d1dview; private Z3DModelRoot m_model; private CameraSceneLattice m_camera; }
Im ganzen Program finden sich nun Aufrufe der Form:
ProgramManager.Instance....
Wie kann man das mogelichst einfach/elegant aendern ohne das ganze neu zu schreiben?
mfg
-
12test schrieb:
Wie kann man das mogelichst einfach/elegant aendern ohne das ganze neu zu schreiben?
Wenn du ein Singleton los werden willst, dann musst du dafür sorgen dass überall - ohne Verwendung der statischen ".Instance" Property - eine Instanz der Klasse zur Verfügung steht. (Also nur wo halt eine benötigt wird, nicht überall, logisch.)
Die einfachste Variante das umzusetzen ist meist den Klassen die das ehemalige Singleton benötigen im Konstuktor eine Instanz der ehemaligen Singleton-Klasse mitzugeben.
Und ganz aussen, z.B. in der "main" Funktion, erzeugst du dann eine einzige Instanz und gibst diese allen weiteren Objekten über ihren Konstruktor mit.Was dabei Problematisch werden kann sind statische Funktionen in der die ehemalige Singleton Klasse verwendet wird. Die können ja auf keine Membervariablen "ihres" Objekts zugreifen, da sie kein solches Objekt haben. Diese muss man sich dann Fall für Fall angucken, und entscheiden was zu tun ist. Manche statischen Funktionen wird man einfach zu Memberfunktionen "hochstufen" können, anderen wird man die nötige Referenz als zusätzliches Parameter übergeben, und wieder andere wird man vielleicht ganz wo anders hin verlagern.
Danach hast du effektiv immer noch nur eine einzige Instanz, aber dann hast du Code mit dem es möglich sein sollte zwei oder mehr verschiedene Objekte zu erzeugen und zu verwenden. Dafür können dann weitere Änderungen nötig sein, aber der Weg sollte dann klar sein.
Ich würde auf jeden Fall empfehlen das in zwei Schritten zu machen. Also erstmal den Singleton-Getter (die ".Instance" Property) entfernen und mit explizit rumgereichten Referenzen zu ersetzen. Und danach erst den 2. Schritt machen für den es dann nötig ist mehr als 1 Objekt zu erzeugen/verwenden. Sonst verliert man schnell den Überblick.
-
hustbaer schrieb:
12test schrieb:
Wie kann man das mogelichst einfach/elegant aendern ohne das ganze neu zu schreiben?
Wenn du ein Singleton los werden willst, dann musst du dafür sorgen dass überall - ohne Verwendung der statischen ".Instance" Property - eine Instanz der Klasse zur Verfügung steht. (Also nur wo halt eine benötigt wird, nicht überall, logisch.)
Die einfachste Variante das umzusetzen ist meist den Klassen die das ehemalige Singleton benötigen im Konstuktor eine Instanz der ehemaligen Singleton-Klasse mitzugeben.
Und ganz aussen, z.B. in der "main" Funktion, erzeugst du dann eine einzige Instanz und gibst diese allen weiteren Objekten über ihren Konstruktor mit.Was dabei Problematisch werden kann sind statische Funktionen in der die ehemalige Singleton Klasse verwendet wird. Die können ja auf keine Membervariablen "ihres" Objekts zugreifen, da sie kein solches Objekt haben. Diese muss man sich dann Fall für Fall angucken, und entscheiden was zu tun ist. Manche statischen Funktionen wird man einfach zu Memberfunktionen "hochstufen" können, anderen wird man die nötige Referenz als zusätzliches Parameter übergeben, und wieder andere wird man vielleicht ganz wo anders hin verlagern.
Danach hast du effektiv immer noch nur eine einzige Instanz, aber dann hast du Code mit dem es möglich sein sollte zwei oder mehr verschiedene Objekte zu erzeugen und zu verwenden. Dafür können dann weitere Änderungen nötig sein, aber der Weg sollte dann klar sein.
Ich würde auf jeden Fall empfehlen das in zwei Schritten zu machen. Also erstmal den Singleton-Getter (die ".Instance" Property) entfernen und mit explizit rumgereichten Referenzen zu ersetzen. Und danach erst den 2. Schritt machen für den es dann nötig ist mehr als 1 Objekt zu erzeugen/verwenden. Sonst verliert man schnell den Überblick.
Danke fuer die Ausfuerliche Antwort! Ich werde so vorgehen und Stueck fuer Stueck alles aendern.