第二部分:DDD中的值对象

目录

定义

最佳实践

不好案列

值对象的使用方式


定义

  1.  用于度量或者描述领域中的某一概念,本身没有概念标识的对象;
  2.   创建之后,它是不可变的,当度量或者描述改变时,可以用另一个值对象予以替换;
  3. 可以把一组相关的属性整合到一起,表达一个整体概念(比如RMB(元),就是一个数字加上货币类型组成一个RMB这样的整体概念);
  4. 值对象的构造函数保证概念整体的有效性和不变形;
  5. 值对象的所有方法都是无副作用的函数(不修改内部属性)。

最佳实践

  1.  优先使用值对象而非实体对象建模,判断一个对象是值对象还是实体?调用者对其的相等判断是依据值(值对象)还是依据身份标识(实体);对象的属性值是否发生变化,如果发生变化,产生一个完全不同的对象(值对象),还是维持相同的身份标识(实体);值对象无需管理生命周期管理,往往作为实体的附庸,不拥有Repository;
  2. 善于运用值对象而非内建类型去表达那些细粒度的领域概念。可以封装领域逻辑,包括自我验证(减少实体类拥有的大量验证代码)等自给自足的领域行为,分摊实体上的行为重任;
  3. 尽量将值对象设计为不变类。对象创建以后其状态就不能修改。可以减少并发控制的成本;
  4. 当模型概念从上游上下文流入下游上下文中,可以使用值对象来表示这些概念,通常会去简化属性,形成一种“实体的描述”,从而蜕变为值对象。

不好案列

  1. 值对象中引用实体对象。值对象的方法中传入实体;
  2. 将所有东西看成值对象,如对实体中的简单属性,其并不和其他属性关联,不需要额外功能支持;
  3. 一个值对象有可能被当成数据库实体而被持久化,但并不意味着我们将领域对象建模成实体。要回到本质问题的思考:“度量或描述”而非实体存在。

    值对象经常作为参数在对象之间传递消息。它们常常是临时对象,在一次操作中被创建,然后丢弃。它可用作实体(以及其他值对象)的属性。

值对象的使用方式

     复制和共享,具体使用哪种方式取决于实现环境。虽然复制有可能导致系统被大量的对象阻塞,但是共享可能会减慢分布式系统的速度。
           在以下情况最好使用共享:这样可以发挥共享的最大价值并最大限度的减少麻烦。
           1.节省数据库空间或者减少对象数量是一个关键要求时。
           2.通信开销很低时
           3.共享对象被严格要求限定为不可变时

你可能感兴趣的:(DDD,领域驱动设计,设计规范,程序人生)