木曜日, 12月 14, 2006

[Perl]UMLシーケンス図の自動生成(UML::Sequence)

UMLのシーケンス図を出力してくれるというので試してみました。

http://search.cpan.org/~philcrow/UML-Sequence/

インストールした環境は以下のとおりです。


  • CentOS 4.3

  • Perl 5.8.5(CentOS 4.3のデフォルト)


svgで出力するだけならGDが無くても大丈夫ですが、イメージにしたい場合はGDをインストールしておく必要があります。

まずこんなパッケージを作ってみます。
package Base;
sub new { bless {}, shift }
sub base_method {
    print "I am base\n";
    shift->protected_method();
}

package Foo;
our @ISA = qw(Base);

sub method_foo {
    print "method_foo called\n";
    shift->base_method;
};

sub protected_method {
    print "overrided\n";
}

package Hoge;
sub new { bless {} };

sub call_foo {
    my $foo = Foo->new();
    $foo->method_foo();
}

1;


つづいて起動ファイル
use Hoge;

my $h = Hoge->new();
$h->call_foo;


シーケンスを出力するためには、監視するメソッドの名前をパッケージ名つきでリストアップしておく必要があります。
listとしてこんな感じで作っておきます。
Base::new
Base::base_method
Foo::new
Foo::method_foo
Foo::protected_method
Hoge::new
Hoge::call_foo

これらを使ってシーケンス図を生成してみます。

まずはgenericseq.plコマンドでコールシーケンスをXMLファイル化します。
genericseq.pl UML::Sequence::PerlSeq list main.pl >sequence.xml


あとはこれをグラフィック形式に変換します。
SVGの場合はseq2svgを、jpegやpngの場合はseq2rast.plを使用します。
seq2svg.pl sequence.xml > sequence.svg


PNGに変換
seq2rast.pl -o sequence.png sequence.xml


画像タイプは拡張子で判断してくれるようです。

サンプル画像


とりあえずいい感じに出てはいますがリストを作らないといけないのが若干面倒な感じです。想像ですがこのリストからサブルーチンを置き換えてトレースできるようにしているためだと思われます。
パッケージが多くなってくると手動でリストを作るのはきついのでワンライナーあたりで生成するのが現実的でしょう。
サブルーチン呼び出しのグローバルフックみたいなのってないんですかね。



0 件のコメント: