gpt4 book ai didi

scala - 使用 Actors 时在哪里定义案例类

转载 作者:行者123 更新时间:2023-12-04 01:37:09 25 4
gpt4 key购买 nike

我正在用 scala 迈出我的第一步.

我创建了一个 PhotosLoaderActor这将负责下载图像并将其保存到缓存中。为此,我将有一个 CacheActor和一个 DownloadActor .

我的 PhotosLoaderActor有这个:

override def act() {
loop {
react {
case (caller : Actor, photoToLoad:String) => { // bla bla }

我刚刚了解到我可以使用 case classes使用这样的东西:
case class LoadImage(caller: Actor, photoToLoad: String)
override def act() {
loop {
react {
case LoadImage(caller, photoToLoad) => { // bla bla }

我的问题是:

我应该在哪里定义 case classes ?
如果我调用 PhotosLoaderActor从不同的包中,导入 Actor 也会导入 case classes ?哪个是最佳实践?

最佳答案

我尝试了几种不同的方法并决定将所有相关消息放入一个对象中,通常命名为 XyzProtocol 之类的对象。

例如:

object PhotoProtocol {
case class LoadImage(caller: Actor, photoToLoad: String)
case class UpdateCache(photoToLoad: String, photo: Photo)
case object ClearCache
}

我喜欢这种方法有几个原因:
  • 在 IDE 或 ScalaDoc 中扫描包含的包,只会显示 1 个或几个 XyzProtocol 对象,而不是散布着数十条消息。
  • 如果处理消息所需的参与者数量随时间变化(例如,引入参与者池或间接到另一个参与者子树),则消息不会受到影响。
  • 没有意外捕获actor 实例,就像在actor 类中定义case 类时那样。这种意外捕获足以让我永远不会在 actor 类中定义 case 类。

  • 注意:如果消息纯粹是一个actor的内部实现细节(例如,一个由自身发送给自身的内部信号),我会在actor类的伴生对象中定义该消息。

    附注。我还建议从标准库 actor 迁移到 Akka。 Akka 将被添加到 Scala 2.10 发行版中。

    关于scala - 使用 Actors 时在哪里定义案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10711897/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com