json - Scala:Option[Boolean] 有意义吗?

标签 json api scala boolean option

所以一个 Option[Int]Option[String]或者就此而言 Option[A]结果 Some(A)None ,但是一个 Boolean不同,因为它本质上代表双重状态( true/false ),拥有 Option[Boolean] 有意义吗? ?我在 JSON 时经常遇到这种情况响应不应包含基于某些业务逻辑的 boolean 字段。

有什么想法吗?

最佳答案

可选性是与数据类型的正交问题。是的,Option[Boolean]和说的一样有意义 Option[Int] .

让我们谈谈您的特定用例。

如果业务规则说字段(比如说)isPrimeTime必须是 Boolean 类型,但它是可选的,那么您应该使用 Option[Boolean] 对其进行建模.
None在此上下文中表示缺少值,Some(true)将意味着“现在和真实”,Some(false)将意味着“存在和错误”。这也将允许您在代码中添加默认值,如下所示:

val isPrimeTime = json.getAs[Option[Boolean]]("isPrimeTime").getOrElse(false)

您可以雇用各种Option在此类设置中出现的其他常见用例的组合器。 (我会让你的想象力发挥作用。)

如果您的域有很多这样的“三态”字段,并且如果第三个状态表示一些特定于域的想法,从上下文中不明显的东西,我强烈建议创建您自己的总和类型。即使您在技术上仍然可以使用 Option[Boolean] ,这可能不利于您的理智。这是一个例子。
sealed trait SignalValueIndication
case class Specified(value: Boolean) extends SignalValueIndication
case object DontCare extends SignalValueIndication

// Use
val signalValue = signalValueIndication match {
  case Specified(value) => value
  case DontCare => chooseOptimalSignalValueForImpl
}

这似乎是一个巨大的浪费,因为您正在失去 Option 上可用的组合器。 .这是部分正确的。部分原因是因为这两种类型是同构的,所以写桥不会那么难。
sealed trait SignalValueIndication {
  // ...
  def toOption: Option[Boolean] = this match {
    case Specified(value) => Some(value)
    case DontCare => None
  }

  def getOrElse(fallback: => Boolean) = this.toOption.getOrElse(fallback)
}

object SignalValueIndication {
  def fromOption(value: Option[Boolean]): SignalValueIndication = {
    value.map(Specified).getOrElse(DontCare)
  }
}

这仍然是重要的重复,您必须根据具体情况判断增加的清晰度是否可以弥补。

HaskellTips 最近在 twitter 上提出了类似的建议,随后也进行了类似的讨论。你可以找到它here .

有时字段的存在与否是您可以编码到数据结构中的决定。使用 Option在这种情况下是错误的。

这是一个例子。想象有一个字段 differentiator允许以下两种值。
// #1
{ "type": "lov", "value": "somethingFromSomeFixedSet" },

// #2
{ "type": "text", "value": "foo", "translatable": false }

在这里,假设 translatable字段是强制性的,但仅限于`"type": "text"。

你可以用 Option 来建模因此:
case class Differentiator(
  _type: DifferentiatorType, 
  value: String, 
  translatable: Option[Boolean]
)

然而,更好的建模方法是:
sealed trait Differentiator
case class Lov(value: String) extends Differentiator
case class Text(value: String, translatable: Boolean) extends Differentiator

亚伦·明斯基的 Effective ML谈话有一个关于这个的部分。您可能会发现它很有帮助。 (虽然他使用 ML 来说明要点,但这个演讲很容易理解,也适用于 Scala 程序员)。

关于json - Scala:Option[Boolean] 有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268388/

相关文章:

json - 从单个输入生成多个JQ输出文档,修改每个结果

javascript - 使用 ANGularJS 删除项目

php - 如何在 PHP 中安全地返回文件数据

java - Android 金融 API

postgresql - 在带有 uuid_generate_v4() 的 postgres 上使用光滑代码生成器时出错

Java 或 Scala。如何将\x22 之类的字符转换为 String

php json 解码txt 文件

iOS - 在 NSURLSession 中重新尝试失败的 NSURLRequests

javascript - 未捕获的语法错误 : Unexpected token : Can't resolve

scala - Scala 可以在参数中允许自由类型参数吗(Scala 类型参数是一等公民吗?)?