Scala 是否应该将Actor的方法和成员定义为private

Scala 是否应该将Actor的方法和成员定义为private,scala,actor,Scala,Actor,定义演员时,最佳实践是什么 参与者状态:使用下面代码中的集合定义“var”更好,还是使用可变集合定义“val”更好?我们应该把它定义为私人的吗 我们应该将Actor的方法定义为private吗 类FooActor(out:ActorRef)扩展了Actor{ private-var-words:List[String]=Nil 覆盖def接收:接收=??? def foo()=??? } 关于第一点,一般来说,我都不同意。相反,将receive方法设置为将集合作为参数的方法,并在集合更改时使

定义演员时,最佳实践是什么

  • 参与者状态:使用下面代码中的集合定义“var”更好,还是使用可变集合定义“val”更好?我们应该把它定义为私人的吗

  • 我们应该将Actor的方法定义为private吗

类FooActor(out:ActorRef)扩展了Actor{
private-var-words:List[String]=Nil
覆盖def接收:接收=???
def foo()=???
}

关于第一点,一般来说,我都不同意。相反,将
receive
方法设置为将集合作为参数的方法,并在集合更改时使用更新参与者的状态。例如:


关于第二点,任何helper方法都可能只供参与者自己使用,因此将它们设置为私有

首先,这实际上取决于你要变异的项目集合有多大。您是否打算在10万条消息中向
地图添加10万条项目?如果是这种情况,也许您应该使用可变集合,以避免复制整个集合以添加每个项的开销。根据用例做出明智的决策

这里是对可变集合与不可变集合性能的参考


至于第二点,就与
参与者的接口而言,方法的可见性并不重要。应该
参与者进行交互的唯一方法是询问和告知消息,这样,任何成员方法的可见性对于读者来说都不会超出推断的目的。

参与者的主要目的之一是允许您将可变状态与程序的其余部分隔离开来,并且从而保持引用的透明性。因此,使用(var)不可变集合还是(val)可变集合实际上并不重要。我非常确定,您在actor中定义的方法实际上是私有的,尽管我将让更专业的人来回答这个问题。AFAIK将和项添加到不可变集合使用内存共享数据,而不是处理数据。不是吗?这与所涉及的数据结构有关。我假设预先添加
列表
不会复制所有项目,因为它使用的是covers.nice FP方法下的
链接列表
。这在与大国打交道时也是有效的吗?比如说100K条消息(比如提到的@nattyddubs)@igx
context.been
本质上是使用闭包代替类字段,所以预期使用不可变的
var
字段的利弊相同。请注意,
context.been(…,discardOld=false)
的行为类似于具有其他性能含义的状态堆栈。@dwickern IIUC。在处理大型集合时,使用可变变量来处理状态比使用Shadowlands描述的“been”具有更好的内存含义。对吗?@igx我认为使用的数据类型的效率可能没有那么高。在内存方面,我希望它们是可比的,在时间方面,任何差异都可能被actor系统路由和处理消息等的时间成本所淹没。
class FooActor(out:ActorRef)extends Actor {

  override def receive: Receive = active(Nil)

  def active(words:List[String]): Receive = Receive {
    case word_to_add: String => context.become(active(word_to_add :: words))
    case ...
  }

  private def foo()=???
}