大きなC#アプリケーションをリファクタリングする必要があり、使用されていない関数がたくさんあることがわかりました。未使用のコードをチェックして、未使用の関数をすべて削除するにはどうすればよいですか?
大きなC#アプリケーションをリファクタリングする必要があり、使用されていない関数がたくさんあることがわかりました。未使用のコードをチェックして、未使用の関数をすべて削除するにはどうすればよいですか?
回答:
はい、ReSharperがこれを行います。ソリューションを右クリックし、[コードの問題を検索]を選択します。結果の1つは「未使用のシンボル」です。これにより、使用されていないクラス、メソッドなどが表示されます。
すばらしい質問ですが、ここで危険な海域を歩いていることに注意してください。コードを削除するときは、コンパイルとテストを頻繁に行う必要があります。
素晴らしいツールが思い浮かびます:
NDepend-このツールは素晴らしいです。少し時間がかかりますが、最初の10分が過ぎると、ほとんどの開発者は「ねじで締める」と言うだけだと思います。アプリを削除します。NDependの使い心地がよくなれば、アプリがどのように結合されているかについて驚くべき洞察が得られます。それをチェックしてください:http : //www.ndepend.com/。最も重要なのは、このツールを使用すると、直接の呼び出し元を持たないメソッドを表示できることです。また、アセンブリ内(またはアセンブリ間)の任意のメソッドの完全な呼び出しツリーの逆も表示されます。
どのツールを選択するにしても、軽く取るのは簡単ではありません。特に、ライブラリ型のアセンブリでパブリックメソッドを処理している場合は、アプリがそれらを参照しているときがわからない場合があります。
Jeffが指摘したように、ツールNDependは未使用のメソッド、フィールド、およびタイプを見つけるのに役立ちます。
少し詳しく説明すると、NDependはLINQクエリ(CQLinq)を介したコードルールを記述することを提案しています。約200のデフォルトコードルールが提案され、そのうち3つは未使用/デッドコード検出専用です
基本的に、たとえば未使用のメソッドを検出するこのようなルールは次のようになります。
// <Name>Dead Methods</Name>
warnif count > 0
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m
しかし、このルールは素朴であり、ささいな誤検知を返します。メソッドが呼び出されないが未使用ではない多くの状況があります(エントリポイント、クラスコンストラクター、ファイナライザー...)これが、3つのデフォルトルールがさらに精巧になる理由です。
NDependはVisual Studio 2017、2015、2013、2012、2010に統合されているため、これらのルールはIDE内で直接確認/参照/編集できます。このツールはCIプロセスに統合することもでき、違反したルールや原因のコード要素を示すレポートを作成できます。NDependには、VS Team Services拡張機能もあります。
これらのルールのソースコードに向けて上記の3つのリンクをクリックすると、型とメソッドに関するリンクが少し複雑であることがわかります。これは、未使用の型とメソッドだけでなく、未使用の無効な型とメソッド(再帰的)によってのみ使用される型とメソッドも検出するためです。
これは静的分析であるため、ルール名の潜在的なプレフィックスです。コード要素がリフレクションを通じてのみ使用される場合、これらのルールはそれを未使用と見なす可能性がありますが、そうではありません。
これらの3つのルールを使用することに加えて、テストによってコードカバレッジを測定し、完全なカバレッジを持つように努力することをお勧めします。多くの場合、テストでカバーできないコードは、実際には未使用/デッドコードであり、安全に破棄できることがわかります。これは、コードの分岐が到達可能かどうかが明確でない複雑なアルゴリズムで特に役立ちます。
免責事項:私はNDependで働いています。
真実は、ツールが100%確実な答えを与えることは決してないということですが、カバレッジツールはお金のためにかなり良い実行を与えることができます。
包括的な単体テストスイートを使用すると、テストカバレッジツールを使用して、テスト実行中に実行されなかったコード行を正確に確認できます。それでも、コードを手動で分析する必要があります。つまり、不要なコードと見なすものを排除するか、テストカバレッジを改善するためにテストを記述します。
そのようなツールの1つがNCoverであり、Sourceforgeにオープンソースの前駆体があります。別の代替手段はPartCoverです。
Stackoverflowでこの回答を確認してください。
FXCopはコードアナライザーです...未使用のコードを見つけるだけではありません。私はしばらくFXCopを使用しましたが、その推奨事項が失われ、アンインストールしました。
NDependはより有望な候補のように見えます。