1.问题
DDD方法学中,花了这么大的功夫来区分实体和值对象,那么识别值对象有什么好处呢?
2.值对象的优点
主要体现在内存和数据库布局的灵活性上。
有了这种灵活性,就可以根据性能、编程方便性等因素,决定值对象的不同实现方式。
其次,值对象的不变性也会带来更高的程序质量。
这些优点,都是实体所不具备的。
2.1对象的内存布局
现在可以看到,在内存里,我们既可以为了编程的方便,不共享值对象,也可以为了节省内存而共享,这种灵活性是实体所不具备的。这正是值对象的主要优点之一。
设计模式,叫做“享元”,也就是共享的单元,英文是 Lightweight。
2.2实体的数据库布局
和内存布局类似,值对象在数据库里也是既可以共享,也可以不共享,比实体更灵活。
2.2值对象的其他优点
首先,很多程序的错误,是由于修改对象时不小心引起的。由于值对象是不可变的,所以采用值对象就可以减少出错的几率。
其次,在并发编程里,主要的错误来源也是可变性,使用值对象,也可以减少并发错误。
最后,函数式编程总是假定被操作的对象是不变的,因此,使用值对象也更容易进行函数式编程。
3总结
值对象的主要优点是,不论在内存还是数据库里,都可以选择共享和不共享的方式。这种灵活性,可以使我们在实现的时候,基于性能等原因进行优化。而这些优点,都是值对象的不变性带来的。
此文章为2月Day8学习笔记,内容来源于极客时间《手把手教你落地 DDD》