私たちはモジュールで構成された複雑なロジックを持つ大規模なアプリケーションを構築しています。私はより単純な方法のより大規模な方法を構築していました。たとえば、AnyEventの下でオブジェクト指向の良いコードを書く
# fig. 1
package Foo;
sub highlevel {
my ($self, $user, $event) = @_;
my $session = $self->get_session($user);
my $result = $self->do_stuff($session, $event);
$self->save_session($session);
return $result;
};
(これはもちろん簡略化されています)です。結果が返され、例外がスローされ、誰もが満足しています。
今、AnyEventに移行しています。私のモジュールは、最上位のレベルではありませんので、私は私がこれまで見てきただけ
# fig. 2
my $cv = AnyEvent->condvar;
# do stuff
return $cv->recv;
ほとんどのAEモジュールは、このように動作することができません。
# fig. 3
$module->do_stuff($input,
on_success => sub { ... },
on_error => sub { ... }
);
だから私は、下の書き換えを行っています-levelメソッドを実行して、highlevel()を実行しようとしました。
# fig. 4
package Foo;
sub highlevel {
my ($self, $user, $event, %callbacks) = @_;
my $done = $callbacks{on_success};
my $error = $callbacks{on_error};
$self->get_session($user,
on_error => $error,
on_success => sub {
my $session = shift;
$self->do_stuff($session, $event,
on_error => $error,
on_success => sub {
my $result = shift;
$self->save_session($session,
or_error => $error,
on_success => sub { $done->($result); }
);
}
);
}
);
};
あまり正確ではありません。私はそれを「無限のはしご」と呼びます。
次に、私は、highlevel()が_highlevel_stage1()、_highlevel_stage2()などに分割されたアドホック状態マシンを考えました。しかし、それは私にも受け入れられませんstageXの代わりに良い名前を考えると頭痛になる)
私たちはすでにアプリケーション全体を動かすために本格的な状態マシンを探していますが、に遷移を追加するごとに、のやり取りはあまりにも寛大です。
質問:AnyEventアプリケーション(図3)内で実行するためのビジネスロジック(図1)を実装するモジュールを作成するためのベストプラクティスは何ですか?それは少し荒いですが、私はそれがポイントを示し願ってい
my $params = {
user => $user,
event => $event,
session => undef
};
my @chain = ('get_session', 'do_stuff', 'save_session', 'emit');
for my $index (0..$#chain) {
my $current = $chain[$index];
my $next = $chain[$index + 1] || undef;
$self->{$current}($params,
on_error => sub { $self->error($params) },
on_success => sub { $self->{$next}($params) },
);
}
:
説明していただきありがとうございます。これは私が最初に持っていたよりもさらに多くの質問を私に残すが、少なくとも今私は自分自身を読んで読むことができる。 – Dallaylaen