2010-12-27 5 views
2

私は簡単にテストできるコードを書こうとしています。それは新しいClass1()を直接呼び出すことを避けることにつながります。代わりに私は通常、このインターフェイスを返すGetObject()メソッドを持つ単純なファクトリであるインターフェイスを作成します。テスト可能なコードを書いた結果、工場が多すぎます

正常に動作します。私が見つけた問題は、新しいClass1()(またはそれらが作成する責任を負うクラス/インタフェース)を呼び出すことを除いて、基本的に何も起きていない工場が多すぎることです。私はそれがテスト可能なコードを持っているために支払う大きな費用だとは思っていません...誰もより良いaproachを使用し、まだテスト時にClass1の異なるimplementetaionを注入できるという目標を達成していますか?

Class1の実装をプロパティとして公開し、実行時にデフォルト値を使用することができますが、これは1インスタンスに制限されていることを意味しますが、多くの場合、Class1が必要なたびに新しいインスタンスを作成します。

編集:
私はIoCを使用しており、実際に役立ちます。それにもかかわらず、私は通常、IoC構成に依存する工場を持つことになります。私のGetObjectメソッドは通常、IoC.Resolveのようなものを呼び出します。私は、ビジネスロジックを含むドメインクラスに直接ではなく、工場でIoC依存関係を分離することを好みます。

+3

IoCコンテナが必要です。 –

+0

@Martinho - あなたはあなたの回答を精緻化し、それを答えに入れることができますか? –

答えて

2

私はあなたが話している言語を知っていれば簡単でしょうが、ほとんどの言語はジェネリックスやその他の概念を持っています。つまり、あなたの工場は一般的なものをインタフェースすることができます:

Javaバージョン:

public interface Factory<K>{ 
    K create(); 
} 

Guava Librariesは、まさにこの目的のためにSupplier<K>のインタフェースを持っています。私はそのような擬似標準を使用することをお勧めします(私は他の言語でも同様のものが利用可能であると思います)。

+0

私はC#を使用しています。実際、IoCを使ったジェネリック医薬品は、道のりかもしれない。 – trendl

3

これを達成するのに役立つ多くのフレームワークがあります。この技術は、反転制御と呼ばれています。 .NETの世界での例:

すべてのこれらのフレームワークの共通点は、コンフィギュレーション中に成分(クラス)との間のバインディングを外部化する能力でありますこれは構成ファイル(すなわちXML)または「ブートストラップ」コードとして表現されます。彼らは自動的にインスタンスに依存関係を注入し、クラスのインスタンス化と構成の問題をあなたのために追い越すことができます。基本的に、IoCコンテナにこのタスクを残して、カスタムファクトリクラスの作成を終了することができます。

関連するSOにはioc-containerというタグが付けられています。

Martin Fowlerは、IoCと依存関係注入とサービスロケータのような実装技術を記述しています。articleがあります。

関連する問題