三、实体、值对象

一、简介

上面两篇,我们了解了DDD中战略建模部分。从领域、子域的问题分析,到限界上下文和限界上下文映射图的领域模型划分与集成关系约定。

本篇开始,将开始了解战术部分的内容。即,如何在程序实现的角度进行设计

本文涉及战术内容包括两种领域对象:实体、值对象两种

在OOAD当中,我们通常会通过提取名词的方式来获取一个对象,并获取动词的方式来提取对象的行为。

在DDD当中其实也差不多,根据领域当中的一些领域概念来构建领域对象

二、实体

特征

实体是属于领域对象的一种,它具有两个显著的特征

1、实体是有唯一标识符的,怎么理解这个唯一标识符呢?比如我们都有一个身份证号码,它是唯一的,即使你这个人改了名字,人家依旧根据你的身份证号来标识确定你这个人的唯一性。既然这样,实体在领域模型中存在的意义就是表示那些需要被唯一区分的领域概念。比如,一个商品、一笔订单、一条消息...如此种种

我们可以采用机器算法自己生成ID,也可以通过数据库主键来生成ID,或者从别的地方获取ID,但请记得,在当前的限界上下文当中,这个ID必须是唯一的,至于脱离了当前上下文,那则允许重复。

2、实体是可变的,除了唯一标识外实体是可变的。对于一个唯一的领域对象来说,只要它的唯一标识是相同的,那么它就是同一个领域对象,即使其它属性都不同。也就呼应了唯一标识符这个特征,它确定了对象的唯一性。你不可以改变一个创建的实体的唯一标识符,但是可以改变其中的实体属性。

所以实体在领域模型当中就是为了用来描述具备唯一性的对象,它是领域建模当中描述领域对象很重要的一个概念。

角色

实体描述了一种领域概念,比如一个人,那么这个人可能存在多种角色,假设一个人在公司身兼两职,即是产品经理,又是系统研发人员。

这两种角色拥有不一样的行为,如果我们把它集中用一个实体去描述,那么可能出现一个问题,就是当它以产品经理这个角色出现的时候,我们发现它竟然可以做研发人员这个角色的事。或许在实际工作中是有好处的,但在设计当中这样职责含糊不清的情况只会导致问题的出现。

这时候,我们有两种解决方案

1、我们用两个实体去分别描述产品经理和研发人员,各自实现自己的功能,对于相同的数据只要做拷贝就好了。

2、我们可以把产品经理和系统研发人员设计成两个接口,这样只要我们做向上转型以后,在当前的概念里面也就只有一个角色存在了。

所以,确认实体的时候,我们还得去关注这个实体的角色是什么,这样我们才能适当地去暴露相应的行为,不多也不少。

三、值对象

未待完续。。。。

猜你喜欢

转载自www.cnblogs.com/lay2017/p/10454211.html