使用值对象作为实体中的标识符

发布于 2024-10-14 23:24:50 字数 511 浏览 7 评论 0原文

在查看示例 DDD 项目上的 Evans 项目时,我注意到在 Cargo 实体中,Evans 使用了 tracknumber,它是一个值对象。为什么他不选择普通的string tracknumber而是选择值对象作为身份?这是埃文斯的片段:

public class Cargo implements Entity<Cargo> {

  private TrackingId trackingId
}

public final class TrackingId implements ValueObject<TrackingId> {

  private String id;

  /**
   * Constructor.
   *
   * @param id Id string.
   */
  public TrackingId(final String id) {
    Validate.notNull(id);
    this.id = id;
  }

While viewing Evans' project on sample DDD project, I notice that in the Cargo entity, Evans uses tracknumber which is an value object. Why he didn't chooses plain string tracknumber instead chooses value object for identity? Here is snippet from Evans:

public class Cargo implements Entity<Cargo> {

  private TrackingId trackingId
}

public final class TrackingId implements ValueObject<TrackingId> {

  private String id;

  /**
   * Constructor.
   *
   * @param id Id string.
   */
  public TrackingId(final String id) {
    Validate.notNull(id);
    this.id = id;
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

Bonjour°[大白 2024-10-21 23:24:50

可以实现以下几点:

  • 封装跟踪 ID 不应为空的逻辑
  • 封装跟踪 ID 一旦设置就不应更改的逻辑。

对于普通字符串,Cargo 对象必须了解这些规则。使用值对象方法意味着 TrackingId 维护有关其自身的这些规则。

A couple of things that would achieve:

  • Encapsulates the logic that the Tracking ID should not be null
  • Encapsulates the logic that the Tracking ID should not change once set.

With a plain string, the Cargo object would have to be aware of these rules. Using the Value Object approach means the TrackingId maintains these rules about itself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文