贫困域模型是否意味着您不能将实用程序/支持类用作域模型的"帮助程序"?

sho*_*oes 5 design-patterns domain-driven-design

根据这个定义,福勒的贫血领域模型概念是:

一种软件域模型,其中业务逻辑在域对象之外实现

使用此模式,逻辑通常在单独的类中实现,这些类转换域对象的状态.Fowler调用这样的外部类事务脚本.

如果我们以购物车为例,Cart对象将是域对象.但是要处理购物车到最终订单和收据涉及检查订单库存和处理信用卡付款.很多这些东西都需要实用程序类,因为在Cart对象中做所有操作都意味着Cart类会很庞大而且很麻烦.那么,这是否意味着本例中的Cart将是一个贫血域模型,根据上面的定义,这些实用程序类将是"事务脚本"?

Chr*_*inn 4

领域驱动设计的一个关键概念是创建丰富的设计,传达和反映其领域专家(业务用户)的行话。然后,您希望您的代码成为该领域模型的表达。(请参阅DDD 模式摘要中的“通用语言”和“模型驱动设计” )。

当您执行此操作时,您将为实体(类)创建反映业务用户如何描述它们的名称。此外,您还将在那些也反映域的类上创建方法。

考虑到这一点,考虑一下您如何看待“助手”或“实用”类可能会有所帮助。使用您的一些描述,您可能拥有类和方法,例如:

product = GetProduct(data.productId);
shoppingCart.add(product);
receipt = customer.Purchase(shoppingCart);
Run Code Online (Sandbox Code Playgroud)

您的 Customer.Purchase 方法可能会执行以下操作:

creditCard = this.getCreditCart(creditCardNumber);
purchaseNumber = creditCard.Charge(shoppingCart.Total);
Run Code Online (Sandbox Code Playgroud)

我意识到这些例子并不完整,甚至不完全准确,但我希望这个想法有所帮助。

回答你原来的问题——是的,拥有实用程序和支持类是可以的。但是,您希望创建这些支持类并将它们映射到真实的域实体。在与用户进行一些合作之后,您可能能够创建比事务脚本实体更有意义的域实体。

希望这可以帮助。祝你好运!