どのようなツールであっても、その使い方を知っている開発者が手にして初めて効果をもたらす。NDepend(リンク)は強力なツールであるが、NDependが扱うソフトウェアメトリクスを理解するアーキテクトや開発者はあまりにも少ない。
今年の1月、製品NDependがどのようなもので、優れたソフトウェア構築にどのように役立つのかを理解するため、NDependチームのPatrick Smacchia氏と話をした(参考記事・英語)。その後、NDependは複数のアップデートを行い、以下のような多くの機能を誇っている。:
- コードクエリ言語(CQL:Code Query Language) (リンク)
- コンペアビルド(Compare Build) (リンク)
- 82コードメトリクス (リンク)
- 複雑性と依存性の管理 (リンク)
- 依存循環検出 (リンク)
- ハーネステストカバレッジデータ (リンク)
- 不変性(Immutability)と純粋性(Purity)の強化 (リンク)
- ビルドプロセスの健全性に関する警告 (リンク)
- ビルドプロセスからのカスタムレポート生成 (リンク)
- ダイヤグラム (リンク)
- 実環境に対応する機能 (リンク)
NDepend概要
ドイツの.NET開発者、Andre Loker氏(リンク)は、最近、NDepend利用に関する開発者の視点での優れたチュートリアル(リンク)を作成した。Andre氏のチュートリアルは、チームに対するNDependの貢献、ツールに期待すること、および、最良の利用方法について解説している。NDependのメトリクスは特に興味深い:
- 求心性結合(Ca:Afferent coupling)
このメトリクスは、所定の型またはメソッドを使用する現在のアセンブリの外部からの型およびメソッドの数を表す。この値が高ければ高いほど、アセンブリ利用者にとって、所定の型またはメソッドが重要である。- 遠心性結合(Ce:Efferent coupling)
Caに対応するメトリクス。このメトリクスは、特定の型/メソッドが使用する、アセンブリ外部の型/メソッドの数を示す。この値が高い場合は、特定の型/メソッドが外部アセンブリへの依存が高いことを示している。- 関係結合性(H:Relational cohesion)
1つのアセンブリ内の複数の型の相互関係性の強さを表すメトリクス。一般に、アセンブリ内の型は、関係が強いことが望ましいが、強すぎてははらない。- 不安定性(I:Instability)
あるアセンブリが、依存するアセンブリの変更にどれほど影響されるかを示すメトリクス。遠心性結合(Ce)と合計カップリング(Ca+Ce)の商で算出される。- 抽象性(A:Abstractness )
アセンブリの抽象型の割合を示す。- メインシーケンスからの距離(D)
不安定性と抽象性は、一種のバランスにある必要がある。私自身の言葉で説明すれば、このバランスは次のようなものである。抽象性の高いアセンブリは、他のアセンブリの入力アセンブリとして使用されることが多いため安定性が高い。もしもそのアセンブリが不安定であれば多くの場合、遅かれ早かれ変更の必要があり、その変更はこのアセンブリに依存するアセンブリ全体に波及する。一方、非常に具体的な(抽象性の低い)アセンブリは、依存図の端にあることが多く、そのため、それに依存するアセンブリはほとんどない。したがって、非常に不安定である。- 結合性の欠如Lack of cohesion (LCOM)
コヒーレントな(coherent)クラスでは、大部分のメソッドは、そのクラスのフィールドを処理する。クラスのメソッドの多くがフィールドのサブセットだけを処理している場合は、クラスの責任範囲が広すぎ、クラスを分割する必要があることを示している可能性がある。- 循環的複雑度(CC:Cyclomatic complexity )
このメトリクスはメソッドが持つパスの数を示す。メソッドの制御フローは各条件文、ループ、その他の文で分岐する。CCが高いメソッドほど維持が難しい。
NDependの利用
Andre氏のチュートリアルは、ユーザがツールをまったく知らないという前提で、NDependの使用方法に関して一からあらゆる点を網羅している。Andre氏はNDependを用いて、ユーザを第一歩から始めさせる:
プロジェクトの作成
プロジェクトの作成は簡単で、次の2モードうちのいずれかで実行できる。:
Visual NDependは2つの操作モードをサポートしている。2つの違いは、プロジェクトファイルを明示的に作成するかどうかだけである。すぐに解析を行う場合は、単にメニュー「Select .NET assemblies」を選択する。これによって、明示的にプロジェクトファイルを作成することなく解析を実行できる。もう一つのオプションは明示的にプロジェクトを作成することで、解析を2回以上実行する必要がある(継続的なビルドなど)場合に推奨される方法である。
一度すべてのアセンブリが選択されたら、Run Analysis(解析を実行)を選択してプロセスを開始する。
Result(結果)ウィンドウ
Resultウィンドウが、NDependの本体である。チュートリアルに示されるように、様々なウィンドウによって、NDependが伝える内容の理解を促進している。以下の各ウィンドウは情報の重要な部分を示している。:
- Class Browser(クラスブラウザ)
- Metrics(メトリクス)
- Info(情報)
- Dependencies(依存性)
CQLクエリ
Andre氏はNDependのこの部分を使って、アセンブリのほとんどの情報をレポートすることを好む:
正直にいって、この機能は本当にすばらしい! NDependは多くのメトリクスを吐き出すが、ソースコードに関して必要な情報の大部分を集めることのできる強力なクエリ言語も提供している。
CQL (Code Query Language)はSQLに似たクエリ言語で、私たちの大部分がSQLに慣れているのでSQLは最もクールな言語である。CQLを使用するとメトリクスの大きな集合に問い合わせができる。このクエリ言語がいかに複雑であるかは、CQLの定義を一目見るだけで分かる(リンク)。
簡単なCQLクエリの例を示す:
1: SELECT TYPES WHERE NbFields > 6
CQLは、多くの開発者が毎日使用するT-SQLクエリに類似しているため、CQLの習得はとても簡単である。
HTMLレポート
プロジェクトアセンブリの解析結果とそれをHTMLに静的に保存することは、その時点でのプロジェクトの状態を知る非常に優れた方法である。チュートリアルでは、レポートに保存する重要なメトリクスを以下のように指摘している:
- 全般的な利用メトリクス
- コードの行数
- IL命令(IL instruction)数
- コメントのある行の数、コメントの割合
- アセンブリ、種類、インタフェース、構造体などの数
- パブリックタイプとパブリックメソッドなどの割合
- タイプごとのフィールド数、タイプごとのメソッド数などの平均。
- アセンブリごとのメトリクス
- LOC、IL命令数、...
- 結合メトリクス(Ca、Ce、関係結合性、不安定性、抽象性、不安定性-抽象性-バランス)
- アセンブリ依存性
- CQLクエリおよび制約結果
- 不成功の制約に対する警告
- メトリクスの種類
- LOC、IL命令数...
- 結合メトリクス(Ca、Ce、結合性の欠如...)
- 循環的複雑度
- 直接派生クラス数と間接派生クラス数、インスタンスツリーの深さ
- 依存性の種類(当初は利用できない)
- どの型がどの型に依存しているかを規定する
レポートには依存性ビュー(Visual NDepend のMetricsウィンドウと同様)、依存性図(Visual NDepend のMetricsウィンドウと同様、ただし64ビットをサポートしない)、および、抽象性と安定性のバランスを示すグラフも含まれている。
NDependの最適な利用方法については、Andre Loker氏のブログ(リンク)のチュートリアル全体を参照のこと。NDependの詳細については、NDependのWebサイト(リンク)を参照のこと。