AOP。
仕事で取り組んでるソースで、
どーもこれはアスペクト指向で対処したら
もっと良い物になるんじゃないか?と思う箇所が。
しかし、言語はperl。
…ありました。
かくして、土日に家でいじってみた訳ですが…
わかりにくいと思うのは、私だけか?(汗)
ってーか、私がAOPをよく理解してないから悪いのかもしんない。
ってーか、なんでAspectクラスを継承して、
シングルトンクラスなんかがあるのかな?
うーん、きっと何か継承するメリットがあるんだ。うんうん、きっとそうなんだ…。
英文の解説、もっとちゃんと読まないとアカンかな。ははは(遠い目をする)
main:
#!/usr/bin/perl -w
use strict;
use Aspect;
use Log;
use TestA;
use TestB;
my $objLog = new Log();
# どのクラスでも error サブルーチンが呼ばれたらログに保存する
my $pointcut = call /^\w+::error/;
after {
my $context = shift;
my $message = $context->sub_name.
" ".
$context->self->{_error};
$objLog->save($message);
} $pointcut;
my $objTestA = new TestA;
$objTestA->error("message from A");
my $objTestB = new TestB;
$objTestB->error("message from B");
こうすると、TestA::error() や TestB::error() が呼ばれた時に
自動的にエラーメッセージがログに保存される。
TestA::error message from ATestB::error message from B
その他のクラスの中身は、↓こんな感じで。
Log
package Log;sub new { ... }
sub save { 引き数をログ保存する処理 }
1;
TestA
package TestA;※TestB も同じような感じsub new {
my $self = shift;
my $param = {
'_error' => ''
};
bless $param, $self;
}
sub error {
my $self = shift;
my $errorMessage = shift;
$self->{_error} = $errorMessage;
}
1;