Я использую Akka и Scala около месяца, и меня несколько беспокоит замена явных интерфейсов сообщениями. Рассмотрим следующий простой аккор Акка:
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 предназначен только для работы в качестве прокси-сервера вокруг блока кода, который вы хотите инкапсулировать, или создания потока -safe или просто не вызывать прямо из вашего текущего потока. И то, что вы кодируете, - это просто реализация и интерфейс. Вы не возитесь с самим актером (прокси) - например. если вы хотите, чтобы ваша реализация выполняла периодическую работу или подписывалась на поток событий или делала что-либо еще, не связанное с интерфейсом.
Я также читал http://letitcrash.com/post/19074284309/when-to-use-typedactors и не нашел, что этот пример больше освещает. Я, вероятно, просто не грохнул TypedActor (не то, что я утверждаю, что действительно понял Актеры еще).
заблаговременно за помощь.
Пино