【问题标题】:Using Play Framework and case class with greater than 22 parameters使用超过 22 个参数的 Play Framework 和案例类
【发布时间】:2017-10-03 18:47:41
【问题描述】:

我已经看到了一些涉及臭名昭著的“22 个字段/参数”问题的其他问题,这是 Scala V here 和 here。但是,根据这个blog postcase class 中的 22 个参数限制似乎已修复;至少在语言方面。

我有一个case class,我想加载任意(读取:> 22)个值,稍后将使用 Play 库将其读入 JSON 对象。

看起来像这样:

object L {
  import play.api.libs.json.Reads. _
  import play.api.libs.functional.syntax._

  implicit val responseRead: Reads[L] = (
    MyField1.jsPath.Read[MyField1.t] and 
    MyField2.jsPath.Read[MyField2.t] and
    ...
    MyField35.jsPath.Read[MyField35.t]
  ) (L.apply _)
}

case class L(myField1: MyField1.t, myField2: MyField2.t, ... myField35: MyField35.t)

问题是在编译时,Scala 抱怨case class 中有超过 22 个参数。 (具体来说:在对象定义的最后一行,当编译器尝试构建时,我得到:“实现将函数限制为 22 个参数”。)我目前使用的是 Scala v2.11.6,所以我认为 这不是语言问题。这让我觉得 Play 库没有更新他们对 Read 的实现。

如果是这样,那么我想最好的办法是将相关字段分组到元组中并通过 JSON API 传递元组?

【问题讨论】:

    标签: json scala playframework case-class


    【解决方案1】:

    正如您引用的博文中所述,22 个参数的限制对于 Scala 2.11 及更高版本中的函数仍然有效,因此您遇到的语言问题。本例中的函数调用为:

    L.apply _
    

    重组模型是解决此限制的一种方法。

    【讨论】:

    • 重构模型并不总是可行的。请参阅下面的解决方法。
    【解决方案2】:

    所以这个问题的答案其实是两部分:

    1。解决方法

    我将此称为“解决方法”,因为虽然它确实“起作用”,但它通常解决的是症状而不是问题。

    我的解决方案是使用shapeless 提供任意长度的通用异构列表。该解决方案已在其他地方得到广泛讨论和使用。参见,例如,(1) [SO Post] How to get around the Scala case class limit of 22 fields?; (2)Blog post; (3)Yet another blog post.

    2。解决方案

    正如@jeffrey-chung 所提到的,要重组模型来处理这个限制。正如业内许多人所指出的,拥有超过 30 个参数的函数可能表明您的函数做得太多,或者应该重构该函数以摄取较少数量的参数。参见,例如,(1)Rule of 30 – When is a method, class or subsystem too big?; (2)Databrick's style guide.

    【讨论】:

      【解决方案3】:

      在这里查看答案 https://stackoverflow.com/a/57317220/1606452

      看起来这一切都很好。

      +22 字段案例类格式化程序和更多用于 play-json https://github.com/xdotai/play-json-extensions

      支持 Scala 2.11.x、2.12.x 和 2.13.x 并播放 2.3、2.4、2.5 和 2.7

      并且在play-json issue 中被引用为首选解决方案(但尚未合并)

      【讨论】:

        猜你喜欢
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-27
        相关资源
        最近更新 更多