2009-09-01 9 views
8

これは私が説明するために、サンプル問題を使用します新しいアプリ を設計していますときに私は多くの時間に直面している問題で、このグローバル国家とシングルトン依存性の注入

は私が欲しいシンプルgame.soを書いています考えています選手のリストを保持する。 私はいくつかのオプション..いくつかのクラスの静的フィールド1.use

private static ArrayList<Player> players = new ArrayList<Integer>(); 
public Player getPlayer(int i){ 
    return players.get(i); 
} 

しかし、この私はシングルトン

を使用することができるグローバルな状態

2.orを持っています

class PlayerList{ 
    private PlayerList instance; 
    private PlayerList(){...} 
    public PlayerList getInstance() { 
     if(instance==null){ 
      ... 
     } 
     return instance; 
    } 
} 

これは、それはシングルトン

3.Dependency注入

class Game { 
    private PlayerList playerList; 
    public Game(PlayerList list) { 
     this.list = list; 
    } 
    public PlayerList getPlayerList() { 
     return playerList; 
    } 
} 

だから、これは良いようだが、ゲーム外の任意のオブジェクトがある(PlayerListを見てする必要がある場合、それは、 ではありません悪いです通常の場合) Gameクラスをグローバルに使用できるようにするには、上記の方法の1つを使用する必要があります。 だから、問題に別のレイヤーを追加するだけです。実際には何も解決しませんでした。

最適なソリューションは何ですか? (現在私はシングルトンアプローチを使用しています)

答えて

1

依存関係注入のアイデアは、依存関係を注入するための名前状態です。だから、プレイヤーリストについて知る必要のあるオブジェクトには、それが注入されます。 通常、依存関係の参照やその他のメカニズムに切り替える前に、可能な限り依存関係注入を広範囲に使用することは、大変意味があります。これにより、後でゲームを拡張して、さまざまなレベルのプレイヤーリストを持つことができます。

+0

kですが、どこかでPlayerListインスタンスを使用する場合はどうすればよいですか? – Manu

+2

もう一度注射します。 Spring(あなたがJavaプログラムを提供する)のようなフレームワークは、これをもっと簡単にします。 サービスやシングルトン自体ではないため、PlayersListを合理的に挿入できないものは、何らかの種類のファクトリによって作成され、次にPlayersListで非常によく注入され、作成されたオブジェクトに渡されます。 しかし、各オブジェクトにPlayerListを挿入すると、デザインやカプセル化、情報の隠蔽に関する考え方が必要になります。 –

1

GameListの外でPlayerListが必要な場合は、多分Gameはこれに対して間違ったクラスですか?他のオブジェクトにPlayerListが必要な場合は、リストを挿入する必要があります。または、Gameクラスではなくこのクラスにリストを移動する必要があります。

ゲーム、プレイリスト、その他のクラスのライフタイムが異なる場合は、ファクトリを使用してそれらをグループ化することも考えてください。詳細はGoogle Testing Blog articleにチェックしてください。

+0

1)多分Gameはこれに対して間違ったクラスですが、別のクラスに入れてもまだ問題はあります。今はGameクラスで使用できません。 2)PlayerListを必要なすべてのクラスに渡すことは意味がありません。正義はファクトクラスで作成されています。 – Manu

4

これは、DIコンテナがライフサイクルを管理する理由です。 PlayerListをコンテナのライフサイクルの観点から見てみましょう。コンポーネントの完全なテスト可能性を与え、コンテナ(あなたではない)が手を汚してしまうようにしましょう。

+0

+1 - あなたは頭の爪に当たった! – TrueWill