これにはSingleton Patternがあり、アプリケーションの単一のインスタンスを作成し、受け渡しせずに共有します。
しかし、それは最善の選択肢ではありません。
なぜそれが悪い選択肢なのですか?
- コードのテスト容易性が良くない
- 設計の拡張性がない
シングルトン パターンよりも優れているのは、アプリケーション全体の単一インスタンスです。
アプリケーション用に単一のオブジェクトを作成し、何らかのコンテキスト オブジェクトを使用して共有します。これについての詳細は、 Misko のテスト可能なコードのガイドで説明されています。
単一インスタンスであり、シングルトン パターンではありません
これは、アプリケーション全体の単一インスタンスを表し 、静的インスタンス フィールドを通じてその単一性を強化しません。
シングルトンのテストが難しいのはなぜですか?
- 静的アクセスは、別のクラスのサブクラスまたはラップされたバージョンとのコラボレーションを防ぎます。依存関係をハードコーディングすると、ポリモーフィズムの力と柔軟性が失われます。-グローバル状態を使用するすべてのテストは、期待される状態で開始する必要があります。そうしないと、テストは失敗します。しかし、以前のテストで別のオブジェクトがそのグローバル状態を変更した可能性があります。
- グローバル状態は、多くの場合、テストを並行して実行できないため、テスト スイートの実行が遅くなります。
- 新しいテスト (グローバル状態をクリーンアップしない) を追加し、スイートの途中で実行すると、その後に実行される別のテストが失敗する可能性があります。
- 独自の「シングルトン性」を強制するシングルトンは、不正行為に終わります。テスト中にインスタンスを変更する必要があるため、いわゆるシングルトンで
reset()
やなどのミューテーター メソッドをよく見かけます。setForTest(…)
テスト後に Singleton をリセットするのを忘れると、後で使用すると古い基になるインスタンスが使用され、デバッグが困難な方法で失敗する可能性があります。