文档章节

DDD(五)——值对象

MrYuZixian
 MrYuZixian
发布于 08/20 19:36
字数 1182
阅读 16
收藏 0

1、引言

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


2、值对象

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

// 地址
public class Address
{
    // ID
    public Long id;

    // 省份
    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,组合一组随机数等等。程序生成的无论是唯一性还是可靠性都极高。

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


4、小结

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

© 著作权归作者所有

MrYuZixian

MrYuZixian

粉丝 4
博文 27
码字总数 14603
作品 0
深圳
私信 提问
C#进阶系列——DDD领域驱动设计初探(一):聚合

原文:C#进阶系列——DDD领域驱动设计初探(一):聚合 前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的。今天看到一篇博文里面写道:越是忙人越有时间写博客。呵呵,似乎有点...

杰克.陈
2017/12/19
0
0
C#进阶系列——DDD领域驱动设计初探(四):WCF搭建

原文:C#进阶系列——DDD领域驱动设计初探(四):WCF搭建 前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储。领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再...

杰克.陈
2017/12/19
0
0
DDD理论学习系列(7)-- 值对象

DDD理论学习系列——案例及目录 1.引言 提到值对象,我们可能立马就想到值类型和引用类型。而在C#中,值类型的代表是strut和enum,引用类型的代表是class、interface、delegate等。值类型和引...

圣杰
2017/06/14
0
0
DDD理论学习系列——案例及目录

目录 DDD理论学习系列(1)-- 通用语言 DDD理论学习系列(2)-- 领域 DDD理论学习系列(3)-- 限界上下文 DDD理论学习系列(4)-- 领域模型 DDD理论学习系列(5)-- 统一建模语言 DDD理论学习...

圣杰
2017/05/16
0
0
DDD学一步写一篇--DDD开发实践流程

DDD大家讨论的比较多的一般都是DDD的思想和理论,很少有文章讨论具体是如何实施和落地,所以这也导致很多同学看完了Evans经典巨著后对DDD还是不知道如何去实施。这篇文章我们讨论下DDD的实施...

monkey01
2018/11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
6
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
7
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
5
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
6
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部