假设一个Car
模型对象(as 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
的构建器的验证器提供,因为模型验证是最重要的验证位置,不应该依赖于其他任何东西。
我想象一个解决方案,其中一个Helper
类靠近我Controller
处理我的构建器使用的相同验证器对象。但是,它迫使我获取所有验证方法public
,以便在我的 Web 表单的任何验证步骤中独立调用(如上面的代码片段)。
在避免破坏 DRY 的同时保持此构建器原则的好做法是什么?