domain-driven-design - DDD : Entity as a factory for value objects?

标签 domain-driven-design

在 DDD 中拥有一个创建值对象的实体有意义吗?

我有一个问题,有几个答案。问题是实体,答案是值对象。问题包含答案。用户创建问题和答案。

[A] 有人说要搭配:question.createAnswer()。这样,只有问题才能给出答案。这样我们就可以防止没有问题就得到答案。然而,创造答案的不是问题,而是用户。

我个人并不这么认为 - 对我来说,创建一个答案并将其分配给问题是有意义的。这不是业务逻辑,对吧?

[B} 我更喜欢例如这是自然流:

Question q = new Question();
Answer a = new Answer(q);   // answer can't exist without a question

[C]其他一些人也同意:

Question q = new Question();
Answer a = new Answer();
q.addAnswer(a);

这是B的“松散”版本,因为Answer可能在没有Question的情况下存在;从我的角度来看,这似乎不太好。

这方面有什么智慧吗?

最佳答案

如果您遵循领域驱动设计原则,“问题”将是一个实体,“答案”将是问题的值对象和属性。问题将有一个 setAnswer 方法(假设每个问题只有一个答案),您可以使用它来指定问题的答案。

在伪代码中,类是这样定义的:

public class Question {
     String question;
     Answer answer;

     public Question(String question) {
         this.question = question;
     }

     public setAnswer(String answer) {
         this.answer = new Answer(answer);
     }

}

public class Answer {
     String answer;

     public Answer(String answer) {
         this.answer = answer;
     }
}

这就是您将如何使用它们:

Question q = new Question("What is the capital of Australia?");
q.setAnswer("Canberra");

// use a repository for the Question Entity to persist the question instance
QuestionRepository.add(q);

如果您的要求要求跟踪哪个用户添加了答案,那么您将需要添加一个名为 UserId 的值对象,它是另一个名为 User 的实体的属性。 (假设每个用户的userid都是唯一的)

public class UserId {
    String userid;
    public UserId(String userid) {
        this.userid = userid;
    }
}

public class User {
    UserId userid;
    String firstName;
    String lastName;
    :
    :
}

以下是答案值对象的外观:

public class Answer {
     String answer;
     UserId authorUserId;

     public Answer(String answer, UserId userid) {
         this.answer = answer;
         this.authorUserId = userid;
     }
}

Question中的SetAnswer方法需要修改为:

     public setAnswer(String answer, UserId authorUserId) {
         this.answer = new Answer(answer, authorUserId);
     }

最后,使用它(假设 userid 是 UserId 类型的变量,填充当前登录用户的 userid):

Question q = new Question("What is the capital of Australia?");
q.setAnswer("Canberra", userid);

关于domain-driven-design - DDD : Entity as a factory for value objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26489649/

相关文章:

domain-driven-design - CQRS 对我的域是否正确?

constructor - DDD + 公共(public)无参数构造函数——它们应该存在吗?

domain-driven-design - 如何正确实现反腐败层

c# - EF Core DDD 多对多

events - 在 DDD 中,谁应该负责处理领域事件?

java - 层间通信装饰器

domain-driven-design - CQRS 命令和查询 - 它们是否属于域?

java - DDD 项目的 Maven 模块布局

oop - DDD - 应如何设计域规则,以便上层知道规则何时被破坏?

java - 我的 DDD 值对象中是否隐藏了 DDD 实体?