У меня есть некоторые актеры Акки с обычным поведением. Это общее поведение определено в признаке:
trait CommonBehavior {
this: Actor =>
var history: List[String] = Nil
protected def commonActions: Receive = {
case Action1 => history = "action1" :: history.take(99)
case Action2 => history = "action2" :: history.take(99)
case GetHistory => sender() ! history
}
}
Актеры переопределяют эту черту и определяют дополнительное поведение с помощью orElse
. Вот один из примеров такого субъекта:
class MyActor extends Actor with CommonBehavior {
var state: Int = 0
override def receive: Receive =
commonActions orElse {
case Increment => state += 1
case Decrement => state -= 1
}
}
Я знаю, что изменяет состояние - это антипаттерн , и я хочу реорганизовать его с использованием context.become
. Проблема в том, что при изменении состояния в MyActor
с помощью context.become
я не знаю параметра для commonActions. Можно ли даже унаследовать поведение? Нужен ли мне больший рефактор (например, создание прокси-актера)? Вот как далеко я продвинулся:
trait CommonBehavior {
this: Actor =>
protected def commonActions(history: List[String]): Receive = {
case Action1 => context.become(??? orElse commonActions("action1" :: history.take(99))
case Action2 => context.become(??? orElse commonActions("action2" :: history.take(99))
case GetHistory => sender() ! history
}
}
class MyActor extends Actor with CommonBehavior {
override def receive = ready(0)
def ready(state: Int): Receive = {
case Increment => context.become(ready(state + 1) orElse commonActions(???))
case Decrement => context.become(ready(state - 1) orElse commonActions(???))
} orElse commonActions(Nil)
}