FxCopを試しました。未使用のプライベートメソッドは検出されますが、未使用のパブリックメソッドは検出されません。同じアセンブリ内から呼び出されないパブリックメソッドを検出するプラグインをダウンロードできるカスタムルールはありますか?
4 に答える
Corey、FxCopを使用した私の答えは、未使用のプライベートメンバーを削除することに関心があると想定していましたが、他のケースの問題を解決するには、NDependを使用してみてください。未使用のパブリックメンバーを検出するためのCQLを次に示します(以下にリストされている記事から採用)。
// <Name>Potentially unused methods</Name>
WARN IF Count > 0 IN SELECT METHODS WHERE
MethodCa == 0 AND // Ca=0 -> No Afferent Coupling -> The method
// is not used in the context of this
// application.
IsPublic AND // Check for unused public methods
!IsEntryPoint AND // Main() method is not used by-design.
!IsExplicitInterfaceImpl AND // The IL code never explicitely calls
// explicit interface methods implementation.
!IsClassConstructor AND // The IL code never explicitely calls class
// constructors.
!IsFinalizer // The IL code never explicitely calls
// finalizers.
出典:Patrick Smacchiaの「カップリング、デッドコード、設計上の欠陥、およびリエンジニアリングに関するコードメトリック。この記事では、デッドフィールドとタイプの検出についても説明しています。
(編集:回答をより理解しやすくしました)
2012年6月11日編集:未使用のコードに関する新しいNDepend機能について説明します。免責事項:私はこのツールの開発者の一人です。
2012年5月にリリースされたNDependv4以降、ツールはLINQクエリ(CQLinq)を介したコードルールの記述を提案しています。約200のデフォルトコードルールが提案されており、そのうち3つは未使用/デッドコードの検出専用です。
- 潜在的に死んでいるタイプ(したがって、未使用のクラス、構造体、インターフェース、デリゲートを検出します...)
- 潜在的に死んでいるメソッド(したがって、未使用のメソッド、ctor、プロパティゲッター/セッターを検出します...)
- 死んだ可能性のあるフィールド
これらのCQLinqコードルールは、以前のCQLルールよりも強力です。これらのルールのソースコードに向かって上記の3つのリンクをクリックすると、タイプとメソッドに関するものが少し複雑であることがわかります。これは、未使用のタイプとメソッドだけでなく、未使用のデッドタイプとメソッド(再帰的)によってのみ使用されるタイプとメソッドも検出するためです。
これは静的分析であるため、ルール名にプレフィックスが含まれている可能性があります。コード要素がリフレクションによってのみ使用される場合、これらのルールはそれを未使用と見なす可能性がありますが、そうではありません。
これらの3つのルールを使用することに加えて、テストによってコードカバレッジを測定し、完全なカバレッジを実現するように努めることをお勧めします。多くの場合、テストでカバーできないコードは、実際には未使用/デッドコードであり、安全に破棄できることがわかります。これは、コードのブランチに到達できるかどうかが明確でない複雑なアルゴリズムで特に役立ちます。
メソッドが使用されておらず、公開されている場合、FxCop は、外部のものがアクセスできるように公開したと見なします。
未使用のパブリック メソッドが原因で FxCop 警告が発生し、API などを作成するのは面倒です。他のユーザーが使用する予定のメソッドに対して、大量の FxCop 警告が表示されます。
アセンブリ/exeにアクセスするために外部のものを必要としない場合は、検索と置換public
を検討してくださいinternal
。アプリケーションは同じように実行され、FxCop は参照されていない内部メソッドを見つけることができます。
外部アクセスが必要な場合は、どのメソッドが本当に外部に必要かを見つけ、残りをすべて内部にします。
外部から見えるようにするメソッドには、単体テストも含めることができます。
NDependはこの種のことのあなたの友達です
public メソッドが使用されていないことをどのように知るのでしょうか?
メソッドを public としてマークすると、ライブラリを参照するすべてのアプリケーションからアクセスできます。