当前位置:首页 > 热点 > 识别实体与值对象的特征

识别实体与值对象的特征

2026-11-14 [客户案例] 来源:人文荟萃网

甄别实体与值对象非常重要,正确与否会直接影响聚合的设计。

聚合是边界

在DDD中,聚合是实体与值对象的边界。一个聚合对外代表了一个完整的领域概念,遵循面向对象设计的基本原则,聚合内部往往由多个细小的高内聚领域概念组成。聚合内部的领域模型形成了一棵树,树的根必须是实体,可以称之为是聚合根(Aggregate Root),当然,也可以称之为根实体(Root Entity识别),它是聚合的唯一入口或出口。例如订单聚合定义了Order根实体,它就是订单聚合的唯一代言人。

在一个限界上下文的所有领域模型(实体和值对象)中,按照关系的强弱与概念的完整性,将其划分为多个聚合,就好像草原部落由一个个蒙古包构成了松散的聚居社群一般。

考虑到值对象与实体的差异,倘若需要管理它们的生命周期,则值对象不可能脱离聚合的边界单独存在。这就意味着,当我们要识别领实体域模型的聚合时,实体与值对象之间的强弱关系并不会影响到对聚合边界的界定。只要实体与值对象之间存在关系,无论关系强弱,该值对象都必须与存在关系的实体放在同一个聚合。如果一个值对象与多个实体之间存在关系,要么说明多个实体都属于一个聚合;要么意味着该值对象需要复制为多份,放到不同的聚合中,如下图所示:

如此一来,对于聚合边界的识别,就变成了对实体关系强弱的判断。只要我与值们正确地甄别了实体与值对象,在识别聚合时,就可以不再考虑值对象,如此就能降低识别的难度。

上下文的影响

虽然我们知道实体与值对象之间的本质差异在于是否具备唯一的身份标识(identity),然而许多时候,这一差异仍然显得似是而非。更何况,实体与值对象的定义并非绝对,在不同的上下文,同一个领域概念也可能定义为不同的设计类型。例如下图所示的钞票一枚:

在购买上下文,买对象卖双方只关注钞票的面值与货币类型,只要值相等,即可认为是同一个对象,因而需定义为值对象;在印钞上下文,每张钞票都具有一个唯一的标识,即使同为100元的人民币,只要ID不同,也会认为是不同的对象,故而定义为实体。因此,要正确地甄别实体与值对象,需要结合具体的上下文。

识别的特征

即便如此,仍然缺乏相对客观的判断标准。为此,我总结了如下几个特征。

相等性

甄别实体与值对象,的特可以首先从相等性进行判断。只要一个领域模型对象的属性值相等,就认为是同一个对象,应优先考虑建模为值对象;否则,需要为领域模型对象定义唯一标识,并建模为实体。

注意:在进行相等性判断时,不能将作为唯一标识的ID视为领域模型的属性。

例如地址领域概念,只要其属性值国家、省份、城市、街道与邮政编码相等,就可以认为是同一个地址,应将Address类定义为值对象。对于大家识别耳熟能详的订单领域概念,显然需要为其分配一个唯一的订单编号,因为理论上可能存在除订单编号外其他属性都相同的两个不同订单,应将Order定义为实体。

然而,在对相等性进行判断时,可能出现ID与属性存在一种隐含的对应关系。例如,出版行业中作为正规出版物的图书,具有唯一的ISBN号,它相当于是图书领域概念的ID,所以Book应定义为实体。可在对Book相等性进行判断时,也实体可以不通过ISBN进行相等性判断,基本上,只要书名、作者(译者)、出版社、价格、出版日期、版次、页数、字数等属性值相同,也可以认为是同一本书,那是否意味着可以将Book定义为值对象呢?

显然,在进行相等性判断时,考虑的属性越多,就会出现多个组合的属性形成一种“隐藏”的唯一标识特征,有一些体现业务规则的ID,自身就是根据属性值来定义的。例如,航班的唯一标识就可以与值根据承运公司二字码、航班号、起降机场三字码与执飞日期来决定。通过唯一标识固然可以决定是否同一个航班,根据映射的多个属性值,也可以判断相等性。这会让人在甄别实体与值对象时,显得摇摆不定。例如,腾讯会议的会议号是Meeting的身份标识,在比较会议的相等性时,倘若我们考虑了除会议号之外的其他属性,如会议名称、会议类型、开始时间、结束时间、创建人、创建时间等属性,不一样可对象以确定会议的相等性吗?

因此,除了判断相等性,还需考虑不变性。

不变性

Eric Evans建议将值对象定义为不变的类,实则是因为根据值判等的值对象就应该具有不变性。仍以购买上下文的钞票为例,50元+50元=100元,这100元与原来的50元是另一张不同的钞票:

反之,一个对象除了ID,其余属性值都可以修改,不需要创建一个新的对象,就可以认为该领域对象是可变的,应考虑定义为实的特体。如前所述的Meeting对象,只要meetingId值不变,如会议名称、会议类型、开始时间、结束时间这样的属性值即使发生了天翻地覆的变化,我们也认为它是同一个会议。显然,应将Meeting定义为实体。

再考虑一个典型的订单聚合:

为什么我们要将订单聚合中的OrderItem定义为实体?如果不考虑ID属性,只要orderId、product与quantity值相识别同,完全可以认为是同一个订单项。然则,订单项的quantity值是可以更改的,更改了数量的订单项也不会认为是不同的订单项。订单项的可变性决定了它应该定义为实体。

为何要将OrderItem的Product属性定义为值对象呢?要知道,该Product类型还定义了productId属性,既然具有身份标识,不应该定义为实体吗?因为在订单上下文中,商品的productId来自于实体商品上下文的商品ID,在订单聚合中,可以将productId视为Product类的属性值。只要productId、name和price值相同,就可以认为是同一个商品,且它们的值是不变的。这正是将Product定义为值对象的原因所在。

独立性

即使考虑了相等性和不变性,仍有一种例外情形,那就是考虑独立性特征。值对象作为实体的属性必定附属于实体,不能单独存在;如果一个领域对与值象既满足了相等性,又满足了不变性,可定义为值对象;可是,如果它单独存在,且需要管理其生命周期,就需要将这样的类“升级”为实体。

考虑考勤上下文的假期领域概念。由于中国农历假期的缘故,每年都需要配置新的假期。假期概念对应的Holiday类定义为:

显然,该类的所有属性值相等,即可认为是同一个假期,一旦修改了假期的值,也可以认为是不同的假期,即Holiday类同时满对象足相等性和不变性,应定义为值对象。可是,在考勤上下文的领域模型中,Holiday类是完全独立的,不依附于其他任何实体,而它也需要管理生命周期。这时,就应遵循独立性特征,将其“升级”为实体。

优先级

以上三个特征并无重要性排列,需综合考虑。如果仍然无法判断,就遵循优先级原则:优先将领域概念建模为值对象。

 

(责任编辑:折扣清仓)

推荐文章
  • 标签: BOSS直聘 财报 AI招聘 净利润

    标签: BOSS直聘 财报 AI招聘 净利润 云梦级11月18日云梦级消息,18日,在线招聘平台BOSS直聘(看准科技)公布2025Q3财务报告: 收入为21.63亿元,同比增长13.2%。 净利润为7.75亿元,同比增长67.2%。经调整净利润...[详细]
  • 标签: 昆仑芯 百度 AI芯片 港交所上市

    标签: 昆仑芯 百度 AI芯片 港交所上市 云梦级1月2日云梦级消息,今日,百度集团发布公告,宣布其旗下AI芯片公司昆仑芯已于1月1日以保密形式向港交所提交上市申请表格(A1表格),以申请批准昆仑芯股份在港交所主板上市及买卖。 昆仑芯团队前身为...[详细]
  • Facebook推出新闻通讯平台Bulletin

    Facebook推出新闻通讯平台Bulletin 新浪科技讯 北京时间6月30日早间消息,周二Facebook推出新闻通讯产品Bulletin,它是一个独立平台,里面有免费、付费文章及播客,直接竞争对手是Substack。 Facebook CEO扎...[详细]
  • 虚假评论让亚马逊不堪其扰,Facebook成水军大本营 ?

    虚假评论让亚马逊不堪其扰,Facebook成水军大本营 ? 新浪科技讯 北京时间6月17日早间消息,据报道,网络水军发布的虚假商品购买好评让电商巨头亚马逊头疼,该公司最近已经开始求助社交媒体巨头,遏制虚假评论的猖獗。 渗透社交媒体 在6月16日发表的一篇官方博...[详细]
  • 标签: 小米汽车 SU7 雷军 小米摩德纳架构

    标签: 小米汽车 SU7 雷军 小米摩德纳架构 云梦级2月10日云梦级消息,小米创办人,董事长兼 CEO 雷军今晚举行小年夜直播,在直播中,雷军透露小米汽车 2026 年春节假期出行暖心服务已就位,即日起至 3 月 3 日(元宵节),小米汽车支持所...[详细]
  • 标签: 零跑汽车 第二品牌 30万元以上 独立销售网络

    标签: 零跑汽车 第二品牌 30万元以上 独立销售网络 云梦级4月27日云梦级消息,晚点从多个独立信源处独家获悉,零跑汽车计划于 2027 年推出第二品牌,产品定价 30 万元以上。根据目前规划,该品牌将采用有别于零跑现有渠道的独立销售网络。 晚点向零跑汽...[详细]
  • 标签: 小鹏汽车 刘先明 通用智能中心 智能驾驶

    标签: 小鹏汽车 刘先明 通用智能中心 智能驾驶 云梦级2月3日云梦级消息,据晚点Auto报道,近日小鹏汽车将两个智能化一级部门 —— 自动驾驶中心、智能座舱中心 —— 合并为通用智能中心。新部门由原自动驾驶负责人刘先明主导,直接向董事长、CEO 何...[详细]
  • 标签: 智元AGIBOT 灵犀X2 远征A2 精灵璇

    标签: 智元AGIBOT 灵犀X2 远征A2 精灵璇 云梦级2月9日云梦级消息,8日20时,由智元 AGIBOT 主办的全球首个大型机器人晚会《机器人奇妙夜》成功举行。晚会由两百余台机器人主导,融合舞蹈、小品、魔术、武术、歌曲、走秀等多元形态。 据官方介...[详细]
  • 机器学习中必知必会的 8 种降维技术,最后一款超硬核!

    机器学习中必知必会的 8 种降维技术,最后一款超硬核! 降维是将高维数据集转换为可比较的低维空间的过程,真实的数据集通常有很多冗余特征,降维技术可用于去除这些冗余特征或将n维数据集转换为2维或3维进行可视化。 在本文中,我们将讨论8种降维技术,它们可以用于...[详细]
  • 标签: Gemma4 谷歌 大模型 AI开源

    标签: Gemma4 谷歌 大模型 AI开源 云梦级4月3日云梦级消息,今日,谷歌正式推出 Gemma 4 大模型,据称是迄今为止谷歌最智能的开源模型。Gemma 4 专为高级推理与智能体工作流打造,实现了前所未有的“单位参数智能水平”。 本次谷...[详细]