2013-08-23 20 views
6

Nel metodo factory uso l'istruzione Switch per creare oggetti concreti. Ciò si traduce in una complessità ciclomatica molto elevata. Ecco un codice di esempio:Impossibile ridurre la complessità ciclomatica in un metodo di fabbrica senza utilizzare la riflessione

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); 
     } 
    } 

Come posso effettuare il refactoring per ridurre la complessità ciclomatica? Se uso la reflection per creare oggetti o qualcos'altro per costruire oggetti è meglio del metodo sopra?

+0

In caso di default tenta di restituire un valore invece di un'eccezione e provare agin – Sumeshk

risposta

8

E 'possibile per l'utilizzo di un Dictionary per rimuovere l'istruzione switch tutto:

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

Grazie Adi ... grande risposta, ora non devo usare la riflessione :) –

+0

Problemi di prestazioni qui, dato che la tua fabbrica ha bisogno di creare una nuova istanza di ciascun elemento nel tuo dizionario. Peggio ancora, il tuo dnnnnary è obbligatorio per essere statico, il che significa che tutte le istanze che creerai rimarranno in memoria fino alla fine del tuo codice. Attualmente sto cercando la stessa soluzione al tuo problema senza perdere tempo e ottimizzazione dello spazio, e non ho ancora trovato. – niconoe

+0

@niconoe Le istanze create non sono statiche, saranno liberate quando hai finito di usarle. Le uniche cose che saranno conservate per sempre nella memoria sono il dizionario e ciò che contiene (le stringhe chiave e le funzioni di creazione di valore). –