根据this definition,福勒的贫血领域模型概念是:
一个软件域模型 业务逻辑在外部实现 域对象
和
通过这种模式,通常就是逻辑 在单独的类中实现 转换域的状态 对象。福勒称之为外部 类事务脚本。
如果我们以购物车为例,Cart对象将是域对象。但是要处理购物车到最终订单和收据涉及检查订单库存和处理信用卡付款。很多这些东西都需要实用程序类,因为在Cart对象中做所有操作都意味着Cart类会很庞大而且很麻烦。那么,这是否意味着本例中的Cart将是一个贫血域模型,根据上面的定义,这些实用程序类将是“事务脚本”?
答案 0 :(得分:4)
域驱动设计的一个关键概念是创建一个丰富的设计,传达和反映其领域专家(业务用户)的行话。然后,您希望代码成为该域模型的表达式。 (参见DDD Patterns summaries中的“无所不在的语言”和“模型驱动的设计”)。
执行此操作时,您将为实体(类)创建反映业务用户如何描述它们的名称。此外,您将在那些也反映域的类上创建方法。
考虑到这一点,考虑您对“帮助者”或“实用程序”类的看法可能会有所帮助。使用您的一些描述,您可能会有类和方法,例如:
product = GetProduct(data.productId);
shoppingCart.add(product);
receipt = customer.Purchase(shoppingCart);
您的Customer.Purchase方法可能会执行以下操作:
creditCard = this.getCreditCart(creditCardNumber);
purchaseNumber = creditCard.Charge(shoppingCart.Total);
我意识到这些例子并不完整甚至完全准确,但我希望这个想法很有帮助。
回答您的原始问题 - 是的,可以使用实用程序支持类。但是,您希望创建这些支持类并将它们映射到真实域实体。在与您的用户合作之后,您可能能够创建有意义的域名,而不仅仅是事务脚本实体。
希望这会有所帮助。祝你好运!
答案 1 :(得分:1)
正如克里斯所说,如果这些支持类映射到从用户语言发现的真实域实体,那么可以使用实用程序支持类。有时很多“辅助类”是贫血模型的症状,如果与主要具有制定者和类型的类有关。 getters(在这些场景中,帮助程序从未正确分配给域对象的行为中成长起来。)