如何在我的应用流程中有效地构建复杂的案例类?

时间:2017-03-31 22:50:53

标签: scala case-class

我有一个控制器方法可以将客户端的请求提取到ModelOne,我需要更改此模型并将其构建为更大的模型,然后调用它ModelTwo以便我可以发送它到另一个服务。

这是ModelOne案例类:

case class ModelOne(list: List[String], expectedListSize: Int)

这是ModelTwo案例类:

case class ModelTwo(modelThree: Option[ModelThree])

case class ModelThree(status: Status(its enum),
                                        list: List[String],
                                        amount: Option[Int],
                                        message: Option[String])

所以我现在正在做的就是每当我从控制器中的客户端获得请求时,我就会调用一个具有构建方法的服务,因为我需要使用{{1}来自ModelOne的属性并构建ModelTwo,它看起来像这样:

list

所以在控制器中我去了:

def buildModelTwoResponse(modelOne: ModelOne): ModelTwo = {
    ModelTwo(Some(ModelThree(Status.Done, modelOne.list, None, None)))
}

有更优雅的方法吗?

2 个答案:

答案 0 :(得分:0)

如下:

case class ModelOne(list: List[String], expectedListSize: Int) {
object ModelOne {
    buildResponse(modelOne: ModelOne): ModelTwo {
       ModelTwo.fromModelOne(modelOne)
    }
}

case class ModelTwo(modelThree: Option[ModelThree])
object ModelTwo {
     def fromModelOne(modelOne: ModelOne): ModelTwo = {
         fromModelThree(ModelThree.fromModelOne(modelOne))
     }

     def fromModelThree(modelThree: ModelThree): ModelTwo = {
         ModelTwo(Some(modelThree))
     }
 }

case class ModelThree(status: Status(its enum),
                                    list: List[String],
                                    amount: Option[Int],
                                    message: Option[String]) 
object ModelThree { 
   def fromModelOne(status: Status, modelOne: ModelOne): ModelThree = {
       ModelThree(status, modelOne.list, None, None)
   }
}

答案 1 :(得分:0)

更优雅的方法是通过定义ModelTwo函数为其伴随对象中的apply类型定义第二个构造函数:

case class ModelTwo(modelThree: Option[ModelThree])

// Add this
object ModelTwo {

  // Move your service function logic to here
  def apply(modelOne: ModelOne): ModelTwo = {
    ModelTwo(Some(ModelThree(Status.Done, modelOne.list, None, None)))
  }
}

那么你就不再需要你的服务功能,所以不要这样做:

// You don't need this
val modelTwo = myService.buildModelTwoResponse(modelOne)

你可以这样做:

val modelTwo = ModelTwo(modelOne)