NDepend First Impression

件のNDependだが、とりあえず使ってみた感想を書いてみる。

インストール自体は公式サイトからダウンロードしたバイナリを適当な場所に配置するだけ。VisualStudioとReflector.NETへのアドイン追加は手動でやる必要がある。

コードを解析を実行するには、簡単は方法ではVisualStudioでプロジェクトを選択して、「Go To VisualNDepend」を選択すればいい。これでシームレスにVisualNDependが起動して、すぐにコード解析を実行してくれる。

今回はこの方法を使用せずに、まずVisualNDependを起動してから「New Project」でNDependプロジェクトを新規作成して、マニュアルで解析するアセンブリを追加していく方法をとった。こっちの方が細かい設定ができるので個人的にはやりやすい(出来ることは変わらないけど)。

で、コード解析が終了するとHTMLのレポートとVisualNDependのGUI上に様々な情報が表示される。

NDependには大きく分けて三つの機能がある。

  1. アセンブリ間の依存関係分析(Dependencies
  2. 各コード要素*1の全体に占める割合をグラフィカルに表示(Metrics
  3. 特定のコード要素を検索して統計する(CQL Queries

アセンブリ間の依存関係分析

これはDependenciesタブ*2に切り替えると表示される。
ここではクラス間の依存関係のみを表示するために「Weight on Cells」を「Direct: # types」に切り替える。

Dependecies ウィンドウ

縦軸には解析したアセンブリとそれらに使用されている全てのアセンブリが、横軸には解析したアセンブリのみが表示される。

わかりやすく説明すると、アセンブリAには以下のクラスが

namespace A {
    class HogeA {
    }
}

アセンブリBには以下のクラスが定義されているとする。

namespace B {
    class HogeB {
        void Do() {
            new HogeA();
        }
    }
    class HogeC {
        void Do() {
            new HogeA();
        }
    }
}

HogeBとHogeCクラスはそれぞれHogeAクラスを参照している。HogeAはHogeBとHogeCに参照されている関係といえる。

この時の依存関係は以下のようになる。

A B
A 1
B 2

これを理解するだけで結構時間がかかった。

これでアセンブリ間の結合度合いを見たり、循環参照が無いかどうかをみたりするわけですな。アセンブリを他と切り離して独立させる時とかに役立つかもしれん。

各コード要素の全体に占める割合をグラフィカルに表示

Metricsタブに切り替えると表示される。

Metrics ウィンドウ

これは正直何に使えるのかわからない。

特定のコード要素を検索して統計する

CQL Queriesタブに切り替えると表示される。

CQL Queries ウィンドウ

これはCQL(Code Query Language)というNDepend独自のクエリ言語を使って、コード要素を検索する機能。

例えば定義されているインターフェースで「I」で始まっていないものだけを検索する場合、以下のように書く。

WARN IF Count > 0 IN SELECT TOP 10 TYPES
    WHERE IsInterface AND !NameLike "^I" AND !IsNested AND !IsInFrameworkAssembly

この条件にマッチしたインターフェースがあればCQL Query Resultウィンドウに一覧が表示される。CQL Query Resultウィンドウには簡単な統計機能が付いているので、あとでまとめる時に役立つと思う。

こういった検索条件がグループで分けられて、いくつか定義されている。

例えば、「Source Code Quality constraints」グループには、

  • Methods too big(メソッドがでかすぎる)
  • Methods too complex(メソッドが複雑すぎる)
  • Methods poorly commented(メソッドのコメントが貧弱すぎる)

が定義されている。

この条件は後からいくらでも追加、編集が出来るので自分ごのみにカスタマイズすることができる。

このへんはFxCupなどと変わらないように思えるけど、FxCupで独自のルールを定義しようと思うとC#などの.NET対応言語でDLLを作る必要があったけど、NDependではCQLを使って書けるのでお手軽ではある。

NDependを使う利点はCQLを使ったルールの記述の簡便さと柔軟性にあるんだろう。結局のところ、これを魅力的に思うかどうかがNDependを導入するかどうかの分かれ目になると思う。

ということで次からCQLを使って俺様ルールを作っていく。あといくつかNDependに対して要望事項があるので、それも書いていく。

*1:アセンブリ、クラス、メソッドなど

*2:リボンインターフェース使用時