ConQATを利用してソースコードの品質をチェックする

ある程度プログラマーとして経験を積めば、ソースコードを読んだときに、そのソースコードの良し悪しというものは、嗅覚を使って直感的に嗅ぎ分けることができるものです。実際、そのように体の感覚を使ってこのコードは不吉だと感じるところは実際大いにあり、コードの臭い(code smell)として知られています。
コードの臭い - リファクタリングの必要性を示す兆候
これはファウラーの名著

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

  • 作者: マーチンファウラー,Martin Fowler,児玉公信,平澤章,友野晶夫,梅沢真史
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/05
  • メディア: 単行本
  • 購入: 94人 クリック: 3,091回
  • この商品を含むブログ (312件) を見る
でも紹介されており、こういった不吉な部分を適切に嗅ぎ分けて、リファクタリングしていくスキルというのは、プログラマーにとって欠かすことのできない大切なスキルだと思います。
しかしながら、SI業界の多くの開発組織では、技術者としてPGのスキルや意見を尊重してくれるところは少ないのが現実ですし、ソースコードの品質が感覚的によくないといってもなかなか信じてもらえないところもあると思います。そういうときこそ、客観的、定量的にソースの品質を計測するメトリクスツールの導入を検討するのがよいのではないでしょうか。
メトリクスとは何か | Think IT(シンクイット)
Eclipseで使えるメトリクス計測ツール (4/5):Eclipseで使えるテストツールカタログ(3) - @IT
こうしたツールには本格的な商用のツールから、フリーのものまで最近ではさまざまなものが出回っているようです。フリーのもので、私が今まで利用してきたものを挙げると

などがあります。これらの解析はビルド時に自動的に行って定期的にレポートを生成させることもできます。
ただし、もともとのソースコードの品質があまりにもひどい状態の場合、以上のメトリクスを計測してもあまり面白いデータが採れないということもありますね。恐ろしいことですが、放射線量があまりにも多くてガイガーカウンターの針が振り切れてしまい計測不能という危険な状態のコードもたくさん存在するのです。そういった状態のレガシーコードを相手にするときには、問題の存在を視覚的に表現してくれるようなツールがあると便利です。そういうことで、何かよいツールはないかなと探していたのですが、先日
http://conqat.in.tum.de/index.php/ConQAT
という非常に面白いツールを発見しました。Apache2のオープンソースライセンスで提供されているのですが、

  • コード行数など基本的なメトリクスの計測
  • パッケージ間の依存関係などアーキテクチャの整合性の確認
  • クローン検出(いわゆるコピペコードの検出、ABAP、ADA、C#、C/C++、Cobol、Java、Visual Basic、PL1、PL/SQLに対応。それ以外は検出精度が下がるが、テキストとして検出可能。)
  • メトリクス計測結果の視覚化
  • FindBugsなど他のツールとの連携
  • Hudson、Jenkinsなどとの連携

などが行えるだけでなく、計測する処理フローを独自の言語とフローエディタを使って編集したり、新しい処理を独自に開発して追加したり、非常に柔軟性が高く高度なフレームワークとして作成されているようです。Eclipseの拡張として作成されているため、基本的には直感的に操作することができます。以下は、解析フローを編集する画面で、ライブラリーとして提供されているさまざまな処理を組み合わせて、全体の解析処理を組み立てることができます。

このツールの中でも、特にクローン検出の機能は非常に強力です。実際、昨日紹介したサーティファイの認定試験(改良後のもの)Javaプログラミング能力認定試験の問題がかなり改善されていました - 達人プログラマーを目指してに対して、クローン検出の機能を実行すると、以下のようなマップが得られます。

この図で長方形の面積はソースコードのステップ数に比例しており、赤い色の濃いところはクローンペアとして検出された行数の比率を示しています。濃い赤色のところほどコピペされた部分の割合が高いことを示しています。さらに、各クローンペアについては、Eclipseのソースコードエディタ上で実際の箇所を確認することができます。

まったく同一の部分だけでなく、似たような部分もクローンとしてきちんと検出されます。
こういうツールは自動ビルドツールと連携させて、定期的にコードレビューを自動化する目的で活用すれば、非常に有用だと思います。