Visual Studio 2012 - Finden Sie kreisförmige Referenzen effizient

8

Wenn ich jetzt nach zirkulären Referenzen innerhalb einer Lösung suchen möchte, wähle ich Architecture - Generate Dependency Graph - For Solution . Dann wähle ich auf der neuen Registerkarte Layout - Analyzers - Circular References Analyzer . Schließlich, wenn ich von den einzelnen Baugruppen einen Drilldown ausführe und es kreisförmige Referenzen gibt, kann ich sehen, dass sie in der Grafik rot hervorgehoben sind und sie auch als Warnungen in der Fehlerliste erscheinen.

Da ich beabsichtige, selbst zwischen Methoden derselben Klasse Zirkelbezüge zu erkennen, ist dies ziemlich fehleranfällig und zeitaufwendig auf einer gemäßigt großen Codebasis.

Ich würde gerne wissen, ob es eine Möglichkeit gibt, alle Warnungen auf einmal zu erhalten, ohne die Knoten zu erweitern oder die Hervorhebung für Elternknoten zu aktivieren, so dass ich nur auf Assemblies, die sicher Zirkelverweise enthalten, Drilldown ausführen kann .

NDepend sollte in der Lage sein, zu helfen, aber ich bevorzuge es, die Dinge so einfach wie möglich zu halten, so dass ich immer vorsichtig bin, zusätzliche Tools zu übernehmen.

    
RobSullivan 27.02.2013, 10:29
quelle

1 Antwort

6

Ja NDepend kann Zirkuläre Referenzen effizient finden Lassen Sie mich erklären, wie es einfacher sein könnte, als Sie vielleicht denken ( Disclaimer: Ich bin einer der Entwickler von NDepend ). Bisher können Sie Namespace Abhängigkeitszyklus out-of-the-box finden, aber wie ich weiter unten erläutere, ist es einfach, Zyklen zwischen zu finden Typen in einem Namespace oder Methoden eines Typs.

Es gibt eine C # LINQ-Standardcoderegel , die Namespaces-Abhängigkeitszyklen auflistet. Ein solcher Zyklus kann dann in den Abhängigkeitsgraphen oder die Abhängigkeitsmatrix exportiert werden. Hier ist ein Screenshot der Regel, die auf der Roslyn-Codebasis CTP Juni 2012 ausgeführt wurde (die Ausführung dauerte nur 16 Millisekunden). Es hat 11 verschiedene Zyklen gefunden, und wie auf dem Screenshot gezeigt, können Sie in jedem Zyklus einen Drilldown durchführen und einen Zyklus in den Graphen exportieren:

Hier ist ein Abhängigkeitsdiagramm des 7 Namespaces-Zyklus. Beachten Sie, dass es komplizierter aussieht als nur ein klassischer O-Ring-Zyklus. Der Schlüssel hier ist, dass Sie von jedem dieser Namespaces alle anderen erreichen können. Dies ist der verallgemeinerte Begriff des Zyklus (Verschränkung).

Der Code der standardmäßigen C # LINQ-Coderegel , die Namespaces aufzeigt, kann sich entmutigend auswirken auf den ersten Blick. Aber ein C # -Entwickler sollte es in ein paar Minuten verstehen und dann leicht anpassen können, um jede Art von Abhängigkeitszyklus zu finden.

Um zum Beispiel Methoden gleicher Typenzyklen (statt Namespaces derselben Assemblierungszyklen ) zu finden, ist es fast so einfach, wie alle Namespaces zu ersetzen. em> Wort von Methode und Assembly Wort von type .

%Vor%

... und so sieht das Ergebnis dieser Regel aus (immer noch mit der Möglichkeit, den Methodenzyklus in den Abhängigkeitsgraphen oder die Matrix zu exportieren). Da die Anzahl der Methoden und Typen viel höher ist als die Anzahl der Namespaces und Assemblys, dauerte diese Abfrage 10 Sekunden, um auf einer großen Codebasis wie Roslyn (statt 16ms für Namespaces) ausgeführt zu werden das Ausführungsintervall für die CQLinq-Abfrage (standardmäßig 2 Sekunden).

Um vollständig zu sein, habe ich festgestellt, dass der Zyklus meistens durch einige bidirektionale Referenzen hervorgerufen wird (d. h. A verwendet B, B verwendet A). Daher ist das Entfernen bidirektionaler Referenzen das erste, was zu tun ist, um den Zyklus zu unterbrechen. Aus diesem Grund haben wir die CQLinq-Standardregel Namespaces vermeiden, die sich gegenseitig bedingen , an die noch angepasst werden kann Typen oder Methodenzyklen.

    
quelle