Architecture Outlook中使用的规则系统在理论上是如何工作的?怎么可能呢?
我对此很好奇: 在微软的Outlook Express(或者Outlook,我记不清了,我是Mac用户)中,他们有一些非常酷的东西。一般规则: 例如,您可以配置一组规则来自动排序或删除电子邮件。这是难以置信的强大和易于使用 这些规则看起来很像这样:Architecture Outlook中使用的规则系统在理论上是如何工作的?怎么可能呢?,architecture,rules,rule-engine,Architecture,Rules,Rule Engine,我对此很好奇: 在微软的Outlook Express(或者Outlook,我记不清了,我是Mac用户)中,他们有一些非常酷的东西。一般规则: 例如,您可以配置一组规则来自动排序或删除电子邮件。这是难以置信的强大和易于使用 这些规则看起来很像这样: rule: [password_1] is_not_equal_with [password_2] consequence: show_error '2921' rule: [firstName] has_less_characters_than
rule: [password_1] is_not_equal_with [password_2]
consequence: show_error '2921'
rule: [firstName] has_less_characters_than '2'
consequence: show_error '1211'
rule: [age] is_numeric, is_smaller_than '13', is_greater_than '130'
consequence: show_error '1522'
rule: [gender] is_equal_with 'female'
consequence: show_group [female_questions]
rule: [termsAndConditionsAccepted] is_not_checked
consequence: show_error '482'
rule: [age] is_less_than 21
consequence: hide_group [income_questions]
如果收件箱中的电子邮件主题包含“foo”、“bar”或“foobar”,请将其删除
我需要为一个强大的表单验证系统编写类似的代码。
开发人员应该能够创建如下规则:
rule: [password_1] is_not_equal_with [password_2]
consequence: show_error '2921'
rule: [firstName] has_less_characters_than '2'
consequence: show_error '1211'
rule: [age] is_numeric, is_smaller_than '13', is_greater_than '130'
consequence: show_error '1522'
rule: [gender] is_equal_with 'female'
consequence: show_group [female_questions]
rule: [termsAndConditionsAccepted] is_not_checked
consequence: show_error '482'
rule: [age] is_less_than 21
consequence: hide_group [income_questions]
好吧,我有一些想法如何可以做到这一点,我会张贴在这里作为答案。但是在我重新发明轮子之前,有什么书面的概念可以作为基础来开发一个类似于规则的验证系统吗?或者如果没有,你有什么建议如何做到这一点
在上面的示例中,方括号中的所有内容都是html表单元素的名称。撇号“”中的所有内容都是要进行比较的“硬编码”值
定义的规则被转换为PHP代码和JavaScript代码,以执行客户端和服务器端验证
此功能必须能够:
- 条件规则:A依赖于B
- 值比较:用于整数、浮点、字符串
- 同时启用一些表单控制逻辑,如上面的“[gender]与'female'相等”示例中所示
(顺便说一句,我是Objective-C的家伙)在面向对象的设计中,一种方法是实现命令模式,或者,对于更复杂的需求,实现解释器模式。通常,您会为不同类别的规则创建多个类,并且您可以为更复杂的场景组合它们(例如,通过构建CompositeRule);它们都支持像Execute()或Execute(context)这样的接口
您建立一个规则实例队列,并为每个操作的对象在每个规则实例上调用Execute(context)。上下文将包含您正在处理的对象(消息、表单或其他)的实例。您可能需要查看一些开源规则引擎;甚至是付费的 示例包括
付费:
, 开源:
, 还有很多。包括一些内置到java(java规则引擎API(JSR94))和.NET(Windows工作流基础规则引擎)。 不过,我对纯PHP不太确定 作为补充说明,我使用了一些引擎,比如(在Oracle购买之前)来驱动web UI。请注意,执行速度是绝对关键的。我们让Haley处理每页加载约2000条规则(抵押贷款应用程序),执行时间不到40毫秒(不是打字错误)。我们使用它来确定页面上有哪些字段,以及确定输入的数据是否一致、是否符合法律标准,甚至是否正确输入 由于实例化引擎所需的时间,其他一些引擎甚至在更小的规则集上也慢得多 我也开始为更小的系统编写自己的程序。在我的例子中,我使用javascript,在执行与表单一起保存的脚本之前,使用发布页面中的数据简单地设置变量
这也是在较小规模上进行的,但我将其限制为仅给出简单的通过/不通过响应 将规则链接成一个。对于少量规则和消息,您可以应用蛮力算法:获取每个规则和消息,并比较它们是否合适。您将得到一个O(rm)复杂度,其中r是规则的数量,m是消息的数量,而不考虑规则可以有多个条件 对于大量规则或消息,您可以实现Rete网络()。这需要一些内存,但在实践中要快得多。根据您设计规则的方式,您将获得不同的复杂性 第一种方法很简单,我不认为我需要解释它。不过,如果你需要帮助,请告诉我,我会详细说明你的想法。让我解释一下第二种方法: 在继续之前,请阅读一些关于Rete算法的知识 在Rete网络的alpha部分,您将存储规则中显示的不同条件。有些规则可能有一些共同的条件。比如: 规则1:如果(message.date等于2009年10月24日)和(message.title包含“hello”),则执行某些操作1 规则2:如果(message.hasAttachement为TRUE)和(message.date等于2009年10月24日),则执行某些操作2 因此,网络的Alpha部分将有3个元素
- C1:(message.date等于24.10.2009)
- C2:(message.title包含“hello”)
- C3:(message.hasAttachement为TRUE)
- 大型学习系统的产品匹配。(1995年)
- 关于生产系统的有效实施/--Charles L.Forgy(197