Мы создаем большое приложение со сложной логикой, состоящей из модулей. Я использовал для создания больших методов масштаба более простых методов, например,Написание хорошего объектно-ориентированного кода в 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 { ... }
);
Так что я закончу переписывание нижнего() и ...
# 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); }
);
}
);
}
);
};
Не совсем красиво. Я называю это «Бесконечной лестницей».
Теперь следующая вещь, которую я мог придумать, была ad-hoc state machine, где highlevel() разбит на _highlevel_stage1(), _highlevel_stage2() и т. Д. Но это меня не удовлетворяет (это недостижимо, и думать о хороших именах вместо stageXX дает мне головную боль).
Мы уже изучаем полноразмерный конечный автомат для управления всем приложением, но для добавления перехода для каждое взаимодействие выглядит слишком щедрым для меня.
Вопрос: Каковы наилучшие методы написания модулей, реализующих бизнес-логику (рис.1) для работы в приложении AnyEvent (рисунок 3)?
Спасибо за разъяснения. Это оставляет мне еще больше вопросов, чем я изначально, но по крайней мере теперь я могу пойти и почитать себя. – Dallaylaen