Laden...

Unbenutzten Code finden

Erstellt von Golo Roden vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.733 Views
Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 14 Jahren
Unbenutzten Code finden

Hallo,

ich möchte innerhalb einer Solution alle Methoden ermitteln, die aus keinem der enthaltenen Projekte aufgerufen werden.

Natürlich kann ich Methode für Methode durchklicken und ein "Find all References" oder ein "Find Usages" (R#) machen - nur würde ich das gerne automatisieren.

Ich bin bereits auf NDepend gestoßen, was das kann, aber NDepend finde ich jedes Mal, wenn ich es mir angucke, mehr als umständlich 😦

Kennt jemand eine einfache, leichtgewichtige Alternative?

Viele Grüße,

Golo

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

T
433 Beiträge seit 2006
vor 14 Jahren

Hallo Golo,

mit R# 4.5 kannst du per Solution-Wide Analysis 'Unused public methods' anzeigen lassen.
Dazu einfach nur unten rechts den grauen Kreis doppelklicken.

Die Namen der nicht genutzten Methoden werden dann wie bei unused private methods grau dargestellt.

Edit: Für eine Auflistung aller nicht genutzten Methoden wirst du auf R#5 warten müssen. Die Entwickler meinten das sie das implementieren möchten. (Keinesfalls offiziell angekündigt 😃)

Gruß,
Tom

5.742 Beiträge seit 2007
vor 14 Jahren

Insbesondere, wenn man Reflection verwendet (bzw. manche Member ausschließlich damit aufruft), sollte man aber aufpassen - daran scheitert verständlicherweise auch der ReSharper.

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo Golo,

du könntest jede Methode mit einem Breakpoint versehen und während des Debuggens beim Erreichen eines Breaktpoints diesen entfernen dann bleiben jene Methode über welche nie erreicht werden 😁

Ernsthafterer Vorschlag:

Im Zuge der Verwendung von PEX hab ich sowas mal auch gemacht. Jene Methode welche dort keine Coverage haben werden nicht benötigt. Im Zweifel kann dies durch auskommentieren und kompilieren bestätigt werden.

Sollte es sich um eine Art Framework o.ä. handeln ist damit aber vorsicht geboten. Aber das ist dir eh klar 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

2.921 Beiträge seit 2005
vor 14 Jahren

Das könntest Du mind. auf 3 verschiedene Arten machen:

1.) Benutze Gendarme und erstelle eine entsprechende Regel die Dir das anzeigt.

2.) Benutze FxCop von Microsoft und mache damit genau dasselbe.

3.) Benutze NDepends (Trial Version) die kann Dir das anzeigen was nicht benutzt wird und schon hast Du die Sachen gefunden.

3.) ist imho momentan die einfachste und schnellste Methode die ich kenne, da Du ja bei 1.) und 2.) die Regeln brauchen würdest.

EDIT: Upps hab jetzt gerade erst gelesen, dass Du NDepend ja schon entdeckt hattest...

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

U
1.578 Beiträge seit 2009
vor 14 Jahren

aber auch beim zusammenspiel mit wpf ist vorsicht geboten
wenn zb eine methode ueber n command von einer ui aus aufgerufen wird, gibt es (womoeglich) keinen direkten caller der methode
dann kann es sein das es gekillt bzw als unused markiert wird obwohl gebraucht

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 14 Jahren

Hallo zusammen,

ich habe mal versucht, eine entsprechende Regel für FxCop zu schreiben - ist prinzipiell nicht schwer, und ein paar Sonderfälle (Main-Methode zB, Typinitialisierer, ...) lassen sich schnell herausfiltern.

Funktioniert so weit wunderbar.

Das Blöde ist: Alle Methoden, die zB direkt aus dem Framework (zum Beispiel von ASP.NET) aufgerufen werden, haben "angeblich" auch keinen Caller ...

Wie könnte man ermitteln, ob eine Methode irgendwie aus dem Framework aufgerufen wird?

Viele Grüße,

Golo

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

5.742 Beiträge seit 2007
vor 14 Jahren

Kann man in einer FxCop-Regel prüfen, ob ein Member eine Interfaceimplementierung eines Interfaces aus der FCL ist?
Dann hätte man schonmal ein paar Fälle aussortiert.

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 14 Jahren

Ja, das kann man prüfen ... die Frage wäre halt nur, welche Interfaces man da aufnehmen sollte.

Spontan fällt mir erst mal nur IDisposable ein.

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

916 Beiträge seit 2008
vor 14 Jahren

@Golo Roden
kennst du ein gutes Turorial um mal eine FxCop regel selber zu schreiben? bzw. kannst du die regel die du für das nicht aufrufen der Methoden definieriert hast hier veröffentlichen?

Again what learned...

5.941 Beiträge seit 2005
vor 14 Jahren

Salute rollerfreak2

Den Link hab ich grad von Golo bekommen:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

5.742 Beiträge seit 2007
vor 14 Jahren

die Frage wäre halt nur, welche Interfaces man da aufnehmen sollte

Alle öffentlichen?
Also irgendwie per Reflection beziehen.

916 Beiträge seit 2008
vor 14 Jahren

Salute Peter und Golo,

und besten Dank

Again what learned...

916 Beiträge seit 2008
vor 14 Jahren

Hallo ich bins noch mal. ICh hab ein kleines Problem bezüglich dem was golo vor hatte. Ich hab mir mal eine Regel geschrieben die mir alle Methoden anzeigt welche keinen "caller" haben. In der public override ProblemCollection Check(Member member) check ich ob dort eine methode als member übergeben wird. Wenn ja wie kann ich jetzt prüfen ob im gesamten Code diese Methode nun gecalled wird oder nicht?

Again what learned...