设计规则系统的好参考/技巧?

6
我经常需要实现一些用户可编辑的规则系统 - 要求通常不同到不能直接应用相同的系统,因此我经常遇到同样的问题 - 如何设计一个规则系统:
  1. 易于维护
  2. 在表达能力与易用性之间平衡得当
  3. 易于扩展(如果/当我在(2)中犯错误时)。
我认为规则系统/DSL非常有价值,但我对自己正确设计它们的能力感到不舒服。
您有什么参考/提示可以提供,以帮助使这更容易?由于我遇到的问题的性质,现有的语言通常不适用。(例如,您不需要让普通计算机用户学习Python才能编写电子邮件过滤器。)同样,诸如JESS的规则语言只是部分解决方案,因为需要在规则语言之上构建一些(更简单的)用户界面,以便非程序员可以使用它。该界面不可避免地涉及删除某些功能,或使这些功能更难使用,这个过程会带来上述相同的问题。
编辑:为了澄清,问题是关于设计规则引擎的问题,我不是在寻找预先构建的规则引擎。如果您建议一个规则引擎,请解释一下它如何解决有关做出良好设计决策的问题。
5个回答

2
我们曾经由供应商进行过这个工具的内部演示: http://www.rulearts.com/rulexpress.php 作为一家公司,我们在规则引擎方面有很多经验(例如Cleverpath Aion),但大多数是开发人员导向的工具。这个工具(Rulexpress)非常面向业务人员。它不是一个规则引擎。但它可以输出所有数据到xml中(因此基本上是您喜欢的任何格式),然后我们将考虑将其作为实际规则引擎的输入,例如Windows Workflow Foundation(不是更好的规则引擎之一,但仍然可以)。
工具本身看起来相当不错,一些东西我以前从未在任何开发人员导向的工具中看到过。
还有一些围绕WF建立的规则管理工具,如果这是您选择的规则引擎,请查看InRule。
在原始问题得到澄清后进行编辑: 虽然我很久以前尝试过这个(使用javacc编写了一种小语言),但现在我认为这是一个糟糕的时间投资。我的上述评论也是同样的精神:选择一个简单的规则引擎,一个简单的(商业)UI,使其易于业务用户维护,并且只投入时间将两者联系起来。

1

0

首先,通常不建议让最终用户定义规则。这是因为他们没有开发背景,可能会编写进入无限循环或执行其他奇怪操作的“代码”。

因此,系统要么必须防止这种行为(从而使其更加复杂),接受这种可能性,或禁止最终用户这样做。

如果您正在使用.NET,则可以通过扩展Boo编译器(即使用Rhino.DSL,您可以拥有一个简单的DSL与一个类)轻松创建自己的DSL。


0

0

我发现的一件事是,能够将规则定义为表达式树使得实现变得更加简单。正如你所正确提到的,从项目到项目的要求差异非常大,几乎每次都需要重新实现。表达式树与类似访问者模式的东西结合起来,构成了一个非常(不是故意的双关语)具有表现力且易于扩展的框架。而且,你可以很容易地在表达式树之上放置一个非常动态的GUI,以满足你的需求。

希望这听起来不像我用我的锤子说所有东西都像钉子,因为情况并非如此...只是根据我的经验,这种方法已经多次派上用场 :-)


我不确定我理解表达式树的适用性。您是建议将它们作为规则语言解释器的一个方面,还是使用它们来表示每个规则的选项?我有点困惑。 - rcreswick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接