C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2008/08/03 00:15
NDepend というコードメトリクスツールがあります。
コードメトリクスツールとは、コードの品質を測定するツールです。品質を測定することで、コードの改善点を見つけ出し、リファクタリングに繋いでいきます。
例えば、20行を超えるメソッドを (ツールで) 見つけ出し、メソッドの細分化を (プログラマが) 行う、といった具合です。

NDepend は有償ですが、それだけの価値があるツールです。
実際に見てみましょう。


0. ソリューションの用意

新規作成直後のコンソールアプリケーションプロジェクトが 1 つだけ含まれるソリューションを用意してください。今回はこのソリューションを測定します。


1. NDepend プロジェクトの作成

まず、NDepend プロジェクトを作成します。
ツールメニューの [File] - [New Project] をクリックすると、NDepend プロジェクトの名前と保存場所を設定するダイアログが表示されます。



名前と保存場所を入力して [OK] ボタンをクリックすると、NDepend プロジェクトが作成され、画面が次のように変化します。




2. 測定対象アセンブリの設定

次に、測定対象のアセンブリを設定します。
設定の方法はいくつかあるのですが、今回はソリューションファイルで指定します。
[.dd Assemblies of a VisualStudio Solution] ボタンをクリックすると、ファイル選択ダイアログが表示されますので、ソリューションファイルを選択し [OK] ボタンをクリックしてください。



ソリューションファイルで指定すると、ソリューションに含まれている各プロジェクトの出力アセンブリが自動で追加されます。出力アセンブリが見つからないとアセンブリ名の左にエラーマークが表示されます。その場合は、ソリューションのビルドをしてから [Reflesh] ボタンをクリックしてください。




3. 分析の実行

測定対象を設定したら、とりあえず分析を実行します。
ツールメニューの [Analysis] - [Run Analysis on Current Project] をクリックすると分析が開始します。
コンソール画面が表示され、しばらく経つとブラウザでレポートが開かれます。



スクロールするとわかりますが、色々な情報が出力されてます。 (この記事では、これらを細かく解説しません。)


4. CQLのカスタマイズ

NDepend では、測定に CQL という独自のクエリーを使用します。この CQL は SQL に近い文法で、とても簡単に扱うことができます。先ほどの例で挙げた「20行を超えるコードメソッド」を見つけ出すには、

SELECT METHODS WHERE NbLinesOfCode > 20

といった CQL を書きます。 (この記事では、CQL について細かく解説しません。)
では、NDepend に戻ってください。



画面が分析実行前とは違う画面に変化しています。これが NDepend のメイン画面です。
複数のビューがありますが、最も重要なのは画面下の CQL Queries ビューです。ここで CQL の管理を行うわけです。
NDepend では、最初からたくさんの CQL が用意されてますが、今回はこれらの CQL を全て削除してしまいましょう。CQL Queries ペインの左部に列挙されているカテゴリを、[Delete Group] ボタンにて一つずつ削除してください。 ("Constraints extracted from Source Code" は削除できません。)



では、「20行以上のコードで記述されているメソッド」を見つけ出す CQL を追加しましょう。
まず、[Create Group] ボタンにてカテゴリを作成します。今回は名前はそのままでいいです。
次に、[Create Query] ボタンにて CQL を作成します。すると CQL Queries ビューが CQL エディタに切り替わります。



ここで、「20行を超えるメソッド」を見つけ出す CQL を記述するのですが、先ほどの CQL をそのまま記述すると、「20行を超えるメソッド」が見つかっても警告されません。なので、先ほどの CQL の先頭に "WARN IF Count > 0 IN" を加えた CQL を記述してください。これで、1 件でも見つかったら警告されます。
それと、コメントで Name という XML 要素を記述すると、CQL に名前を付けられますので、"Test CQL" と記述しておいてください。

// <Name>Test CQL</Name>
WARN IF Count > 0 IN SELECT METHODS WHERE NbLinesOfCode > 20



記述しましたら、[Save changes] ボタンにて保存します。


5. 測定結果の確認



#Items 欄を見てください。CQL の該当件数が表示されています。CQL の実行は即座に行われ、分析を再実行する必要はありません。
「20行を超えるコードで記述されているメソッド」は現在 0 件のようです。ではここで、ワザと 20 行を超えるコードを用意しましょう。Main メソッドに Console.WriteLine() を 30 行分記述してください。
コードを記述してビルドを行ったら、再び分析を実行してください。すると、レポートが表示されますが、これはひとまず置いておいて、 NDepend にすぐ戻って #Items 欄を見てください (分析結果をロードするかどうかの確認ダイアログが表示されますが OK をクリックしてください。)。



今度は 1 件見つかってます。また、カテゴリと CQL に警告マークが表示されています。
CQL にフォーカスして、左上の CQL Query Result ビューをみてください。ここには、選択した CQL に該当するメソッドが表示されます。

これで、「20行を超えるコードで記述されているメソッド」を検出することができるようになり、しかも該当メソッドが一目でわかるようになったわけです。あとは、検出されるたびに該当メソッドをリファクタリングすることで高い品質を保つことができるというわけです。

先ほど後回しにしたレポートも見てみましょう。[CQL Queries and Constraints] という欄までスクロールしてください。



こちらでも、同様のことが確認できますね。カテゴリと CQL は (警告を表す) 黄色で表示されてます (CQL は警告のみが列挙されます)。また、該当のメソッドも確認できます。


[ 最後に ]

CQL は実に様々な条件を表現できますし、習得は本当に容易です。また、今回はわかりやすくするために削除してしまいましたが、標準でたくさんの CQL が用意されています。今回記述した CQL も、実は標準で用意されてたりします (20 行ではなく 30 行ですが)。
それと、NDepend は Cruise Control.NET などの継続的インテグレーションツールと連携させることができますので、定期的且つ自動的なコード測定も可能です。

NDepend を使えばコードの品質を保ち易くなります。是非、活用してください。











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/215-4e1f33d6