【问题标题】:Implementing a rules system实施规则系统
【发布时间】:2011-09-20 11:01:11
【问题描述】:

我正在为 android 构建一个应用程序,它允许根据某些条件将对象合并在一起。目前,我希望使用 if 语句(是否嵌套)来执行此操作,我只是想知道是否有更好的方法来执行此操作,因此它更灵活且易于扩展。

例如,我有 6 个对象,其中 3 个是红色的,2 个是蓝色的,1 个是绿色的。

可以应用的规则是:

  • 3个红色可以合并
  • 2个蓝色可以合并
  • 1红1蓝1绿可以合并
  • 1个红色和1个蓝色可以合并
  • 1个红色和1个绿色可以合并
  • 1个绿色和1个蓝色可以合并

这是一个非常基本的例子。还会有更多。

【问题讨论】:

  • 你看过 Jess (jessrules.com/doc/70/rete.html) 了吗?
  • 不,不知道。感谢您的链接将看看
  • 请注意,Jess 仅供学术使用。用 Java 编写的类似的开源规则引擎是 Algernon-J
  • 感谢@DanielTrebbien。目前,非免费对我不利。不过为了更好地理解规则系统,我们将同时查看两者。

标签: java android rule-engine


【解决方案1】:

我可能会在以下地区做点什么:

创建一个规则类,它包含给定规则的逻辑(您的 if 语句)。规则应具有优先级,以便可以将其与其他规则进行匹配以确定应首先考虑的规则。它还需要一个方法,可以将不确定数量的对象传递给该方法,该方法检查这些对象是否满足规则。

创建一个 RuleEngine,其中包含所有规则的排序列表(按优先级,最高优先)。然后,您将要与规则匹配的对象传递给引擎,引擎将运行它们,如果满足规则则中断循环:

for( Rule rule : rules ) {
  if( rule.check( objects ) ) {
    //Do what needs to be done
    break;
  }
}

我不知道这对你是否有意义 - 我希望它有意义。

此外,如果我们谈论数千条规则,则此解决方案不是最佳的。在这种情况下,您需要在检查之前确定对象可能有机会满足哪些规则(例如,如果您有两个红色和一个绿色,则无需检查“每个规则”)。

【讨论】:

  • 感谢您的回答,确实有道理。有可能有数百条规则......也许有数千条(尽管目前我认为不太可能)。我将把这个问题留一段时间,看看我是否能得到更多答案。 +1
  • @KasperMoerch。真的很好很紧凑。但是,如果一项或多项规则发生变化怎么办?您将不得不重新编译、重新测试和重新部署整个应用程序。我认为,将每个规则包含的逻辑存储在 XML 甚至纯文本中会慢一些,但更易于管理。
  • @Kizz 这是非常正确的,在我发布的建议中实施它应该不难。
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2012-10-01
相关资源
最近更新 更多