域模型是否应该强制设置 ID?

Should a Domain Model forcibly have an ID set?

假设我有一个 Dog 领域模型:

class Dog {
  int id;
  string name;
  string phone;
}

我想请 存储库 在我们知道它的名称和 phone:

时创建一个新的 Dog
$dog = new Dog('Fido', '555-555 5555');
Dog $createdDog = $repository->insert($dog);

是否最好强制 Dog::id 不可为空(从而使 insert() 接受没有 id 属性 的简化模型)?

或者更灵活的方法,允许 id 为空,并让存储库在存储对象后设置对象的 id 值?

我使 id 可为空的问题是其他地方的代码总是必须确保 id 不为空,例如 updateDog($dog).

(这是包含更多数据的更复杂模型的简化示例。)

是"best"吗?这是一个意见问题,可能你所描述的更正确,有某种 "PendingDog" 。但我从未见过它在实践中完成。创建新对象类型的复杂性以及所涉及的额外逻辑将使这种成本高得令人望而却步。考虑坚持狗。你会有一个单独的 updateDog(dog) 还是 insertDog(pendingdog)?这将使调用代码更加复杂。

我会坚持使用可为空的 ID,并让您的 updateDog(dog) 只检查 ID 是否为空,如果是,则进行插入,如果不是,则进行更新。