美文网首页
实现领域驱动设计-值对像

实现领域驱动设计-值对像

作者: marx_yu | 来源:发表于2018-12-23 00:17 被阅读0次

值对像和实体是两种领域对象,也是最重要的领域模型,跟实体相比,值对像没有唯一标识,由对象的属性值一起来标定一个对象实例。书中说“我们应该尽量使用值对像来建模而不是实体对象”,为啥作者会推崇值对像呢?

值类型的特点概述:值类型用于度量和描述事物,我们可以非常容易地对值对像进行创建、测试、使用和维护。

值对像的特征

度量和描述:值对像不应该成为领域中的一件东西,而是用来度量或描述领域中的某件东西的一个概念。这可以作为值对象的一个定义。

不变性:一个值对象在创建之后便不能改变。这是一个非常“技术性”的建议。那如果领域中的这件东西的属性变化了,怎么表示呢?创建一个新的值对象进行替换,比如修改一个光标的位置,应该是cursor.position = new positiont(x, y), 而不是cursor.position.x=nx;cursor.position.y=ny;这里的position就是一个值对像。也引申的,一个值对像里头,是不建议引用一个实体对象的。

概念整体:一个值对象可以只处理单个属性,也可以处理一组相关联的属性,但这些相关联的属性中,每一个属性都是整体属性所不可或缺的组成部分。比如上面举例的position的x、y坐标是必须在一起才能表达清楚概念的,比如书中举的例子货币度量,必须有amount数量和currency货币单位。“每个值对像都是一个内聚的概念整体,它表达了通用语言中的一个概念”

可替换性:“在你的模型中,如果一个实体所引用的值对像能够正确地表达其当前的状态,那么这种引用关系可以一直维持下去。否则,我们需要将整个值对象替换成一个新的值对象实例”,也如上面不变性说的,如果实体对象的属性变了,那就创建一个新的属性表示的值对像,来替换原来的属性。

值对像相等性:如果两个值对象的类型和属性都相等,那么这两个对象也是相等的。可以跟实体的相等性比较,实体的相等性判断是以实体标识是否相等为依据的(标识相同,属性不同,那是一个实体的不同状态)。所以“如果两个或多个值对象实例是相等的,我们便可以用其中一个实例来替换另一个实例”。比如两个position的x、y都相同,那肯定是标识平面上的同一个位置,那我们使用那个position实例都是可以的。

无副作用行为:无副作用函数表示对某个对象的操作,它只用于产生输出,而不会修改对象状态。比如Java中大家最熟悉的String类,就有大量无副作用函数,比如String s1 = "test1", String s2 = s1.substring(1); 这时候产出新的字符串s2,s1是不会有任何修改的,即substring是无副作用的。回到值对像上,值对像有不变性,那么值对像的成员函数,应该设计成无副作用函数。这种强大的无副作用特性,大家可以借用String体会体会,不用任何特殊处理就是线程安全的。关于不变对象的好处,大家可以随便google一下就有很多。

值对像两个重要使用场景

正因为值对像的这些特征和好处,引申出两大重要的使用场景:

上下文集成:在上下文集成时,模型概念从上游上下文流入下游上下文时,尽量使用值对像来表示这些概念。这样的好处是可以达到最小化集成,即可以最小化下游模型中用于管理职责的属性数目。使用不变的值对像使得我们做更少的职责假设。怎么理解呢,如果传递是实体呢?实体只由唯一标识决定,有状态变化的,那么上下游是不是要同步?也代表着上下游上下文有一个无法解耦的唯一标识连着的。再回想架构中的REST或HTTP协议,请求的一次响应代表着资源在当时的状态的一种描述,下游(客户端)拿到后就是不变的,就是一种值对像。

用值对像表示标准类型:标准类型,比如货币类型的CAD、CNY、USD,比如时间单位的时、分、秒,这些比较好理解,肯定是适合用的不变的值对像来表示的,一般就是直接用枚举类型。除了枚举类型,一般也使用状态模式来实现标准类型,这也是值对像的范畴内。

测试实现与持久化

在测试和实现中,值对像一般只暴露完善的构造函数和无副作用的函数,所以注册值对像的不变性。

在持久化值对像一节中,现在比较常见的做法是两种:多个值对象序列化到单个列中存在,一般借助KV或文档型的Nosql存储;使用数据库实体保存多个值对象,即使用一个委派标识来保存值对象,并与引用它们的实体关联。

相关文章

  • 实现领域驱动设计-值对像

    值对像和实体是两种领域对象,也是最重要的领域模型,跟实体相比,值对像没有唯一标识,由对象的属性值一起来标定一个对象...

  • 读《领域驱动设计》有感

    写完《DDD领域驱动设计初探》后,教主推荐了两本领域驱动设计的书--《领域驱动设计》和《实现领域驱动设计》,...

  • 1.复杂系统中采用DDD-lite实现模糊需求--开篇

    一、序 2015年底初识DDD(领域驱动设计),阅读和学习《领域驱动设计》By Eric和《实现领域驱动设计》By...

  • 领域驱动设计DDD

    最近在换工作,利用间隙看了两本领域驱动设计的经典书籍:《领域驱动设计:软件核心复杂性应对之道》,《实现领域驱动设计...

  • 《领域驱动设计精粹》读书笔记

    《领域驱动设计精粹》的作者Vaughn Vernon同样也是《实现领域驱动设计》的作者。书中精炼的概括了《DDD》...

  • 本周读书复盘

    1.《实现领域驱动设计》 DDD领域驱动设计这几年在软件设计领域非常火,特别是进来软件的业务需求日益复杂,软件规模...

  • 领域驱动设计释厄录

    基础 学习DDD看的书《实现领域驱动设计》基础只是,概念《领域驱动设计:软件核心复杂性应对之道 》使用,流程,串联...

  • 实现领域驱动设计-领域服务

    领域服务定义 先看看领域服务的定义:领域中的服务表示一个无状态的操作,它用于实现特定于某个领域的任务。当某个操作不...

  • 实现领域驱动设计-领域事件

    定义 将领域中所发生的活动建模成一系列的离散事件。每个事件都用领域对象来表示。领域事件是领域模型的组成部分,表示领...

  • 当Subdomain遇见Bounded Context

    《实现领域驱动设计》的作者Vernon根据过去几年DDD的实战经验又写了一本《领域驱动设计精粹》,日前已经在中国翻...

网友评论

      本文标题:实现领域驱动设计-值对像

      本文链接:https://www.haomeiwen.com/subject/wenwkqtx.html