实体的唯一标识:
1.用户提供唯一标识
2.应用程序提供唯一标识
3.持久化机制提供唯一标识
PS: 维护实体唯一标识的稳定性,只有在创建时可以对唯一标识进行修改。自封装性有助于维护稳定。
创建实体
1.我们希望通过构造函数,能够完成实体的创建,创建过程中,使用自封装(调用自己的set方法)
2.在实例化的过程中,要保证对象内数据的一致性,比如有当merchantVoucher==null时,order实体不能创建成功
验证
验证属性:Martin Flower建议使用自封装性做属性验证
public setEmail(String address){
if(StringUtils.isBlank(address)){ throw new IllegalArgumentExcetion(“address can’t be null”)};
if(address.length>25535){ throw new IllegalArgumentExcetion(“address can’t be too long”)};
}
验证整个对象:对于一个聚合或者实体,一个属性正确并不能代表整个对象是被正确创建的
由于验证逻辑需要访问实体的所有状态,有人可能会吧验证逻辑写到实体对象中,更多时候验证逻辑比领域逻辑本身的变化还要快,这样做很不好。,此时我们可以创建一个单独的组件进行验证:
1.实体对象的可以有protect的getter,在同一个包的验证类可以访问到即可
2.验证类可以采用规范模式或者策略模式,当发现状态非法时,验证类会通知客户方或者记录下来
跟踪变化
1.没有必要完整的追踪实体的变化,但是有时候会关心发生在模型中的一些关键事件,最常用的方法是领域事件和事件存储,相关的技术可以参考事件源模式