循環的複雑度(Cyclomatic Complexity)とは
プログラムの複雑度を測るのに使われる。プログラムのソースコードから、線形的に独立した経路の数を直接数える。(Wikipediaより)
とある。分岐等の数を計測し、どれだけリスクが低いプログラムかを定量的に評価でき、一般的に下記のような線引きがあるようである。
複雑的循環度 | 評価 |
---|---|
~ 10 | シンプルでよい構造。バグが入りにくい |
21 ~ | 構造的にリスクを伴う複雑さ。バグ入りやすい |
50 ~ | この域になるとテストが不可能になる |
75 ~ | 98%の確率でバグが入る |
ということで、ためしにRubyのソースを計測してみた。
Rubyプロジェクトで循環的複雑度を計測する
インストール
今回はgithubで公開されているSaikuroというツールを使って計測を行ってみる。
https://github.com/metricfu/Saikuro
gem install metric_fu-Saikuro
使い方
いたってシンプル。
このコマンドを実行すれば解析後の結果をhtmlとして出力してくれる。
$ saikuro -c -i {対象ディレクトリ} -o {解析結果出力先ディレクトリ}
Parsing xxxxxx.rb
Parsing yyyyyy.rb
Parsing zzzzzz.rb
$
複数のディレクトリを一気にやることも可能。
$ saikuro -c -i {対象ディレクトリ1} -i {対象ディレクトリ2} -o {解析結果出力先ディレクトリ}
Parsing xxxxxx.rb
Parsing yyyyyy.rb
Parsing zzzzzz.rb
・・・
$
実行後に-oで指定したディクトリにhtmlファイルが出力される。
xxxx.rb_cyclo.html
index_cyclo.html
実行結果
上記で解析したhtmlファイルを開くとこのような感じになる。
index_cyclo.html
-
Errors and Warnings
ErrorとWarningが出ているクラスの一覧(複雑度が高いやつっぽい?) -
Analyzed Files
解析したファイル一覧
循環的複雑度は、低ければ低いほどメンテナンス性やテスタビリティが高くなるため、定期的に計測をしてみたい。