在正确使用 scala(和 akka)actor 框架的大多数示例中,人们倾向于从单个特征派生每条消息。例如:
trait Message
object Ping extends Message
object Pong extends Message
但是,在 Scala 和 Akka 中,根本没有键入消息接收。有什么理由来实现一个共同的特征吗?
最佳答案
这实际上取决于您要实现的目标。例如,我最近使用具有多种类型角色的角色和一个或多或少像路由器一样工作的管理角色构建了一个小型应用程序。现在,工作 Actor 可以收到许多不同的消息,例如 Foo
, Bar
和 Baz
.没有父类(super class)型,在管理 Actor 中,我必须写这样的东西:
react {
case x:Foo | x:Bar | x:Baz => worker ! x
}
这显然是不必要的冗长。所以在这种情况下,父类(super class)型
WorkerMessage
会很有意义,因为它简化了您的代码:react {
case x:WorkerMessage => worker ! x
}
另一方面,这使得消息
Foo
, Bar
和 Baz
除了被您的 WorkerActor 使用之外,几乎无法用于任何其他目的。如果您有留言 Stop
或 Init
例如,这可能很糟糕,因为您需要在整个地方重新定义它。所以如果你知道你只有不传递消息的 Actor (也就是说,他们自己处理它们),那么我猜你没有父类(super class)型就可以了。
我猜人们在默认情况下或多或少这样做的原因是,如果您以后更改代码,则不必在之后创建特征,因为您已经在开始时这样做了。
就我个人而言,我总是尽量避免不必要的开销,所以除非我真的需要,否则我可能不会定义父类(super class)型。另外,我真的不知道创建父类(super class)型是否对性能有任何影响,但我很想知道。
关于scala - Actor 消息应该扩展一个共同的特征吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6322437/