讨论 Validation 的时候,不得不提及 Self encapsulation,objects 的 constructor 将成员变量的赋值代理给各自的 setter methods 来执行,而 setter 可以检查对象自身是否具有合适的 state。本书的作者并不认同将 self encapsulation 视作为 validation 的一种,因为从单一职责的角度来看,更适合由独立的 validation class 而不是 domain class 自己来执行 validation 操作。他对 self encapsulation 的看法是,assertions that follow a design-by-contract approach。所谓的 design-by-contract 是由 Bertravel Meyer 在 Eiffel 语言中所提倡的,可以具体细分为 pre-condition, post-condition 和 invariants of the components。
The primary reasons to use validation in the model are to check the correctness of
+ any one attribute/property,
+ any whole object
+ or, any composition of objects.
Domain model 的 validation 被划分为三个层次,也就是说,即使一个 Entity 中所有的 attributes/properties 都有效,这个 Entity 还是可能由于 attributes 的组合状态无效。因此,还是要用 Specification 或是 Strategy 来对整个 Entity 的状态来执行校验。
由于整个 Entity 的 state 必须对 validation 可见,并不表示将 validation processing 内嵌在 Entity 里是个好主意。很多时候对于 domain object 的 validation 逻辑的修改比起对于 domain model 本身的业务逻辑的修改来的更为频繁!此外,从 responsibility 的角度来考虑也应当独立出 validation component。
在使用像是 Java 这样的支持 package 的语言来开发的时候,应当将 domain objects 和 validation components 放在同一个 package 之内,并且将 domain class 的 read accessors 设为 `protected` 或是 package default。
更加复杂的 validation 涉及到的不仅仅是单个的 Entity 是否 valid,而是关系到一个或多个 Aggregate instances。这种情况下定义单个或是若干独立的 validator 可能不再有用,利用 Domain Service 来实现这种复杂的 validation 可能更为恰当。
评论