SourceMonitorで静的解析をしてみる

プログラミング全般プログラミング全般

この記事の内容

この記事では、「SourceMonitor」を使用して、ソースコードを静的解析する方法を紹介します。

そもそも静的解析とは、ソースコードを解析して、様々な情報を数値化することを表します。例えば、ファイルごとのソースコードの行数であったり、関数毎のソースコード行数、またネストの深さなどを解析します。以下のようなイメージです。

解析できる情報については、使用するツールにより変わってきます。

なぜ、静的解析をすると嬉しいのかですが、これは定量的にソースコードの品質を把握し、改善点を洗い出すことができ、改善したのちその効果を定量的に把握できることです。

複雑なプログラムというのは、一つのファイルに処理が集中して、ソースコードの行数が多くなったり、ソースコードのネストが深くなり難しくなったりという傾向があります。多くの静的解析ツールでは、循環的複雑度(サイクロマティック複雑度、Cyclomatic Complexity)を解析して表示してくれます。この数値の指標として、以下が参考になります。

https://jp.mathworks.com/より引用

静的解析結果の使用例

ここでは、具体的に私がどのように静的結果を使用しているか記載します。言語によって変わる部分もあると思いますが、1つの参考にしていただければ幸いです。(筆者はC#, C++で使用)

項目基準
1ファイルあたりのソースコード行数(コメント含めず)1000未満
1関数当たりのソースコード行数(コメント含めず)200未満
複雑度20未満
ネストの深さ6以下

注意点は、複雑度が例えば20以上になっているから必ず修正するかというとそうではありません。複雑度が高いからといって必ず複雑とは言えないからです。複雑度の計算式を見てもらえばわかりますが、ifの分岐の数やネストなどにより算出されます。なので、単純なファクトリクラスだが、if~elseの繰り返しで高くなってしまうこともあります。これは、特に複雑になっているわけではないので、修正対象外とします。重要なのは、複雑度をもとに本当に複雑になっているのかを判断して、必要あれば対処を行うことです。

SourceMonitorの使用方法

SourceMonitorのインストーラをダウンロードします。以下の「via HTTP」をクリックし、インストーラをダウンロードします。インストールは特にデフォルトで問題ないかと思います。

http://www.campwoodsw.com/sourcemonitor.html

SourceMonitorを起動します。

言語を指定します。また、対象、対象外にしたいファイル名を指定します。基本的にはデフォルトで問題ないかと思います。後で対象、対象外のファイルを選択する部分があるので、そこで調整もできます。

プロジェクトファイル名とそのファイルパスを入力します。解析結果のファイルになります。

ソースコードのディレクトリを指定します。「All Subdirectories」を指定すると、その下のサブディレクトリも対象になります。

ここは特にデフォルトで問題ないかと思います。必要に応じて変更してください。

こちらもデフォルトで問題ないかと。

UTF-8のファイルを使用する場合「Allow parsing of UTF-8 files」にチェックを入れてください。

完了を押します。

解析したいファイルを右のエリアに持ってきます。基本的にはフィルタされるのでそのままで問題ないかと思いますが、解析に不要なファイルを取り除くなど調整します。OKボタンを押下すると解析結果が表示されます。

以下の様に解析結果が表示されます。これは全体の解析結果になり、Baselineを押すとファイル単位で確認ができます。また、ここでファイルを修正後にチェックポイントを作成して解析を実施することで、どのように推移しているのかわかるようになります。

以下がファイル単位の結果です。

また、よく使う機能として、Baselineを選択して、「Display Method Metrics」を押すとメソッドごとのメトリクスを表示することができます。

メソッドごとのメトリクスを表示した例

以上、SourceMonitorの使用方法でした。

静的解析の基準をルールで定めておくと、一定の品質を保つことができると思うので活用するといいです。また、お客様に対してのアピール材料や提案材料にもなるかと思いますので、武器にするとより一層自分の武器になるかと思います。

コメント