Я использую Akka и Scala около месяца, и меня несколько беспокоит замена явных интерфейсов сообщениями. Рассмотрим следующего простого актера Akka:
case class DoMyHomework()
class Parent extends Actor {
def receive = {
case d: DoMyHomework => // do nothing
}
}
Актерский или неактерский код, который отправляет этому актеру сообщение DoMyHomework, подобное этому:
ActorRef parent = ...
parent.ask(DoMyHomework)
Не имеет ни малейшего представления о том, каков будет результат. Какой ответ? Получу ли я когда-нибудь ответ? Могу ли я получить исключение? И так далее.
Кажется, исправление состоит в том, чтобы задокументировать класс case ... но что, если какой-то другой субъект также получит тот же класс case. Тогда документация для получения этого сообщения должна быть в самом актере.
Пытаясь немного очистить это, я подумал о следующем:
trait SomeoneSmarter {
def wouldYouDoMyHomework: Future[Boolean]
}
class Parent extends Actor with SomeoneSmarter {
case class DoMyHomework()
def wouldYouDoMyHomework = {
(self ? DoMyHomework()).mapTo(Boolean)
}
def receive = {
case d: DoMyHomework =>
// TODO: If I'm busy schedule a false "No way" reply for a few seconds from now.
// Just to keep their hopes up for a while. Otherwise, say sure right away.
}
}
Итак, я поговорил с коллегами об этом, и одна из реакций была «вы не соответствуете актерской модели».
Во-первых, я был бы очень признателен за советы от людей, которые уже давно используют Актеров. Все сообщения становятся громоздкими? Вы в конечном итоге скрываете передачу сообщений за интерфейсами?
Актеры, которых я предлагаю, по-прежнему имеют возможность отправлять сообщения между собой, подписываться на потоки событий и все то, что вы ожидаете от Akka. А интерфейс дает вам проверенный временем способ узнать, о чем вы говорите. И это помогает при кодировании в IDE и т. Д. И почему пользователь актера должен знать, что это актер (если только он не актер и не очень тесно с ним связан)?
Другая реакция, которую я получил, была «похоже, вам нужен TypedActor». Но, прочитав о TypedActor, я в этом не убедился. Безусловно, TypedActor избавляет меня от необходимости создавать эти внутренние сообщения. Но, по крайней мере, из образца кода на http://doc.akka.io/docs/akka/snapshot/scala/typed-actors.html У меня сложилось впечатление, что TypedActor предназначен только для работы в качестве прокси-сервера для блока кода, который вы хотите инкапсулировать или сделать поток- безопасно или просто не вызывать напрямую из текущего потока. А то, что вы кодируете, - это просто реализация и интерфейс. Вы не связываетесь с самим актером (прокси) - например, если вы хотите, чтобы ваша реализация выполняла периодическую работу или подписывалась на поток событий, или делала что-либо еще, не связанное с интерфейсом.
Я также читал http://letitcrash.com/post/19074284309/when-to-use-typedactors и не нашел этот пример более показательным. Я, наверное, просто не в восторге от TypedActor (не то чтобы я еще не утверждал, что действительно разбирался в актерах).
заранее спасибо за помощь.
Пино