1、引言

之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述,唯一标识也是字面意思,可以代表对象的唯一特征。


2、值对象

假设你手上有一沓钞票,我们去超市购物的时候,很显然我们会根据面额去付款,不会拿20元当50元花,也不会把美元当人民币花,毕竟¥50≠$50。那对于钞票来说,我们通过钞票上印刷的数字面额和货币单位识别它。每张钞票上都印有编号,我们为什么不用这个编号来识别它呢。因为我们平时购物付款,不会用编号识别面额,编号显然是银行关心的事,与我们无关。所以我们可以知道,对于某一特定的事物,我们可以通过值来确定它,识别它。

// 地址
public class Address
{
    // 省份
    public string province;

    // 城市
    public string city;

    get()...
    set()...
}

我们通常的写法都是这样,ID作为主键映射到数据库,以此来标识这条信息。但是一个人可以有多个地址,可以是在外租的房子,也可以是租了好多房子,也可以是自己家等等,总之一个人可以拥有很多个地址。但是地址是不会变的,为什么这么说,例如:广东省深圳市龙岗区xx街道xx号,主人会换,但是地址是不变的。

比如现在有多个合租的人同时添加地址,那么地址几乎是统一的,但是无论是收包裹,寄快递,都是这一个地址,不会因为id不同就改变本来的意义。所以地址本身就是一个值。那么我们在构造当中写入参数进来创建对象。

Address address = new Address("广东省", "深圳市");

如果我们用ORM持久化机制,就如下:

// 收货人
public class person
{
    // 姓名
    public string name;

    // 地址
    public Address address;

    get()...
    set()...
}

3、唯一标识

唯一标识就是能唯一代表我们本身的一个事实存在的信息,例如身份证,DNA,都是唯一的。我们在创建实体的时候,一般都会创建一个id来唯一标识,但是这样不容易区分,因为所有的实体本质上的唯一标识都是id。

生成唯一标识得方式有:

  • 用户提供多个唯一值,保证这些值一定是唯一得。

  • 程序内部通过算法自动生成的身份标识。

  • 数据库自增长生成的唯一标识。

用户输入唯一值无疑是很直接了当的一种做法,这种方法很简单,但是也存在很大的副作用,副作用之一就是必须用户自己提供高质量的唯一标识,比如身份证好吗、汽车车牌号等,这就需要校验他的唯一性和确定性。而且有时候业务上可能需要通过主键唯一标识来做排序等操作。而且有的唯一标识非常的长,可识别性特别低。

应用程序生成的唯一标识是非常方便也非常可靠的一种唯一标识,常用的订单编号等,程序生成的方式有很多,计算当前时间毫秒,计算计算机的ip,组合一组随机数等等。程序生成的无论是唯一性还是可靠性都极高。

数据库生成的也是极为可靠且比较容易识别的一种了,常用的就是从1开始自增作为唯一标识。


4、小结

关于值对象的理解,我认为记住以下这个公式就好了值对象=值+对象=将一个值用对象的方式进行表述。在很多情况下使用一些特定的唯一标识可以很方便的识别出当前操作的数据是做什么的,例如订单号可以作为订单表的唯一标识,甚至多个唯一标识,不过这样会让很多操作变得困难。

08-21 00:20