问题描述
我不知道应该在哪里检查我的不变量...
- 问题的文本不能为空
- 问题的文本长度必须在 100 到 500 个字符之间
我已经读过检查不变量的最佳位置是在聚合的构造函数中,但我也读过它会被推荐在值对象中推送域逻辑,例如。
一个可能的聚合实现可能是:
public class Question {
private final id: QuestionId;
private final text: QuestionText
public Question(id: String,text: String) {
// verify invariants
ensureLengthText(text); // this method verifies the invariant
this.id = new QuestionId(id);
this.text = new QuestionText(text);
}
}
QuestionId
和 QuestionText
是值对象。
在这种情况下,在聚合中我们可以明确地看到不变量。
但是,如果我们在 QuestionText
值对象中推送该不变逻辑,总的来说我们将看不到该不变......那么,最好的方法是什么?
解决方法
如果您可以轻松地在值对象中强制执行不变量(例如“问题文本不能短于 100 个字符或长于 500 个字符”),我建议您这样做。 Question
通过声明 QuestionText
是 text
继承了该不变量(以及来自 QuestionText
的任何和所有其他变量)。