Scala 如何在actor receive中终止处理?

Scala 如何在actor receive中终止处理?,scala,akka,actor,Scala,Akka,Actor,我目前在阿克卡演员的接收方法中有一些巨大的if块。例如: def receive = { case Alarm(msg) => if (msg != null) { [... huge amount of code ...] } else { logger.log("false alarm") } } 因为我认为这不是最好的可读代码,我想知道我是否可以这样做 def receive = { case Alarm(msg) =>

我目前在阿克卡演员的接收方法中有一些巨大的if块。例如:

def receive = {
  case Alarm(msg) => 
    if (msg != null) {
      [... huge amount of code ...]
    } else {
      logger.log("false alarm")
    }
}
因为我认为这不是最好的可读代码,我想知道我是否可以这样做

def receive = {
  case Alarm(msg) =>
    if (msg == null) {
      logger.log("false alarm")
      break // ????? (I know this does not work, but what else?)
    }
    [... huge amount of code ...]
}
有什么建议或最佳实践吗

编辑:好吧,我明白了,我必须更精确一些。我在大量的代码块中进行了大量的数据库查询,不想将所有的都封装到if-else构造中


Edit2:问题是,我的参与者需要执行一系列数据库操作,并且需要确保每个数据集在处理之前都存在。由于健壮性要求,我不得不这样做。

这不是真正的Akka相关问题,因为这里的主要问题是模式匹配和符合
接收的返回类型
receive
是具有以下返回类型的部分函数:
PartialFunction[Any,Unit]
。因此,您实际上不必从
if/else
语句返回任何特定的内容。因此,您只需
记录
,而无需任何
中断

要改进样式,可以使用以下方法之一编写模式匹配表达式:

scala> case class Alarm(msg: String)
defined class Alarm

scala> Alarm(null) match {
     |   case Alarm(null) => "Null"
     |   case Alarm(_) => "NOT null"
     | }
res1: String = Null

scala> Alarm(null) match {
     |   case Alarm(smth) if(smth == null) => "Null"
     |   case Alarm(_) => "NOT null"
     | }
res2: String = Null
在这种情况下,第一个选项不那么冗长,效果更好

offtopic:避免使用
null
,改用
选项[T]
案例对象

其他(使用case对象):


如果其他人和你一样已经有了,或者将其分为不同的情况:

def receive = {
  case Alarm(msg) => 
    if (msg != null) {
      [... huge amount of code ...]
    } else {
      logger.log("false alarm")
    }
}
变成

def receive = {
  csae Alarm(null) => logger.log("false alarm")
  case Alarm(msg) => [... huge amount of code ...]
}

也许您应该将
报警
拆分为多条消息?这是一种常见的误解,即只有在计划重用代码时才必须创建函数。创建小函数的好处是:易于阅读和推理,易于测试,通过给函数起好名字来清晰地传达您的意图,甚至文档。在这种情况下,您将使用模式匹配
Some(value)
而不是调用
get
。在任何monad上调用
get
是一种不好的做法,因为它可以抛出。在您的示例中,对象将更加方便/更好,这就是根据FP的方式。通常你会使用功能性构图和理解性构图,以使其易于使用和惯用。例如:
对于{user Concur,这实际上根本不是关于akka,而是关于分解函数。也许可以这样重新表述它?我的示例只是为了说明。我需要的是防止忽略接收函数的情况。
def receive = {
  csae Alarm(null) => logger.log("false alarm")
  case Alarm(msg) => [... huge amount of code ...]
}