【问题标题】:DDD - Anemic vs. Rich Domain ModelsDDD - 贫血与富领域模型
【发布时间】:2020-01-29 06:13:44
【问题描述】:
我读过 Eric Evan 的 DDD 书,他(连同 Fowler 和其他人)似乎认为贫血域模型是一种反模式。
所以我真的很想深入了解这个问题。
此外,我真的在寻找富域模型的一些好的(基本)示例,以及它提供的贫血域模型的好处。
【问题讨论】:
标签:
architecture
domain-driven-design
【解决方案1】:
假设您编写了一些代码来解决复杂的业务问题。如果你有一个贫血的领域模型,那么
您的对象几乎没有任何行为,使它们只不过是一袋 getter 和 setter。 [..] 取而代之的是一组服务对象,它们捕获所有领域逻辑、执行所有计算并使用结果更新模型对象。
Wiki 上有一个非常简单的示例:
贫血
class Box
{
public int Height { get; set; }
public int Width { get; set; }
}
无贫血
class Box
{
public int Height { get; private set; }
public int Width { get; private set; }
public Box(int height, int width)
{
if (height <= 0) {
throw new ArgumentOutOfRangeException(nameof(height));
}
if (width <= 0) {
throw new ArgumentOutOfRangeException(nameof(width));
}
Height = height;
Width = width;
}
public int Area()
{
return Height * Width;
}
}
您还可以查看IDDD_Samples repo on GitHub 以及 Vaughn Vernon 的“实现领域驱动设计”一书中的限界上下文示例。那里有很多很好的例子。
隐藏对象的内部可以防止用户将组件的内部数据设置为无效或不一致的状态,从而保护其完整性。如果您的业务问题很复杂,并且您有一个贫乏的模型,您的代码将很快变得无法维护。添加新功能会让您头疼,并且会持续更长的时间。代码将难以辨认且不可测试。
Martin's Fowler site 上还有更多关于贫血域模型的信息。