2015-04-16 10 views
6

Ich habe eine Methode, die drei Parameter akzeptiert: List<Class1> source, List<Class2) results und DateTime endDate. Ich kann sehen, warum die Klassenkopplung vier ist. Allerdings springt er auf zehn wenn ich diese Aussage hinzu:Warum springt die Klassenkopplung, wenn ich LINQ verwende?

var warnings = from s in source 
    join r in results on s.Field1 equals r.Field1 into joined 
    from j in joined.DefaultIfEmpty() 
    where j == null 
    select string.Format("{0}{1}", A_CONSTANT, s.Field2); 

Meine Fragen:

  1. Was sind die sechs neuen Klassen, die von der LINQ-Anweisung eingeführt wurden?
  2. Und da zehn die Obergrenze für "guten Code" ist, gibt dies an, dass LINQ hier keine gute Wahl ist?

Antwort

5

Die sechs zusätzlichen Klassen sind möglicherweise:

  • IEnumerable<string> - das Ergebnis der Anfrage
  • IEnumerable<Class1> - die linke Sammlung
  • IEnumerable<Class2> - die richtige Sammlung
  • Func<Class1, int> - der linke Teil des Join-Ausdrucks
  • Func<Class2, int> - der rechte Teil des Ausdrucks beitreten
  • Func<Class1, Class2, string> - der Vorsprung

Es ist auch möglich, dass es die Enumerable Klasse zählt schon seit der Abfrage statischer Erweiterung Methodenaufrufe übersetzt.

In beiden Fällen scheint die Codeanalyse die von Linq verwendeten Übergangsklassen nicht zu ignorieren (ob oder nicht strittig sein sollte). Mein Rat ist, es entweder zu ignorieren (vielleicht die Kupplung manuell zu zählen und den Unterschied festzustellen) oder ein besseres Analysewerkzeug zu finden.

Eine andere Frage wäre: Erhöht es Ihre Kopplung insgesamt? Ich vermute, dass mehrere dieser Klassen in Ihrer App verwendet werden. Daher kann es keinen signifikanten Unterschied in Ihrer Gesamtkopplung geben.

+0

Wenn Ihr Tool über Keyword-Implementierungen stolpert, ist es nicht weit genug fortgeschritten. Die Komplexitätsanalyse auf dieser Ebene kann bei der Codeüberprüfung mit dem Auge durchgeführt werden. – Gusdor