2014年9月2日火曜日

Perlの継承関係を簡単にグラフ化したい


このエントリーをはてなブックマークに追加
継承関係のグラフ化はプロジェクトの全体像を知るために何度か使ったことはあるのですがうまくいかないケースもあり、敬遠していました。

うまくいかない原因を思い出してみると、1つは継承関係を知るためには実際にコードを動かす必要があるけれど、手元に必要なライブラリがない、ミドルウェアがないため実行できないケース。もう1つはパッケージの数が多くグラフ化の処理が重すぎる、の2点でした。

前者を解決するためには、実際に動かさないで継承関係を知る必要があるため、、、、コードの静的解析、PPIで解決しました。
後者は、グラフ化する対象を絞ることにしました。

要件

指定したディレクトリ以下にあるモジュール間の継承関係をグラフ化する。
(例:MyProj::Authorizer::**以下にある認証フローにしか興味がない)

コード

コードはgistを参照。

コード解析にはFile::PackageIndexerを使用していて、これはPPIを使ってISAやメソッドを収集してきます。1箇所テストが失敗しますが気にしなくていいです。直すかnotestで入れてください。
これで子パッケージ名と親パッケージ名の組のリストを作っていきます。

次にGraph::Easyのadd_edgeメソッドに先ほど作ったパッケージリストを設定します。
$graph->add_edge(A,B)
$graph->add_edge(B,C)
で A => B => C のような関係をグラフ化してくれます。

黄色は指定ディレクトリ内で見つからなかったパッケージのノードを表し、赤色はそれ以上親がいないノードを表しています。

以上ー。
他に良いものがあれば教えてください。

0 件のコメント:

コメントを投稿