gpt4 book ai didi

scala - 当函数具有参数的先决条件时,返回 Either/Option/Try/Or 是否被视为可行/惯用的方法?

转载 作者:行者123 更新时间:2023-12-02 05:39:59 25 4
gpt4 key购买 nike

首先,我是 Scala 的新手,没有任何使用它编写生产代码的经验,所以我不了解什么是社区中的良好/最佳实践。我偶然发现了这些资源:

  1. https://github.com/alexandru/scala-best-practices
  2. https://nrinaudo.github.io/scala-best-practices/

那里提到抛出异常不是很好的做法,这让我想到什么是定义函数前提条件的好方法,因为

A function that throws is a bit of a lie: its type implies it’s total function when it’s not.

经过一些研究,似乎使用 Option/Either/Try/Or(scalactic ) 是一种更好的方法,因为您可以使用诸如 T 或 IllegalArgumentException 之类的东西作为返回类型,以清楚地表明该函数实际上是部分函数,​​使用异常作为存储可以包含在其他异常中的消息的方式。

但是,由于缺乏 Scala 经验,我不太明白这对于实际项目是否真的可行,或者使用 Predef.require 是否可行。如果有人能解释一下 Scala 社区通常是如何做的以及为什么这样做,我将不胜感激。

我也看过 Functional assertion in Scala ,但是虽然这个想法本身看起来很有趣,但我认为 PartialFunction 并不是很适合现在的目的,因为通常会传递多个参数,并且在这种情况下元组看起来像是一种 hack。

最佳答案

OptionEither 绝对是函数式编程的必由之路。

使用 Option 记录 为什么 可能返回 None 很重要。

对于 Either,左侧是不成功的值(“错误”),而右侧是成功的值。左侧不一定是 Exception(或其子类型),它可以是简单的错误消息 String(类型别名是您的 friend )或适合您的应用程序的自定义数据类型。

例如,在使用 Either 进行错误处理时,我通常使用以下模式:

// Somewhere in a package.scala
type Error = String // Or choose something more advanced
type EitherE[T] = Either[Error, T]

// Somewhere in the program
def fooMaybe(...): EitherE[Foo] = ...

Try 应该只用于包装不安全(大多数情况下是纯 Java)代码,让您能够对结果进行模式匹配:

Try(fooDangerous()) match {
case Success(value) => ...
case Failure(value) => ...
}

但我建议只在本地使用 Try,然后从那里使用上述数据类型。

一些高级数据类型,如 cats.effect.IOmonix.reactive.Observable 本身包含错误处理。

我还建议调查 cats.data.EitherT用于基于类型类的错误处理。阅读文档,绝对值得。


作为旁注,对于所有来自 Java 的人,Scala 对待所有 Exception 的方式与 Java 对待 RuntimeException 的方式一样。这意味着,即使您的某个依赖项中的一段不安全代码抛出(已检查)IOException,Scala 也永远不会要求您catch 或以其他方式处理该异常。因此,根据经验,在使用 Java 依赖项时,几乎总是将它们包装在 Try 中(如果它们执行副作用或阻塞线程,则将它们包装在 IO 中)。

关于scala - 当函数具有参数的先决条件时,返回 Either/Option/Try/Or 是否被视为可行/惯用的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56785948/

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