2010-10-26 30 views
6

L'inizializzazione dell'elenco con lambdas causa una complessità ciclomatica dell'IL: perché e come rimuovere questa complessità? Ad esempio il seguente codice fa sì che il costruttore statico della classe (che è in realtà generato dal compilatore) sia molto complesso: 1 + il numero di lista.Perché l'inizializzazione dell'elenco con lambda causa un'elevata complessità ciclomatica?

static List<Predicate<string>> list = new List<Predicate<string>>() 
{ 
    s => s == null, 
    s=> s.StartsWith(“R”), 
    ... With a lot of predicates like that …. 
}; 

Nota: la complessità viene calcolato con NDepend

risposta

2

Perché? Perché ILCC è definito come il numero di diverse destinazioni di salto/diramazione. Quella lista che stai inizializzando contiene un sacco di logica if/then, contenuta all'interno dei lambda. Presumo che il CC dipendente dalla lingua sia inferiore?

Alto cyclomatic complexity è solo un suggerimento che le vostre funzioni sono troppo complesse, e quindi difficili da comprendere, mantenere e testare. Se questo suggerimento è corretto in questo caso dipenderà da come si utilizza tale elenco di predicati. Ma è solo questo, un suggerimento. Mantenere il CC basso non dovrebbe essere considerato una legge di natura. Se ritieni che il codice sia gestibile e verificabile, tieni presente l'ILCC elevato nella documentazione, spiega perché non è importante e vai avanti.

+0

In realtà se decompilo il codice e se capisco bene IL (sono un maniaco a riguardo), i lambda sembrano essere generati separatamente. Le filiali assomigliano più a un artefatto della generazione del codice del compilatore. – sthiers

+0

Forse potresti aggiungere un breve estratto dell'IL decompilato, per noi che sono troppo pigri per correre a VS. Sono sorpreso se i lambdas non vengono effettivamente generati al punto dell'inizializzazione statica per contare sulla complessità del costruttore statico. –

+0

L_0008: classe ldsfld Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_000d: brtrue.s L_0022 L_000f: ldnull L_0010: ldftn bool Foo.Class1 :: b__0 (string) L_0016: newobj esempio void [mscorlib] Predicate'1 :: ctor (oggetto, int nativo) L_001b:. classe stsfld [mscorlib] Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_0020: ampio s L_0022 L_0022: ldsfld class Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_0027: istanza callvirt void Generic.List'1 > :: Aggiungi (! 0) – sthiers

Problemi correlati