【发布时间】:2013-02-02 08:53:03
【问题描述】:
假设有一个Car 模型对象(如case class),它是不可变的并使用构建器模式创建。 (Joshua Bloch 的建造者模式)。
它的build 方法调用CarValidator 对象以允许创建或不创建相关Car。否则,它会抛出一个IllegalStateException,其中会精确处理意外字段。
因此,没有人可以在运行时随时创建陈旧或无效的Car,太棒了!
假设现在有一个 Web 表单来创建 Car。 Play 的控制器将包含此表单映射:
val carForm = Form( //this is a conceptual sample
mapping(
"brand" -> nonEmptyText,
"description" -> nonEmptyText,
"maxSpeed" -> number
"complexElement" -> number.verifying(........) //redundant validation here
)(Car.apply)(Car.unapply)
)
在此示例中,有一些基本字段,但想象更复杂的字段需要复杂的业务验证,例如此处的 complexeElement。
我真的觉得我很容易打破DRY(不要重复自己)。
确实,无论表单验证会带来什么,这将由我的Car builder 的验证器提供,因为模型验证是最重要的验证位置,不应依赖于其他任何东西。
我想象一个解决方案,在我的 Controller 附近有一个 Helper 类来处理我的构建器使用的相同验证器对象。但是,它迫使我获取所有验证方法public,以便在我的 Web 表单的任何验证步骤中独立调用(如上面的代码 sn-p)。
在避免破坏 DRY 的同时保持此构建器原则的良好做法是什么?
【问题讨论】:
标签: java scala validation playframework-2.0