钻石问题仅由不正确的类型/本体建模引起。它不存在于正确建模的系统中。
问题的出现通常是因为开发人员根据实体的角色而不是类型为实体定义类。他们将它可以做的事情提升到实际水平之上。实体对象带有角色而不是类型。
例如,一个人是一个人,从出生到死亡,无论他是否结婚(Husband
)、探望妈妈(Son
)或找到一份好工作(Employee
)。的角色Person
可以使用接口或组件或 mixins 来实现——参数中的燃料更倾向于组合而不是继承。
允许通过某种状态机转换来替换实体的类型是合理的。因此,作为状态转换的结果,aPerson
可以替换为Werewolf
(满月)或(颈部咬合)。无论转换如何,Vampire
实体(一些固定的)都会保持不变。GUID
但即使这样也可以用不同的方式建模——一个Person
withLycanthropy
和/或Vampirism
. 当然,建模以适应许多方面可能是一个挑战,但这与类可能参与单个继承链的典型限制无关。
An UnverifiedEmailAddress
could transition to a VerifiedEmailAddress
, but this is not a great example because it probably ought use a value object rather than a reference object. A better example could involve a WorkingPurchaseOrder
transitioning to a SubmittedPurchaseOrder
via a submit
function. The function would likely return an immutable replacement (such as a Persistent Object) and be swapped into some observable state container.