相同案例 class 不同验证

Same case class different validation

我在 Scala 2.11 和 akka 中尝试做的是一种情况 class 但是基于命中的路由有两种不同的验证。

例如,让我们考虑下面class的情况

case class User(_id: String, name: String, age: Int, address: String)

现在当 /create 路由被命中时,我不需要 _id 但我需要所有其他字段。

但是当 /update 路由被命中时,我需要 _id 和要更新的字段(可以是一个或全部三个)

只声明 Option 并不能达到目的,因为那样我的 /create 路线就会被折腾。

即使扩展案例 classes 也不能真正无缝地工作(代码重复太多)。

如果这样的事情是可能的,我会很高兴

case class User(_id: String, name: String, age: Int, address: String)

case class SaveUser() extends User {
    require(name.nonEmpty)
    require(age.nonEmpty)
    require(address.nonEmpty)
}

case class UpdateUser() extends User {
    require(_id.nonEmpty)
}

有什么优雅的解决方法吗?还是我必须创建两个相同的案例 classes?

我的建议是针对不同的要求对不同的大小写 classes 进行编码,但是如果您坚持必须在这两种情况之间共享代码,则可能的解决方案是参数化大小写 class

case class User[Id[_], Param[_]](_id: Id[String], name: Param[String], age: Param[Int], address: Param[String])

然后您为 Identity 类型构造函数定义一个别名以及您对 case 的两次使用 class

type Identity[T] = T
type SaveUser = User[Option, Identity]
type UpdateUser = User[Identity, Option]