こんにちは、エンジニアの末武です。
プログラムを書く際に、「品質」という言葉が良く使われますが具体的にどのようなコードが「品質」が良くバグが出にくいのか、凝集度やら結合度やらパッとわかりづらいことがあります。
今回はソフトウェアの品質の定量的な測定指標として、サイクロマティック複雑度についてお話しようと思います。
サイクロマティック複雑度とは
サイクロマティック複雑度(循環的複雑度)とは、ソフトウェア測定法の一つでソースコードがどれぐらい複雑であるかをメソッド単位で数値にして表す指標になります。
計測方法の詳細はそれ自体複雑ですが、基本的には「if/else・for・switch」などの分岐やループが増えるに従い数値が増えていきます。(何も分岐が含まれないコードは「1」)
複雑度が高いメソッドほど、コードは複雑でメンテナンスがしづらく、ユニットテストがしづらくなります。
プロジェクトによってどれぐらいの値が良いかは変わると思いますが、一般的には大体以下のような認識がされているようです。
サイクロマティック複雑度 | 状態 |
~10 | シンプルで理解しやすく、テストも容易 |
11~20 | 若干複雑なコード。 |
21~50 | 複雑なコード。完全に理解してテストを作成するのが困難 |
50~ | 保守困難。バグが確実に潜在する。 |
サイクロマティック複雑度の確認方法
ここからは実際のサイクロマティック複雑度の確認方法を紹介しようと思います。
※w2ではVisualStudioで開発をしていますので、VisualStudio環境を想定とします。
VisualStudioのコード分析機能
サイクロマティック複雑度は、VisualStudioの「分析>コードメトリクスの計算」から見ることができます。
プロジェクトごとに、どのクラスのメソッドが複雑度が高いのかが一目でわかります。
Resharperの拡張機能「CyclomaticComplexity」
また、w2ではJetBrainsが販売しているVisual Studioの開発支援ツール「Resharper」を導入しているので、Resharperの拡張機能である「CyclomaticComplexity」を導入すると、メソッドにマウスオーバーすることで複雑度を一目で確認することもできます。
CyclomaticComplexityは設定で「閾値(threshold)」を設定することができます。
設定値を超えた複雑度のメソッドは強調表示してわかりやすくすることで、プロジェクトによって「複雑度20以上のメソッド」などのを検知することができます。
※画像は閾値に「2」を指定した場合(本来は2などは指定しないが。。。)
まとめ
ソフトウェアの品質測定方法の指標は一つではなく、サイクロマティック複雑度が低いコードが必ずしも良いコードであるというわけではありませんが、自分のコードの品質が良いのかというのは主観的にはわかりづらいものなので、客観的に数値で表現してくれるというのは非常に参考になるものだと思います。
興味を持たれた方は、自分のコードの複雑度がどれくらいになっているのか、一度測ってみてはいかがでしょうか?
コメント