2010-10-26 45 views
6

Lambdalarla listenin başlatılması, yüksek IL siklizik karmaşıklığına neden olur: neden ve bu karmaşıklığı nasıl kaldırırsınız? Örneğin, aşağıdaki kod, sınıfın statik oluşturucusunun (aslında derleyicinin oluşturduğu) çok karmaşık olmasını sağlar: 1 + liste sayısı.Listenin lambda ile başlatılması neden yüksek çevrimsel karmaşıklığa neden oluyor?

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

Not: karmaşıklığı NDepend

cevap

2

Neden ile hesaplanır? ILCC farklı atlama/şube hedeflerinin sayısı olarak tanımlandığından. Başlatmakta olduğunuz bu liste, lambdaların içinde bulunan bir çok/sonra mantık içeriyor. Ben dil bağımlı CC daha düşük olduğunu farz ediyorum?

Yüksek cyclomatic complexity sadece ipucu ipucu fonksiyonlarınızın aşırı karmaşık olduğunu ve bu nedenle anlamak ve korumak ve test etmek zor olduğunu. Bu ipucunun bu durumda doğru olup olmadığı, bu yüklemelerin listesini nasıl kullandığınıza bağlı olacaktır. Ama bu sadece bir ipucu. CC'nin düşük tutulması doğanın bir kanunu olarak görülmemelidir. Kodun sürdürülebilir ve test edilebilir olduğunu düşünüyorsanız, belgelerinizdeki yüksek ILCC'yi not edin, neden önemli olmadığını açıklayın ve devam edin.

+0

Aslında kodu koda dönüştürürsem ve iyi bir şekilde anladığımda IL (bu konuda bir kuklaım), lambdalar ayrı olarak oluşturulmuş gibi görünüyor. Dallar, derleyici kod nesnesinin bir eseri gibi görünüyor. – sthiers

+0

Belki de VS'ye koşmak için çok tembel olan, decompiled IL'nin kısa bir özünü ekleyebilirsiniz. Lambacılar statik yapıcı karmaşıklığına doğru saymak için statik başlatma noktasında gerçekte üretilmezse şaşırdım. –

+0

L_0008: ldsfld sınıfı Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_000d: ldnull L_0010: ldftn bool Foo.Class1 :: b__0 (dize) L_0016: newobj örneği L_0022 L_000f brtrue.s . stsfld sınıfı [mscorlib] Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_0020: L_0022 L_0022 gn [mscorlib] Predicate'1 :: ctor (nesne, yerli int) L_001b geçersiz: ldsfld sınıfı Predicate'1 Foo.Class1 :: CS $ <> 9__CachedAnonymousMethodDelegate12 L_0027: callvirt instance void GenelerikList'1 > :: Ekle (! 0) – sthiers

İlgili konular