InfoQ

News

NDependおよびコードメトリクスの理解向上

作者 Robert Bazinet , 翻訳者 編集部 投稿日 2008年7月19日 午前6時9分

コミュニティ
.NET,
Architecture
トピック
コード分析
タグ
コードレビュー,
Code Profiler,
Code Coverage

どのようなツールであっても、その使い方を知っている開発者が手にして初めて効果をもたらす。NDepend(リンク)は強力なツールであるが、NDependが扱うソフトウェアメトリクスを理解するアーキテクトや開発者はあまりにも少ない。

今年の1月、製品NDependがどのようなもので、優れたソフトウェア構築にどのように役立つのかを理解するため、NDependチームのPatrick Smacchia氏と話をした(参考記事・英語)。その後、NDependは複数のアップデートを行い、以下のような多くの機能を誇っている。:

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サイト(リンク)を参照のこと。

原文はこちらです:http://www.infoq.com/news/2008/07/ndepend-tutorial

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
slashdot+
Hatena

特集コンテンツ一覧

Agile Japan 2009

2009年4月22日、東京千代田区にある放送会館で「アジャイルジャパン2009」が開催されました。本イベントは「ソフトウェア開発の次世代リーダーをつくる」ことを合い言葉に、200人以上の参加者を集めてスタートしました。

Flex 4の新機能トップ10

今週(2009年6月1日)AdobeはFlex 4の正式な初ベータ版をリリースしました。Flex 4はGumboというコードネームで開発されています。今回のリリースには大きな変更が多数含まれています。このRIAフレームワークの最新バージョンにおいて変更された事柄についての概要を以下のリストで見ていきましょう。

Domain Driven Design(ドメイン駆動設計) Quickly 日本語版

ビジネス領域の深い理解を反映したドメインモデルを設計するための、ヴィジョンとアプローチです。この本は、Eric Evans氏の「Domain Driven Design」の主要点を短く読みやすく要約しました。

JavaプログラマがFlexとBlazeDSを学んだ方がいい13の理由

この記事ではJavaプログラマがなぜFlexとBlazeDSを学ぶべきなのかについて13の理由を述べています。なぜ高度にインタラクティブなWeb サイトからJavaで開発されたバックエンドをもつエンタープライズ・アプリケーションまでを含む、リッチ・インターネット・アプリケーション(RIA)の開発にFlexとBlazeDSの組み合わせが最適な選択肢となるのかについて述べています。

仮想パネル: バックログは重要な成果物とプラクティスか、それとも無駄か?

Mary Poppendieck氏、Ron Jeffries氏、Jeff Patton氏、David West氏、Steve Freeman氏、Jason Yip氏が、バックログに関する彼らの意見とアジャイルチームを成功させるために必要な事を語った。

Perf4Jを使ったパフォーマンス解析とモニタリング

この記事ではAlex Devine氏が、Java開発者がPerf4Jをどのように利用できるかと、タイミングステートメントにコードを追加し、ロギング、結果の解析とモニタリングを行うオープンソースツールセットの説明をします。

複雑な外部DSLを開発する

本稿では、Vaughn Vernon氏が内部DSLと外部DSLの違いを説明し、複雑な外部DSLを開発する際のステップを示します。

J2EEアプリケーションにおけるAOPを使ったフェッチ戦略の実装

この記事では低レベルのサービス・レイヤやリポジトリ・レイヤを肥大化させることなく、フェッチング・ストラテジによってモジュール化された方法でバックエンドにあるシステムからデータを取得する処理を最適化する方法について説明します。