DDD—实体和值对象

在进行使用DDD(领域驱动设计)建模的过程中,值对象和实体一直是比较棘手的两个概念,不知道应该怎么划分。今天就从几个角度说一下这个问题。

实体(Entity)是具有唯一标识符(Identity)的对象,通过标识符来区分不同的实体。实体的标识符可以是持久化存储中的数据库主键,也可以是自定义的唯一标识符。实体的重要特征是其标识在对象的生命周期中是唯一且不可变的。实体的状态可以随时间变化,但标识符保持不变。实体之间可以通过比较它们的标识符来进行相等性判断。实体通常具有行为,可以执行某些操作。

例如,电子商务系统中的订单。每个订单都有一个唯一的订单号作为标识符,它区分不同的订单。订单可以随时间变化,比如添加或删除商品、修改收货地址等。但是,无论订单如何变化,它的唯一标识符不会改变。

值对象(Value Object)是没有唯一标识符的对象,它的相等性是基于其属性的值。值对象通常是不可变的,也就是说一旦创建后,它的属性值不可修改。值对象的主要目的是表示一个概念完整的值,而不关注其标识。值对象之间通过比较它们的属性值来判断相等性。

例如,电子商务系统中的商品。商品可以有多个属性,如名称、价格、库存等。在这个系统中,商品被视为值对象,因为它们的相等性是基于其属性的值。如果两个商品具有相同的名称、价格和库存,那么它们被认为是相等的。

区分实体和值对象的关键是理解对象的标识和相等性。实体侧重于对象的唯一标识和标识的不变性,而值对象侧重于对象属性的值和属性的不变性。根据对象在领域中的角色和重要性,我们可以决定将其建模为实体或值对象。

举一个常见的用例:

"Account"(账户)。一个账户可以包含特定金额的货币,并具有相应的行为,比如允许取款、存款等操作。账户实体可能还有其他属性和方法,如账户持有人、账户创建日期等。"Money"值对象可以包含货币的金额和货币类型,它们共同决定了值对象的状态。"Money"值对象通常是不可变的,这意味着一旦创建,它们的状态就不能被修改。通过提供方法来执行货币计算,可以确保在对"Money"值对象进行操作时,创建新的值对象而不是修改现有的值对象。

实体示例:

   "Account"实体包含了一个"Money"对象作为余额,并提供了存款和取款方法来改变余额。  

public class Account {
    private UUID id;
    private Money balance;
    private String accountHolder;

    public Account(UUID id, Money balance, String accountHolder) {
        this.id = id;
        this.balance = balance;
        this.accountHolder = accountHolder;
    }

    public void deposit(Money amount) {
        // 实现存款逻辑
        balance = balance.add(amount);
    }

    public void withdraw(Money amount) {
        // 实现取款逻辑
        balance = balance.subtract(amount);
    }

    // 其他属性和方法...
}

值对象示例: 

"Money"值对象表示了一个特定金额和货币类型的货币,它提供了加法和减法的计算方法,返回一个新的"Money"对象作为结果。

public class Money {
    private BigDecimal amount;
    private Currency currency;

    public Money(BigDecimal amount, Currency currency) {
        this.amount = amount;
        this.currency = currency;
    }

    public Money add(Money other) {
        // 实现加法逻辑
        // 注意要检查货币类型是否一致
        // 返回一个新的Money对象
    }

    public Money subtract(Money other) {
        // 实现减法逻辑
        // 注意要检查货币类型是否一致
        // 返回一个新的Money对象
    }

    // 其他计算方法和属性...
}

你可能感兴趣的:(DDD领域驱动模型,系统设计,设计规范,系统架构)