Global State und Singletons Dependency-Injektion

8

Das ist ein Problem, dem ich oft gegenüberstehe, wenn ich eine neue App entwerfe Ich werde ein Beispielproblem verwenden, um dies zu erklären

denke, ich schreibe ein einfaches Spiel.so ich möchte eine Liste von Spielern halten. Ich habe wenige Optionen ..

1.Verwenden Sie ein statisches Feld in einer Klasse

%Vor%

aber das ist ein globaler Zustand

2.oder ich kann ein Singleton verwenden

%Vor%

aber das ist schlecht, weil es ein Singleton

ist

3. Abhängigkeitsinjektion

%Vor%

Das scheint gut, aber es ist nicht so, wenn irgendein Objekt außerhalb des Spiels auf PlayerList schauen muss (was der übliche Fall ist) Ich muss eine der obigen Methoden verwenden, um die Game-Klasse global verfügbar zu machen. also füge ich einfach eine weitere Ebene zum Problem hinzu . hat eigentlich nichts gelöst.

Was ist die optimale Lösung? (Derzeit verwende ich Singleton-Ansatz)

    
Manu 01.09.2009, 19:29
quelle

3 Antworten

4

Deshalb verwaltet DI Containers den Lebenszyklus. Lassen Sie die Playerliste hinsichtlich des Container-Lebenszyklus ein Singleton sein. Gibt Ihnen volle Testbarkeit der Komponenten und lassen Sie den Container (nicht Sie) seine Hände schmutzig.

    
flq 01.09.2009 20:19
quelle
1

Die Idee hinter der Abhängigkeitsinjektion ist, wie der Name angibt, Abhängigkeiten zu injizieren. Also, welches Objekt auch immer über die Spielerliste wissen muss, wird damit injiziert. In der Regel ist es sinnvoll, die Abhängigkeitsinjektion so umfassend wie möglich zu verwenden, bevor Sie in Abhängigkeitsnachfragen oder andere Mechanismen wechseln. Dies wird es auch ermöglichen, das Spiel später zu erweitern, um verschiedene Spielerlisten für verschiedene Levels oder welche Erweiterungen Sie auch immer haben möchten.

    
Johannes Stiehler 01.09.2009 19:42
quelle
1

Wenn Sie PlayerList außerhalb des Spiels benötigen, ist das Spiel vielleicht die falsche Klasse? Wenn ein anderes Objekt PlayerList benötigt, muss entweder die Liste ebenfalls eingefügt werden oder Sie sollten die Liste in diese Klasse anstatt in die Game-Klasse verschieben.

Wenn Sie unterschiedliche Lebensdauern für Game, PlayerList und andere Klassen haben, sollten Sie vielleicht auch eine Factory verwenden, um sie zu gruppieren. Weitere Informationen finden Sie in diesem Google Testing Blog-Artikel .

    
FrankS 01.09.2009 19:50
quelle