2013-08-23 10 views
6

Fabrika yöntemimde somut nesneler oluşturmak için Switch deyimini kullanıyorum. Bu çok yüksek siklik karmaşıklık ile sonuçlanır. İşte bir örnek kod:Yansıma kullanmadan bir Factory yöntemindeki döngüsel karmaşıklığı azaltamaz

private static UnitDescriptor createUnitDescriptor(string code) 
{ 
    switch (code) 
    { 
     case UnitCode.DEG_C: 
      return new UnitDescriptorDegC(); 

     case UnitCode.DEG_F: 
      return new UnitDescriptorDegF(); 

     : 
     : 
     default: 
      throw new SystemException(string.format("unknown code: {o}", code); 
     } 
    } 

Döngüsel karmaşıklığı azaltmak için bunu nasıl yeniden düzenleyebilirim? Nesneleri oluşturmak için yansıma veya nesne oluşturmak için yansıma kullanırsam yukarıdaki yöntemden daha iyi olur mu?

+0

değer döndürmek için deneyin bir istisna atma Insted ve agin – Sumeshk

cevap

8

tamamen switch ifadeyi kaldırmak için bir Dictionary kullanmak için Mümkün: Varsayılan durumda

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

Teşekkür Adi ... Büyük bir yanıt denemek, şimdi yansıma kullanmak zorunda değilim :) –

+0

Fabrikanızın, her bir elemanın yeni bir örneğini oluşturması gerektiğinden, burada performans sorunu var. Daha da kötüsü, kurgusalınızın statik olması zorunludur, yani oluşturduğunuz tüm örnekler kodunuzun sonuna kadar bellekte kalır. Şu anda, zaman ve alan optimizasyonunu kaybetmeden aynı çözümü aradığınızdan ve henüz bulamadım. – niconoe

+0

@niconoe Oluşturulan örnekler statik değil - bunları kullanmanızın ardından serbest bırakılacaklar. Sonsuza dek hafızada tutulacak olan tek şey, sözlük ve ne tuttuğudır (anahtar dizgiler ve değer yaratan fonksiyonlar). –