代码之家  ›  专栏  ›  技术社区  ›  franklin sharjeel

使用具有超过22个参数的Play框架和case类

  •  2
  • franklin sharjeel  · 技术社区  · 8 年前

    我已经看到一些其他问题涉及臭名昭著的“22个字段/参数”问题,这是一个固有的缺陷(功能?)Scala V<2.11. 看见 here here . 然而,根据这一点 blog post 中的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抱怨在 案例类别 . (具体来说:在对象定义的最后一行,当编译器尝试构建时,我得到:“实现将函数限制为22个参数”。)我目前正在使用Scala v2.11.6,所以我 这不是语言问题。这让我觉得Play library没有更新其 Read .

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

    3 回复  |  直到 8 年前
        1
  •  1
  •   Jeffrey Chung    8 年前

    语言问题。在这种情况下,函数调用是:

    L.apply _
    

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

        2
  •  0
  •   franklin sharjeel    8 年前

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

    我将其称为“变通方法”,因为虽然它确实“有效”,但它通常解决症状,而不是问题。

    shapeless How to get around the Scala case class limit of 22 fields? ; (2) Blog post Yet another blog post .

    2、解决方案

    正如钟杰弗里所提到的,就是要重组模型来应对这一限制。正如业内许多人所指出的那样,拥有一个具有30个以上参数的函数可能表明您的函数做得太多,或者应该重构该函数以吸收更少的参数。参见(1) Rule of 30 – When is a method, class or subsystem too big? ; (2) Databrick's style guide

        3
  •  0
  •   Shanness    6 年前

    在此处查看答案 https://stackoverflow.com/a/57317220/1606452

    看起来这一切都处理得很好。

    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 作为首选解决方案(但尚未合并)