域驱动设计 – Drools与DDD:Drools是否需要平面对象模型?

在我们的电子商务领域,我们有一个使用嵌套数组建模的实体层次结构.我们使用领域驱动设计的原理(如Eric Evans所解释的)这样做.我们电子商务领域的核心概念是:

>合同,有交换,每个都有服务和付款.反过来,服务有描述每项服务的功能.

这种分层模型使我们能够表达任何合同,无论多么复杂,包括那些拥有多个协议(即交易所)的合同,作为整体协议(或合同)的一部分.

Drools不支持这种分层对象模型吗?我应该将我的对象模型反转为没有数组的平面对象模型(如“Fires HAVE Rooms”和“Sprinklers HAVE Rooms”example in the Drools Expert documentation),如下所示?

>合同.
>交易所,每个交易都有一份合同.
>服务和付款,每个都有一个Exchange.
>功能,每个都有一个服务.

我是否正确以这种方式将分层对象模型反转为具有原子断言的平面对象模型,是否支持并且在Drools中效果最好? Drools似乎不支持LHS条件规则对事实和子集合中的事实.

如果是这样,为什么Drools不支持更多的分层对象模型?是因为Drools来自AI世界(不是面向对象的世界),其中一阶逻辑将所有事实表达为原子主谓词值语句,而不是实体对象具有身份,价值的面向对象世界对象没有标识,实体对象是由其他实体和值对象组成的?

解决方法

您可以针对任何Java对象模型定义规则.

该文档提供了基于玩具问题的示例,以避免分散注意力.不是因为Drools无法处理更复杂的模型.如果您在本手册中进一步阅读,您将看到使用诸如“包含”或累加器等语法处理列表的示例.

这取决于你如何建模.您可以将合同,交易所,服务,付款和功能作为单独的事实插入,这些事实相互引用.或者,您可以只插入一个复杂的合同事实,其中包含Exchange列表,其中包含服务列表等.

哪种方式更适合您,取决于您的规则是否与合同相匹配,只需要很少的链接,或者您是否希望规则对某些内容做出反应,例如更改功能或插入付款事实.

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...