Estamos construyendo una aplicación grande con lógica compleja, que se compone de módulos. He utilizado para construir métodos de mayor escala de los métodos más simples, por ejemplo,Escribiendo un buen código orientado a objetos bajo 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;
};
(esto se simplifica por supuesto). Los resultados se devuelven, se lanzan excepciones, todos están contentos.
Ahora, estamos haciendo un cambio a AnyEvent. Mi módulo no es el nivel más alto, por lo que no puede hacer sólo
módulos# fig. 2
my $cv = AnyEvent->condvar;
# do stuff
return $cv->recv;
más AE que he visto hasta ahora funciona de esta manera:
# fig. 3
$module->do_stuff($input,
on_success => sub { ... },
on_error => sub { ... }
);
Así que he terminado de reescribir el menor -level métodos y trataron de proceder con alto nivel() y ...
# 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); }
);
}
);
}
);
};
No
exactamente hermosa. Yo lo llamo "la escalera infinita".
Ahora lo siguiente que se me ocurre es una máquina de estado ad-hoc donde highlevel() se divide en _highlevel_stage1(), _highlevel_stage2() etc. Pero eso no me satisface también (es imposible de mantener, y pensar en buenos nombres en lugar de stageXX me da dolor de cabeza).
Ya estamos buscando una máquina de estado en toda regla para manejar toda la aplicación, pero tener que agregar una transición para cada interacción me parece demasiado generosa.
Entonces la pregunta es: ¿Cuáles son las mejores prácticas para escribir módulos que implementan la lógica de negocios (figura 1) para ejecutar dentro de una aplicación AnyEvent (figura 3)?
Gracias por aclarar. Esto me deja con muchas más preguntas de las que tenía inicialmente, pero al menos ahora puedo ir y leerme a mí mismo. – Dallaylaen