2016-03-30 43 views
1
public interface IDoSomething 

public class ClassA : IDoSomething 
public class ClassB : IDoSomething 
public class ClassC : IDoSomething 

いくつかのクラスによって実装されたインターフェイスがあります。また、一部のデータを解析してからこれらのオブジェクトの新しいインスタンスを作成するコードブロックもあります。今は、どのオブジェクトを使用するかを決定する大きなswitch文がありますが、より良い方法が必要です。インターフェイスを複数回実装するためのベストプラクティス

インターフェイスを実装し、クラスをコード化し、コードをリファクタリングする必要がない新しいクラスを作成できるようにしたい(switchステートメントに大文字小文字を追加するなど)。

このようなものを実装するためのベストプラクティスは何ですか?ここで

は私の現在の(安っぽい)switch文は次のようになります。

switch (flag) 
{ 
    case 1: 
     return new ClassA(); 
    case 2: 
     return new ClassB(); 
    case 3: 
     return new ClassC(); 
    default: 
     return null; 
} 
+0

あなたは辞書を使うことができます.. 'dict = new Dictionary > {{1、()=> new ClassA()}}'そしてあなたのメソッドは+エラーチェック/ – Rob

答えて

0

これはabstract factoryを使用する際の良い例です。 this pageに例を示します。 2番目のコードブロックまでスクロールすると、同じシナリオを処理していることがわかります。インターフェイスの実装を返す必要があります。返す実装を教えてください。

DIコンテナを使用せずにこれを行うことはできますが、​​の実装を作成するときにその実装にも依存関係がある場合は、それも作成されます。したがって、ClassAがそのコンストラクタに何かを渡す必要があり、そのコンストラクタに渡される値が必要な場合、DIコンテナがそのすべてを処理します。

ウィンザーが好きなのは、抽象的な工場nice implementationです。

この回答の問題は、この特定の問題を解決するためにあなたが依存関係注入に潜むことを推奨していることです。しかし、私は本当にそれをお勧めします。あなたはインターフェイスにプログラミングしようとしており、そのタイプのデザインを容易にします。それはあなたがやっていることを取り、それをとても簡単にして、ますますやります。

私はそれを根本からより詳しく説明するブログ記事を書く必要があります。

+0

私はしばしば、このようなことを説明するブログ記事のために、不必要な専門用語をそれに投じることなく掘り起こすことがしばしば始まります。私はそれを見つけることができないとき私は自分自身を書く。 (それがもっと良いかどうか分かりません)どのようなプロジェクトですか? (WCF、ウェブサイトなど)またはそれが単なるクラスライブラリであれば、どのようなアプリケーションから呼び出されますか?アイデアを捨てて、それを完全に説明したり表示したりするのではなく、私がそれをより良く説明するものを書くことができます。 –

関連する問題