2011-08-04 11 views
6

ピコ容器を使っている間にこれを見ました。彼らはシングルトンを避けなければならないと言います。 シングルトンのパターンは、クラス(およびおそらくそれに依存する他のすべてのクラス)がテスト可能であることをほとんど不可能にするためです。サブクラス化、またはシングルトンクラスのモックオブジェクトの作成は非常に難しいです。シングルトンのテストとサブクラス

しかし、絶対に必要な場合は、テストとサブクラスの問題の回避策がありますか?

答えて

5

シングルトンをテストするのが難しいのは、そのシングルトンを強制するコードです(public static MySingleton getInstance() {...}の定型文を意味します)。 PicocontainerやGuiceのか、春のように、反転・オブ・コントロールコンテナーを使用して、今、オブジェクトからその懸念を削除します。

  • これは、インスタンス化することができ、協力者は問題なくテストでそれに差し込まれています。シングルトンを呼び出し

  • コードは、(それは静的メソッドを呼び出す必要があった場合、それは知っている必要がありますどの)まで探しているものは、クラスを知っている必要はありません。

私はピクコンコンテナーのウェブサイトに関するアドバイスをこのように解釈します。彼らがあなたに伝えていることは、私たちのコンテナがあなたのためにコンポーネントの範囲を管理できるようにして、スコープ強制コードをそれらにハードワイヤー接続しないことです。

+0

完璧に正しい - IOCはこのようなものに行く方法です –

1

あなたが持っている必要がある場合はシングルトン:

  1. は、グローバル/シングルトンServiceLocator
  2. スイッチからの各シングルトン
  3. アクセスをあなたのシングルトンを記述したインタフェースを持っているのServiceLocatorに登録インスタンス
をテスト中

例:

1

初回使用時に開始されたシングルトンではなくIOC(コントロールの反転)を使用することは、他の理由でも有利です。

シングルトン-初期化は、2つのスレッドが同時に最初の時間のためにそれにアクセスしようとするマルチスレッドの問題から(有名)に苦しむことができます。後続のアクセスは正しくシンクロされる可能性が高いですが、最初のアクセスははるかに難しいです。

私がIOCを使用することのもう一つの大きな利点は、初期化でエラーが発生する可能性があることです。これを「最初の使用」で発生させたくない場合は、早い段階でこのエラーを知りたいのですが、このようにエラーを処理する方が簡単です。

最後に、IOCはコンポーネントを分離し、必要に応じてそれらを置き換え、より柔軟な方法でさまざまな組み合わせを組み合わせるための完璧なモデルを提供し、ユニットテストと統合テストの両方に最適なハーネスを提供します。実際にコードを元に戻す必要はありません。

シングルトンはそれほど頻繁に使用されている一般的な理由は、ワンネスのためではなく、グローバルネスのためではありません。あなたのプロジェクトが正しく管理されている場合は、他のすべてが(そのため、あなたのIOCモデルがオフハング)「登録」と、まだ設定可能であることながら、グローバルに利用可能な単一のグローバルオブジェクトがあります。

関連する問題