设计规则系统的好的参考/提示?

问题描述:

我经常需要实现某种用户可编辑的规则系统 - 要求通常不同,以至于相同的系统不能直接适用,所以我经常遇到同样的问题 - 如何设计一个规则系统设计规则系统的好的参考/提示?

  1. 是维护
  2. 合理平衡的表现力与易用性
  3. 很容易扩展的(如果/当我得到(2)错误的)。

我认为规则系统/ DSL是非常有价值的,但我觉得我的设计能力不好。

你必须提供哪些参考资料/提示可能有助于简化操作?
由于我遇到的问题的性质,现有的语言通常不适用。 (例如,您将而不是要求一般计算机用户学习python以编写电子邮件过滤器。)同样,规则语言(如JESS)仅仅是部分解决方案,因为某些(更简单)的用户界面需求建立在规则语言的基础上,所以非程序员可以使用它。此接口总是涉及删除某些功能,或使这些功能更难以使用,并且该问题带来了与上述相同的问题。

编辑:澄清,问题是关于设计规则引擎,我不是在寻找一个预建的规则引擎。如果您建议使用规则引擎,请解释如何解决有关做出良好设计决策的问题。

一个Ruby实现要考虑的是Ruleby(http://ruleby.org/wiki/Ruleby

有一两件事,我发现的是,可以定义规则表达式树使实现这么多简单。正如你正确地提到的那样,项目对项目的要求是如此不同,以至于你每次都必须重新实现。表达式树加上类似于访问者模式的东西使得非常(非双关语)表达式框架易于扩展。您可以轻松地在表达式树顶部放置一个非常动态的GUI,以满足您的要求。

希望这听起来并不像我说的那样,一切看起来像是用锤子钉的,因为事实并非如此......根据我的经验,这已经不止一次地派上用场了:-)

+0

我不确定我是否理解表达式树的适用性。你认为他们是规则语言翻译的一个方面,还是你用它们来表示每个规则的选项?我有点困惑。 – rcreswick 2008-09-15 22:47:48

首先,通常不建议让最终用户定义规则。那是因为他们没有开发背景,并且可以简单地编写进入无限循环的“代码”或做其他奇怪的事情。因此,要么系统必须防止这种行为(因此使其更复杂),接受这种可能性,或者不允许最终用户这样做。

如果您正在使用.NET,那么通过扩展Boo编译器(即使用Rhino.DSL您可以拥有一个类的简单DSL)来创建自己的DSL是非常容易的。

我们有这个工具的一个内部演示通过它的供应商: http://www.rulearts.com/rulexpress.php

作为一家公司,我们有很多与规则引擎(例如的CleverPath永恒之塔),但主要是面向开发人员的工具的经验。这个工具(rulexpress)非常适合商务人士。这不是一个规则引擎。但它可以以xml格式输出所有数据(基本上可以使用任何你喜欢的格式),然后我们将这些数据视为真正的规则引擎的输入。 Windows Workflow Foundation(不是更大/更好的规则引擎之一,但仍然)。

该工具本身看起来很不错,有些东西在任何面向开发人员的工具中都从未见过。

还有一些围绕WF构建的规则管理工具,如果这是您选择的规则引擎,请查看InRule。


编辑原来的问题后澄清: 虽然我已经在这个很久以前涉足(写在JavaCC的一个小语言),我会认为这是一个糟糕的时间投资了。我上面的评论是基于同样的精神:采用一个简单的规则引擎,一个简单的(商业)用户界面,使业务用户能够轻松维护,并且只花时间将两者联系在一起。