PHPソースの複雑度を調べる

SATOOMcCabe,PHP,カバレッジ,サイクロマチック複雑度,テスト,単体テスト,品質,複雑度

こんにちは、SATOOです。

ゴールデンウィークはいかがお過ごしでしたでしょうか。
SATOOは毎日のようにお酒を飲む日々でした。
品質管理チームなのに、自分の品質を維持できていない?とちょっと考えてしまいました。

さて、ソフトウェア品質を高めるための1つの方法として、ソースコードの品質から高めていくという考え方があります。
ソースコードの品質を調べるには、どうすればいいでしょうか。
それには、「複雑度」を調べるのが一般的な方法だと思います。

今回は、PHPソースの複雑度を調べることのできるサイトをご紹介します。 
McCabe’s cyclomatic complevity

複雑度とは、“Thomas McCabe”という人が考案したもので、正しくは「循環的複雑度(サイクロマチック複雑度)」と呼ばれています。
Wikipediaを見ると、次のように書かれています。

循環的複雑度(Wikipedia)
プログラムのソースコードから、線形的に独立した経路の数を直接数える

つまり、複雑度とはほぼ「分岐網羅」のことと考えられます。

複雑度は、そのソースコードの構造の良し悪しを判断する一つの材料になります。
複雑度の数値が大きいソースコードは、IF文やループが多層化している可能性が高いので、そもそも可読性が低い上、あとで修正するとデグレを引き起こしやすいわけです。

開発をしていく上で、複雑度が小さな値になるよう心がけてコーディングすることは重要だと思います。

 

余談ですが、単体テストケースを書く際、対象となるメソッドの複雑度は重要な意味を持っています。
なぜなら、“複雑度≒分岐網羅”ならば、以下の結論が得られるからです。

複雑度≒単体テストケース数

つまり、単体テストケース数が複雑度の数値より少なければ、最低限の単体テストをクリアしていないことになるのです。
カバレッジ100%を目指す場合は、複雑度の数値以上のテストメソッド数が必要になります。

ただ、ソフトウェアテストの知識が無い状態では、無意味なテストケースばかりが増えてしまって、コストばかりがかかってしまうということもあり得ます。

テストケースの品質を維持するためには、複雑度から導き出される最低限のテストケースを作ること、そしてソフトウェアテストの正しい知識によって無意味なテストケースを作らないようにすることが重要だと思います。