相同案例 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]
我在 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]