有没有标准化方法来形式化我的scala / akka actor api? Imho,我需要了解实现以了解要发送的内容并不是一个好的选择。此外,如果实施已更改且我的消息不再有效(不调用我认为它会调用的操作),我也不会收到任何警告或错误。
答案 0 :(得分:6)
这是一个在社区中非常讨论的问题。我听说Akka 3可能会对类型安全演员提供更好的支持,但这还需要一段时间。
同时您可以使用TypedActors,但一般建议是在应用程序的边界使用它们。
一种很好的方法,它不会给你任何类型的安全性,但会让演员的合同更加明显,就是定义一个演员可以在他们的伴侣对象中接收的消息。这种方式每次您想要向演员发送消息时,您可以从其伴随对象定义的消息中进行选择。如果您为每个演员提供特定消息,这当然最有效。如果您更改了实现,则可以删除旧消息并添加新消息,以便每个想要使用旧实现的人都会遇到编译器错误。
最后,邮件列表上周有a nice pattern。他创造了特征来定义演员及其消费者的合同,但是你仍然需要注意消费者是否具有正确的特征。
根据我的经验,确保一切正常的最佳方法是广泛的测试套件,它将测试每个演员本身,以及特定演员之间的沟通。
答案 1 :(得分:1)
Erlang中通常采用的方法是避免直接向进程发送消息,并在定义进程行为的同一模块中提供其他API。在Akka,它看起来像
class Foo extends Actor {
// handles messages Bar(x: Int) and Baz
}
object Foo {
def bar(foo: ActorRef, x: Int) = foo ! Bar(x)
def baz(foo: ActorRef) = (foo ? Baz).mapTo[TypeOfResponseToBaz]
}
一个问题是处理返回消息,因为Erlang通常会促进比Akka更多的同步样式。这可以通过命名约定来处理(例如BarResponse
或FooBarResponse
,如果不同的actor使用不同的响应处理相同的消息)。