frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

AOP。

仕事で取り組んでるソースで、

どーもこれはアスペクト指向で対処したら

もっと良い物になるんじゃないか?と思う箇所が。

しかし、言語はperl

perlAOPなライブラリ、あるのかな?

ありました

かくして、土日に家でいじってみた訳ですが…

わかりにくいと思うのは、私だけか?(汗)

ってーか、私が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 A

TestB::error message from B

その他のクラスの中身は、↓こんな感じで。

Log

package Log;

sub new { ... }

sub save { 引き数をログ保存する処理 }

1;

TestA

package TestA;

sub new {

my $self = shift;

my $param = {

'_error' => ''

};

bless $param, $self;

}

sub error {

my $self = shift;

my $errorMessage = shift;

$self->{_error} = $errorMessage;

}

1;

※TestB も同じような感じ