動機
DX Criteria 2.2ソースコードの明確さに記載されていたので調べた時のメモ書き。
概要
Wikipediaから抜粋。DX Criteriaでは下記内容をソースコードにおいて継続的に検証・測定する仕組みを導入した方が良いと解釈した。
循環的複雑度(英: Cyclomatic complexity)とは、ソフトウェア測定法の一種である。Thomas McCabe が開発したもので、プログラムの複雑度を測るのに使われる。循環的複雑度は、プログラムの制御フローをグラフとして描くことで計算される。グラフのノードはプログラムのコマンドに相当する。2つのノードを結ぶ有向エッジは、第一のコマンドを実行後、次に第二のコマンドが実行される可能性があることを示している。
if文やfor文のような分岐点のないソースコードの場合、その複雑度は 1 であり、そのコードには1つの経路しかない。コードに1つのif文が含まれていれば、コードには2つの経路があることになる。
Goを書くことが多いので測定できるパッケージがあるか調査する。
パッケージ
golang cyclomatic complexity package
のキーワードで検索して該当したパッケージを抜粋する。最新のコミット履歴は2015年と古いがスター数が多いのでfzipp/gocyclo
を試すことにする。
サンプル
適当なサンプルコードと結果。
package sample
func doSometing() {
}
func doSometing1(s string) {
if s == "1" {
}
}
func doSometing2(s string) {
switch s {
case "1":
case "2":
default:
}
}
$ gocyclo sample.go
4 sample doSometing2 sample.go:13:1
2 sample doSometing1 sample.go:7:1
1 sample doSometing sample.go:3:1
雑感
得た結果の良し悪しをどのように定めるのかが気になるところだったが調べたところマチマチな印象だった(知りたい)。言語の書き方というか思想も多少影響するような気がした。lintツールであるgolangci-lintではalecthomas/gocyclo
を利用しておりデフォルト値は30だが、10-20を推奨しているらしい。