ddd实体与值对象

博客介绍了实体和值对象的概念。实体具有唯一身份标识,可在长时间内持续变化,如电商商品通过唯一商品id标示;值对象用于度量和描述事物,无唯一标示,如商品类别通过具体值表示,二者区别在于唯一标识和可变性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​ Entity(实体): 每个实体是唯一的,并且可以相当长的一段时间内持续地变化。我们可以对实体做多次修改,故一个实体对象可能和它先前的状态大不相同。但是,由于它们拥有相同的身份标识,他们依然是同一个实体。例如一件商品在电商商品上下文中是一个实体,通过商品中台唯一的商品id来标示这个实体。

​ ValueObject(值对象):值对象用于度量和描述事物,当你只关心某个对象的属性时,该对象便可作为一个值对象。实体与值对象的区别在于唯一的身份标识和可变性。当一个对象用于描述一个事物,但是又没有唯一标示,那么它就是一个值对象。例如商品中的商品类别,类别就没有一个唯一标示,通过图书、服装、3C这些值就能明确表示这个商品类别。


 

### DDD 值对象的概念、定义、使用场景及示例 #### 1. 值对象的定义 值对象(Value Object)是领域驱动设计(DDD)中的一种核心概念,用于表示那些没有唯一标识的对象。实体不同,值对象的关注点在于其属性值,而不是身份。如果两个值对象的属性值相同,则它们被认为是相等的[^2]。值对象通常是不可变的,一旦创建就不能更改其状态。 #### 2. 值对象的特性 - **不可变性**:一旦创建,值对象的属性不能被修改。这种特性有助于确保数据的一致性线程安全性。 - **相等性基于值**:两个值对象是否相等取决于它们的属性值是否完全一致,而不是基于内存地址或唯一标识。 - **无唯一标识**:值对象不需要像实体那样具有唯一的标识符。 ```python class Money: def __init__(self, amount: float, currency: str): if amount < 0: raise ValueError("Amount cannot be negative.") self.amount = amount self.currency = currency def __eq__(self, other): if isinstance(other, Money): return self.amount == other.amount and self.currency == other.currency return False def __hash__(self): return hash((self.amount, self.currency)) ``` #### 3. 使用场景 值对象通常用于表示那些在业务逻辑中频繁出现且具有固定意义的数据结构。以下是一些常见的使用场景: - **货币金额**:例如,`Money` 类可以用来表示金额货币类型[^3]。 - **地理位置**:如 `Address` 或 `Coordinate`,这些对象通常由多个属性组成,但不具有唯一标识。 - **时间段**:如 `DateRange` 或 `TimePeriod`,表示一段时间范围。 - **产品规格**:如 `ProductSpecification`,描述产品的尺寸、颜色等属性。 #### 4. 示例代码 以下是一个关于地址的值对象示例: ```python class Address: def __init__(self, street: str, city: str, postal_code: str): self.street = street self.city = city self.postal_code = postal_code def __eq__(self, other): if isinstance(other, Address): return (self.street == other.street and self.city == other.city and self.postal_code == other.postal_code) return False def __hash__(self): return hash((self.street, self.city, self.postal_code)) # 使用示例 address1 = Address("123 Main St", "Springfield", "12345") address2 = Address("123 Main St", "Springfield", "12345") print(address1 == address2) # 输出 True,因为两个地址的值相同 ``` #### 5. 值对象实体区别 - **身份 vs. 值**:实体通过唯一标识符区分不同的实例,而值对象通过其属性值来判断相等性。 - **可变性**:实体通常是可变的,其状态可以在生命周期内发生变化;值对象则是不可变的,一旦创建就不能修改。 #### 6. 值对象的不可变性优势 不可变性使得值对象在并发环境中更加安全,同时也简化了缓存共享逻辑。由于值对象的值不会改变,因此可以安全地在多个上下文中复用[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值