2013-08-23 6 views
6

私のファクトリメソッドでは、Switchステートメントを使用して具体的なオブジェクトを作成します。これは非常に高いサイクロマティックな複雑さをもたらす。ここにサンプルコードがあります:リフレクトを使用せずにファクトリメソッドの循環的複雑さを減らすことができません

私はどのようにこれをリファクタリングして周期的な複雑さを減らすことができますか?オブジェクトを作成するためにリフレクションを使用する場合は、上記の方法よりも優れていますか?

+0

が値を返すようにしようと、例外をスローするinstedとagin – Sumeshk

答えて

8

あなたは完全にswitchステートメントを削除するDictionaryを使用することが可能です:デフォルトの場合

class MyClass 
{ 
    private static Dictionary<string, Func<UnitDescriptor>> dict = new Dictionary<string, Func<UnitDescriptor>>(); 

    static MyClass() 
    { 
     dict.Add(UnitCode.DEG_C,() => new UnitDescriptorDegC()); 
     dict.Add(UnitCode.DEG_F,() => new UnitDescriptorDegF()); 
     // Other mappings... 
    } 

    private static UnitDescriptor createUnitDescriptor(string code) 
    { 
     Func<UnitDescriptor> value; 
     if (dict.TryGetValue(code, out value)) 
     { 
      return value(); 
     } 

     throw new SystemException(string.Format("unknown code: {0}", code)); 
    } 
} 
+0

おかげアディ...偉大な答えをしてみてください、私は反射を使用する必要はありません:) –

+0

あなたの工場はあなたのdictionnaryの各要素の新しいインスタンスを作成する必要があるので、ここでパフォーマンスの問題が発生します。それよりも最悪の場合、辞書は静的であることが必須であり、作成するすべてのインスタンスはコードの最後まで記憶されます。 私は現在、時間と空間の最適化を失うことなく、あなたの問題と同じ解決策を探していますが、まだ見つかりません。 – niconoe

+0

@niconoe作成されたインスタンスは静的ではありません。インスタンスの使用が終了したら解放されます。永遠にメモリに保持される唯一のものは、辞書とそれが保持するもの(キーストリングとバリュー作成関数)です。 –

関連する問題