2013-08-23 8 views
6

In meiner Factory-Methode verwende ich die Switch-Anweisung, um konkrete Objekte zu erstellen. Dies führt zu einer sehr hohen zyklomatischen Komplexität. Hier ist ein Beispielcode:Die zyklomatische Komplexität kann in einer Factory-Methode ohne Verwendung der Reflektion nicht reduziert werden

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

Wie kann ich dies umgestalten, um zyklomatische Komplexität zu reduzieren? Wenn ich zum Erstellen von Objekten Objekte oder etwas anderes zum Erstellen von Objekten verwende, ist das besser als die obige Methode?

+0

Im Standardfall versuchen, einen Wert zurückgeben insted eine Ausnahme zu werfen und versuchen agin – Sumeshk

Antwort

8

Es ist möglich, dass Sie ein Dictionary zu verwenden, um die switch Anweisung vollständig zu entfernen:

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

Dank Adi ... große Antwort, Jetzt muss ich keine Reflektion verwenden :) –

+0

Leistungsprobleme hier, da Ihre Fabrik eine neue Instanz jedes Elements in Ihrem Wörterbuch erstellen muss. Schlimmer noch, Ihr Wörterbuch muss zwingend ein Static sein, dh alle Instanzen, die Sie erstellen, bleiben bis zum Ende Ihres Codes im Speicher. Ich suche derzeit die gleiche Lösung für Ihr Problem, ohne Zeit und Speicherplatz zu verlieren, und ich habe noch nicht gefunden. – niconoe

+0

@niconoe Die erstellten Instanzen sind nicht statisch - sie werden freigegeben, wenn Sie sie nicht mehr verwenden. Die einzigen Dinge, die für immer im Gedächtnis bleiben werden, sind das Wörterbuch und was es enthält (die Schlüsselzeichenfolgen und die wertschöpfenden Funktionen). –

Verwandte Themen