Scala 如何在actor receive中终止处理?
我目前在阿克卡演员的接收方法中有一些巨大的if块。例如: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) =>
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 ...]
}