パッケージの依存状況の視覚化
今回はちょっと横道にそれて,パッケージの依存状況を視覚化するツールをご紹介。
goviz のインストール
導入は go get
でOK。
C:>go get -v github.com/hirokidaichi/goviz
github.com/hirokidaichi/goviz (download)
github.com/jessevdk/go-flags (download)
github.com/hirokidaichi/goviz/dotwriter
github.com/jessevdk/go-flags
github.com/hirokidaichi/goviz/goimport
github.com/hirokidaichi/goviz/metrics
github.com/hirokidaichi/goviz
パッケージ依存状況の視覚化
では,早速動かしてみましょう。
C:>goviz.exe -i github.com/hirokidaichi/goviz
digraph main{
edge[arrowhead=vee]
graph [rankdir=LR,compound=true,ranksep=1.0];
/* plot github.com/hirokidaichi/goviz */
"github.com/hirokidaichi/goviz"[shape="record",label="main|github.com/hirokidaichi/goviz|goviz.go",style="solid"]
"github.com/hirokidaichi/goviz" -> "github.com/hirokidaichi/goviz/dotwriter"[dir=forward]
/* plot github.com/hirokidaichi/goviz/dotwriter */
"github.com/hirokidaichi/goviz/dotwriter"[shape="record",label="dotwriter|github.com/hirokidaichi/goviz/dotwriter|dotwriter.go",style="solid"]
"github.com/hirokidaichi/goviz" -> "github.com/hirokidaichi/goviz/goimport"[dir=forward]
/* plot github.com/hirokidaichi/goviz/goimport */
"github.com/hirokidaichi/goviz/goimport"[shape="record",label="goimport|github.com/hirokidaichi/goviz/goimport|import.go\nimport_factory.go\nsource.go",style="solid"]
"github.com/hirokidaichi/goviz/goimport" -> "github.com/hirokidaichi/goviz/dotwriter"[dir=forward]
"github.com/hirokidaichi/goviz" -> "github.com/hirokidaichi/goviz/metrics"[dir=forward]
/* plot github.com/hirokidaichi/goviz/metrics */
"github.com/hirokidaichi/goviz/metrics"[shape="record",label="metrics|github.com/hirokidaichi/goviz/metrics|metrics.go",style="solid"]
"github.com/hirokidaichi/goviz/metrics" -> "github.com/hirokidaichi/goviz/dotwriter"[dir=forward]
"github.com/hirokidaichi/goviz" -> "github.com/jessevdk/go-flags"[dir=forward]
/* plot github.com/jessevdk/go-flags */
"github.com/jessevdk/go-flags"[shape="record",label="flags|github.com/jessevdk/go-flags|arg.go\nclosest.go\ncommand.go\ncommand_private.go\ncompletion.go\nconvert.go\nerror.go\nflags.go\ngroup.go\ngroup_private.go\nhelp.go\nini.go\nini_private.go\nman.go\nmultitag.go\noption.go\noption_private.go\noptstyle_other.go\noptstyle_windows.go\nparser.go\nparser_private.go\ntermsize.go\ntermsize_linux.go\ntermsize_nosysioctl.go\ntermsize_other.go\ntermsize_unix.go",style="solid"]
}
おー。 なんだか凄いコードが出力されました。 じつはこれ DOT というデータ記述言語で書かれたものです。 なので,この出力を Graphviz のツールに通すことで最終的な出力を得ます。
C:>goviz.exe -i github.com/hirokidaichi/goviz | dot.exe -Tpng -o goviz.png
パッケージ依存度の評価
-m
オプションを指定するとパッケージ依存度(結合度)の評価ができます。
C:>goviz.exe -i github.com/hirokidaichi/goviz -m
Inst:1.000 Ca( 0) Ce( 4) github.com/hirokidaichi/goviz
Inst:0.500 Ca( 1) Ce( 1) github.com/hirokidaichi/goviz/goimport
Inst:0.500 Ca( 1) Ce( 1) github.com/hirokidaichi/goviz/metrics
Inst:0.000 Ca( 3) Ce( 0) github.com/hirokidaichi/goviz/dotwriter
Inst:0.000 Ca( 1) Ce( 0) github.com/jessevdk/go-flags
Inst
は Instability, Ca
は Afferent Couplings, Ce
は Efferent Couplings かな。
Afferent Couplings は,そのパッケージに依存しているパッケージがいくつあるか,を示すものです。 Efferent Couplings は,逆にそのパッケージが依存しているパッケージがいくつあるか,を示すものです。 Instability は $Inst = Ce / (Ce + Ca)$ で算出される値で,この値が大きいほど他パッケージへの依存度が高いと評価できます。 共通ライブラリとして運用したいパッケージはなるべく Instability を低く抑えたいところです。 またソースコードを読む場合は Instability の高いパッケージから優先的にみるといいかもしれません。
goviz の起動オプション
hirokidaichi/goviz のオプションは以下の通り。
C:>goviz.exe -h
Usage:
goviz.exe [OPTIONS]
Application Options:
/i, /input: intput ploject name
/o, /output: output file (default: STDOUT)
/d, /depth: max plot depth of the dependency tree (default: 128)
/f, /focus: focus on the specific module
/s, /search: top directory of searching
/l, /leaf whether leaf nodes are plotted (default: false)
/m, /metrics display module metrics (default: false)
Help Options:
/? Show this help message
/h, /help Show this help message