Eclipseプラグインで提供されるテストツールが充実してきた。本連載では、システム開発の現場に有効なテストツールを紹介し、統合開発ツールにEclipseを選択する開発におけるテストの効率化、ソフトウェア品質の向上のヒントを提供する。(編集部)
前回の記事ではソースコードのスタイルチェックやバグ検出を行う静的解析ツールを紹介しました。今回は、ソースコードの複雑さなどを計測するメトリクス計測ツールを紹介します。メトリクスを計測することにより、ソースコードの構造上の問題点を把握し、品質の評価および向上につなげることができます。今回は、Eclipse Metrics Plugin(2種類)、CAP、JDepend4Eclipseの4ツールを紹介します。
ソフトウェアのメトリクスとは、ソフトウェアを計測する方法およびその尺度のことを意味します。今回紹介するメトリクス計測ツールは、ソフトウェアの構成要素であるソースコードを計測し、数値化を行います。メトリクスを計測し、複雑過ぎるロジックや洗練されないパッケージ構成を見直すことで、バグが少なく保守性が高いソースコードを維持できるようになります。
コーディングをする際に、必要な機能を実装することを第一に考えているうちに、無駄に複雑な処理ロジックを記述してしまったり、設計していたクラス構造を崩してしまったりといったことがしばしば起こります。後から機能を追加したりすると、その傾向はさらに顕著になります。
そういったソースコードの構造的な問題を確認するためにメトリクスが有効となります。メトリクス計測ツールによって計測できるメトリクスには、例えば以下のようなものがあります。
これらのメトリクスを用いると、特に以下の品質にかかわる問題を検出し、信頼性と保守性を高めることができます。
実際に計測されるメトリクスのうち、代表的なものをいくつか以下に紹介します。
(1)クラスやメソッドなどの数
パッケージに含まれるクラス数、インターフェイスや抽象クラスの数、クラスに含まれるメソッドの数、クラスに含まれるフィールド(属性)の数を計測します。また、フィールド数において、静的なもの(クラス変数)と静的でないもの(インスタンス変数)を別々に計測するツールもあります。
(2)クラスやメソッドの内部構造
・規模
ソースコードの行数を計測します。空行やコメント行を除いた行数を計測するのが一般的です。
・制御構造の複雑度
if文やwhile文などを基にしたソースコードのロジックの複雑さを計測します。ソースコードの経路数を表すマッケーブのサイクロマチック数や、ネストの深さなどがあります(図1)。複雑度を低くすることで、保守性や信頼性が向上します。
・凝集度
クラス内の機能のまとまり度合いを計測します。凝集度が高いと、まとまりのある良い設計といえます。メトリクスとしては、図2のようにクラス内のフィールドとのかかわりを基にしたメソッド間の関連の弱さ(凝集度の欠如)が計測されます。例えばJavaBeanの場合には図2の右側のような構造になってしまうように、クラスの特性によっては凝集度が低いことが必ずしも悪いとはいい切れません。
(3)パッケージ間やクラス間の依存関係
クラス間やパッケージ間の依存関係の強さを計測します。結合度が低いと、クラスごとの独立性の高い良い設計といえます。計測対象のクラスが依存するクラス数や、逆に依存されるクラス数などの種類があります。
さらに、依存関係が循環しているクラスやパッケージを検出します。依存関係の循環とは図3の左側のような関係の場合です。あるクラスを修正した場合、循環の関係上にあるほかのすべてのクラスに影響を及ぼすため保守性が低くなり、またあるクラスを再利用する場合には、循環の関係上にあるほかのすべてのクラスも必要となるため再利用性も低くなります。
今回は、Eclipseのプラグインとして無償で利用できる以下のメトリクス計測ツールを紹介します。
Eclipse Metrics Pluginという名前のプラグインは2種類あるため、ここではその作成者(提供元)によって区別して表記します。
各ツールについては、この後で詳しく紹介しますが、それぞれのツールで計測できるメトリクスの種類とツールの機能を比較すると表1のようになります。大きく分けると、Eclipse Metrics Pluginは2種類とも一般的なメトリクスの計測を得意としており、CAPとJDepend4Eclipseは依存関係の計測、検出を得意としていますので、何を計測したいかによって使用するツールを選ぶのがよいでしょう。
Eclipse Metrics Plugin(Frank Sauer) | Eclipse Metrics Plugin(Team in a Box) | CAP | JDepend4Eclipse | ||
---|---|---|---|---|---|
メトリクス | クラス、メソッドなどの数 | ○ | ○ | × | × |
クラス、メソッドの内部構造 | ○ | ○ | × | × | |
パッケージ間やクラス間の依存関係 | ○ | ○ | ○ | ○ | |
機能 | Eclipse上での結果の表示 | ○ | △(一部) | ○ | ○ |
レポート出力 | ○(XML) | ○(HTML、CVS) | × | ×(注) | |
計測対象のフィルタリング | × | ○ | ○ | × | |
メトリクス許容値(警告表示)の設定 | ○ | ○ | × | × | |
依存関係のグラフ表示 | ○ | × | ○ | × | |
循環する依存関係の検出 | ○ | × | ○ | ○ | |
Ant実行 | ○ | × | × | ×(注) | |
アップデート機能によるインストール | ○ | × | ○ | ○ | |
日本語化 | × | × | × | × | |
表1 メトリクス計測ツールの比較 |
<本稿で使用した検証環境>
Eclipse:eclipse-SDK-3.1.1-win32.zip
日本語化パック:NLpack1-eclipse-SDK-3.1.1a-win32.zip
計測したプロジェクト:Tomcat5.0.28のcatalina.jarのソースコード
Copyright © ITmedia, Inc. All Rights Reserved.