Chúng tôi đang xây dựng một ứng dụng lớn với logic phức tạp, bao gồm các mô-đun. Tôi đã từng xây dựng các phương pháp quy mô lớn hơn với các phương pháp đơn giản hơn, ví dụ:Viết mã hướng đối tượng tốt dưới 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;
};
(điều này đơn giản là tất nhiên). Kết quả được trả lại, ngoại lệ được ném ra, mọi người đều hạnh phúc.
Bây giờ, chúng tôi đang chuyển sang AnyEvent. mô-đun của tôi là KHÔNG mức cao nhất, vì vậy tôi không thể làm chỉ
module# fig. 2
my $cv = AnyEvent->condvar;
# do stuff
return $cv->recv;
Hầu hết AE Tôi đã nhìn thấy cho đến nay hoạt động như thế này:
# fig. 3
$module->do_stuff($input,
on_success => sub { ... },
on_error => sub { ... }
);
Vì vậy, tôi thực hiện xong việc viết lại thấp hơn các phương pháp cấp và cố gắng tiến hành với highlevel() và ...
# 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); }
);
}
);
}
);
};
Không chính xác. Tôi gọi nó là "cái thang vô hạn". Bây giờ điều tiếp theo tôi có thể đưa ra là một máy trạng thái đặc biệt trong đó highlevel() được chia thành _highlevel_stage1(), _highlevel_stage2() vv Nhưng điều đó cũng không thỏa mãn tôi (điều đó không thể duy trì được), và suy nghĩ về tên tốt thay vì stageXX làm tôi đau đầu).
Chúng tôi đã xem xét một máy trạng thái toàn diện để thúc đẩy toàn bộ ứng dụng, nhưng phải thêm chuyển đổi cho mỗi tương tác có vẻ quá hào phóng với tôi. Vì vậy, câu hỏi là: Các phương pháp hay nhất để viết các mô-đun thực hiện logic nghiệp vụ (hình 1) để chạy trong ứng dụng AnyEvent (hình 3) là gì?
Cảm ơn bạn đã làm rõ. Điều này khiến tôi có nhiều câu hỏi hơn ban đầu, nhưng ít nhất giờ tôi có thể tự mình đọc và đọc. – Dallaylaen