定义:测试
实体不只须要知道它是什么,还要知道它是哪一个,值对象只关心它是什么。优化
实体:许多对象不是由它们的属性来定义,而是经过一系列的连续性和标识来从根本定义的。只要一个对象在生命周期中可以保持连续性,而且独立于它的属性(即便这些属性对系统用户很是重要),那它就是一个实体。对象
值对象:当你只关心某个对象的属性时,该对象即可以做为一个值对象。为其添加有意义的属性,并赋予它相应的行为。咱们须要将值对象当作不变对象,不要它任何身份标识,还应该尽可能避免像实体对象同样的复杂性。生命周期
对于实体,实体核心是用惟一的标识符来定义,而不是经过属性定义。即便属性彻底相同的也多是不一样的对象。同时实体自己是由状态的,实体有严谨的生命周期,实体自己会体现出相关的业务行为,业务行为会被实体属性或状态形成影响和改变。变量
值对象自己无状态,不可变,而且不分配具体的标识。自己无生命周期,也不会产生独立行为。方法
举个栗子:数据
一、手机由SN号识别,手机是一个实体。手机的配件这种场景下就是值对象。项目
二、体育场的座位,门票上有座位号,座位号能够最为惟一标识,座位是实体。可是若是门票没有座位号,先到先作,座位没有座位号,只有数量,坐一个少一个,这时候座位就是值对象。模型
值对象的使用目的:管理
使用不变的值对象使得咱们作更少的职责假设。
值对象用于度量和描述事物,DDD中建议尽可能使用值对象来建模而不是实体对象,由于值对象很是容易的进行建立、测试、使用、优化和维护。
值对象的特征:
一、它度量或者描述了领域的一件东西。
二、它能够做为不变量。
三、它能够将土拨杆的相关的属性结合成一个概念总体。
四、当度量和描述发生改变的时候,能够用另外一个值对象替换。
五、它能够和其余值对象进行相等比较
六、它不会对协做对象形成反作用
最小化集成:
DDD项目中,一般存在多个限界上下文,这意味着咱们须要找到合适的方法对这些上下文进行集成。当模型概念从上流上下文流入下游上下文时,尽可能使用值对象表示这些概念。这样能够达到最小化集成,便可以最小化下游模型中用于管理职责的属性数数目。使用不便的值对象使得咱们作更少的职责假设。
聚合与聚合根
定义了对象之间清晰的关系和边界,并实现领域模型的内聚。
必须将聚合做为一个修改数据的单元。
一个聚合必须有一个聚合根,根是聚合中的一个实体,一般聚合中其余实体须要依赖于聚合根,其余实体不能没有聚合根而存在,从业务的角度看它是没有单独存在的意义。
对一个聚合中的实体的访问和操做,必须经过这个聚合的聚合根开始,确保一致性规则。例如订单的总金额依赖每一个订单项的总和。
一个聚合只有一个聚合根,聚合根是能够独立存在的,聚合中其余实体或者值对象依赖聚合根。
只有聚合根才能被外部访问到。
针对功能模块进行系统划分,粒度太粗,使用聚合能够精确划分粒度。