【问题标题】:Making code more scala idiomatic使代码更符合 Scala 习惯
【发布时间】:2014-04-11 02:22:23
【问题描述】:

我在 Scala 项目中遇到了类似 java 的代码。如何使它更符合 Scala 的习惯并且没有副作用(适当地处理异常)?

我正在考虑使用 scalaz 析取 / (我知道我也可以使用 Scala,但我猜我更喜欢右偏)。在一个函数中,有一些这样的 if 检查(上面的一个是一个例子)会抛出一种或另一种类型的异常。如何让这样的代码更符合 Scala 的习惯?

编辑: 问题不在于如何将 Java 空检查转换为 Scala Idiomatic,我已经在这样做了。例如关注

hpi.fold(throw new Exception("Instance not found for id " + processInstanceId)) { h =>
  val pi = new ProcessInstance(taskResponse)

现在现有函数的返回类型是某个值,例如“ProcessInstance”,例如但在我看来是误导。调用者永远不会知道这是否会引发异常,所以我的问题更多是关于从这些函数返回 Either[Error,Value] 。如果我有一些这样的异常被捕获到一个函数中,如何将它们全部累积并反映到返回类型中?

【问题讨论】:

    标签: scala


    【解决方案1】:

    一个想法可能会让processDefinition.getDiagramResourceName() 返回Option,因此您可以检查结果是Some(x) 还是None

    【讨论】:

    • 我已经改变了。问题更多的是从 Java 之类的代码中累积错误/异常并返回 Either[Error,Value] 类型的数据结构?
    【解决方案2】:

    使用 scalaz 和惯用语,这可能是我最终的结果(可能会重构):

    for {
        pd <- Option(processDefinition.getDiagramResourceName()).\/>("Diagram resource could not be found")
    } yield pd
    

    因此,如果您有 null,您将返回 Left("Diagram resource could not be found"),否则您将获得 Right(DiagramResourceName)

    【讨论】:

      【解决方案3】:

      一种基于案例类的方法,其中可以定义不同的名称、引用或标签子类,

      trait ResourceName
      case object MissingName extends ResourceName
      case class DiagramResourceName(name: String) extends ResourceName
      case class AnotherResourceName(ref: Int) extends ResourceName
      
      processDefinition.getDiagramResourceName() match {
        case DiagramResourceName(name) => println(s"name $name")
        case MissingName               => throw new ActivityException(errorMessage)
      }
      

      【讨论】:

      • 缺少名称可能是case object
      • 更新了更多信息的问题。问题不在于使用 Scala Option 处理 Java 空值,而主要在于返回类型
      猜你喜欢
      • 2012-07-23
      • 1970-01-01
      • 2020-03-01
      • 2013-01-02
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      相关资源
      最近更新 更多