副作用函数返回分离



我有一个副作用函数,它会改变类变量或在不满足先决条件时抛出异常。添加到类级别可变映射后,我想从函数返回一个"布尔值",表示成功。所以下面是我在想什么,但硬编码布尔值为"真"感觉不合适,但这将是情况下,当它进入yield块,否则左侧的分离将被一个异常填充。

def add(e: Entity, value: String): /[Throwable,Boolean] = {
checkIfFieldIsKey(e.id) match {
  case Some(id) =>
    val validId = validateIdType(..)
    for {
      k <- validId
    } yield { keys += (e -> k); true }
  case None =>
    for {
      r <- validateTypeAndValue(e, value)
    } yield { values += (e -> value); true } 
  }
}

其中'键'和'值'是ConcurrentHashMap的'val'实例。因此,每次"add"成功时,析取的右侧总是为"真",这意味着布尔值将永远不会为假。这看起来合适吗?

当副作用方法没有有意义的返回值时,通常返回Unit。如果您想捕获失败的可能性,返回Throwable / Unit是完全合理的,这可能就是我在这里要做的。在任何情况下,我都会说你的直觉,这是一个坏主意,返回一个Throwable / Boolean,右边永远不能是任何东西,但true是正确的。

看起来很傻。如果成功,可以简化为Option[Throwable]None,如果失败,则可以简化为异常。唯一反对它的是None通常不与成功联系在一起。

作为一种替代方法,您可以编写自己的maybe monad,使用SuccessFailure(throwable)作为案例。

最新更新