在 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/