Scala - 具有大量字段的域对象

Posted

技术标签:

【中文标题】Scala - 具有大量字段的域对象【英文标题】:Scala - Domain Objects with lots of fields 【发布时间】:2018-07-29 02:06:53 【问题描述】:

这可能是一个愚蠢的问题,但我对 Scala 比较陌生,所以请多多包涵。我正在尝试为 Scala 中的 Spark 作业建模域对象,它反映了源记录的数据结构并包含 100 多个字段。我正在尝试找出最好的建模方法,因为我不喜欢简单地将所有字段添加到单个案例类中。我曾考虑将密切相关的字段分组到嵌套案例类中,但后来我在一些地方读到不建议使用嵌套案例类。我会很感激一些关于什么是最好的方法的意见。

编辑:回应 Alvaro 的 cmets:

所以本质上我们是说不推荐这样做:

case class Product(name: String,
                   desc: String,
                   productGroup: String) 


  case class ProductPack(packType: String,
                         packQuantity: Int,
                         packQuantityUnit: String,
                         packUnitPrice: Float)

虽然这样很好:

case class Product(name: String,
                   desc: String,
                   productGroup: String,
                   productPack: ProductPack) 




case class ProductPack(packType: String,
                       packQuantity: Int,
                       packQuantityUnit: String,
                       packUnitPrice: Float) 


【问题讨论】:

您从哪里了解到不推荐使用嵌套案例类? 这是我读到的地方之一here 该指南不鼓励在其他案例类(嵌套类)中使用案例类的定义。但是拥有一个案例类的属性 reference 其他案例类(在类之外定义)很好。 如果您提供一些实际代码,也许是一个具有多个属性的类,我们可能会提供更多相关帮助。 如果您需要在单个案例类中添加超过 22 个字段,请阅读:underscore.io/blog/posts/2016/10/11/twenty-two.html 【参考方案1】:

您的更新是正确的。

另一种选择:如果案例类主要在另一个概念的上下文中有意义,有时我会在该概念的伴侣中定义案例类:

case class Product(
  name: String,
  desc: String,
  productGroup: String
  productPack: Product.Pack
) 

object Product 
  case class Pack(
    packType: String,
    packQuantity: Int,
    packQuantityUnit: String,
    packUnitPrice: Float
  )

那也应该没问题。该类包含在一个对象中,但它没有“嵌套”在Product 类中。

【讨论】:

感谢您的意见。伴随对象中的案例类看起来更干净

以上是关于Scala - 具有大量字段的域对象的主要内容,如果未能解决你的问题,请参考以下文章

具有大量引用字段(数组除外)的对象是否会破坏Hotspot JVM的GC堆遍历性能?

Scala 相关服务

Scala,扩展具有通用特征的对象

类对象基础类型操作(Scala)

具有不同生命周期的对象的 Scala 蛋糕模式

Scala类与对象