领域模型合法性判断

在创建领域模型时,对于实体的属性需要在领域模型中进行合法性验证,这样才能够保证合法性。那么验证放在哪里比较合适呢?

最直接的办法是将验证放在set函数中,比如下面的js代码:

1
2
3
4
setAge(age){
if(age<0) throw("年龄必须大于0")
this.age=age
}

领域模型需要与使用场景无关,我们假设这样一个场景,当用户在界面编辑一个实体的数据,需要在编辑过程中进行保存,这时,实体中的各个属性可能不合法,但仍然需要能够保存,如果在set属性中增加验证,用户如果需要保存实体,就必须让各个属性都通过验证,这样会打断思考过程。当然,我们可以创建一个草稿实体,但这同样带来新的问题。更好一点的办法是将赋值和验证分开:

1
2
3
4
5
6
7
8
setAge(age){
this.age=age
}

validateAge(){
if(this.age<0) return {isValidated:false,reason:"年龄小于0"}
return {isValidated:true}
}

还可以为整个实体编写一个validate函数,在这个函数中进行所有属性以及属性之间的验证,在使用实体进行其他工作之前,需要调用这个函数以确保实体的正确性。