我本质上有一项调查,人们回答了很像测试的问题,并且有不同的路径,到目前为止,这很容易,但是我想让它更具动态性,以便我可以有一个通用规则,用于所有路径的测试,以使评估者当前允许和允许使用,并且每个或本质上都成为集合中的另一个规则,

QuestionID,然后我形成一堆像这样的 AND 规则

<rule id="1">
<true>
 <question ID=123>
 <question ID=124>
</true>
<false>
 <question ID=127>
 <question ID=128>
</false>
</rule>
<rule id="2"><true>
 <question ID=123>
 <question ID=125>
</true>
<false>
 <question ID=127>
</false>
</rule>

该规则 1 规定,如果问题 123 和 124 的回答为真,而问题 127、128 的回答为假,则通过。OR(规则 2)是,如果 123 和 125 为真且 127 为假,它们也会通过。如果有很多组合,这会变得很乏味,所以我想在逻辑中实现 OR,我只是不确定解决这个问题的最佳方法是什么。

我认为规则引擎太复杂了,必须有一种更简单的方法,也许像 LINQ 一样构造一个图,然后评估它们是否通过,

谢谢!

——不是计算机科学专业。

有帮助吗?

解决方案

这不必很复杂:你已经完成了大部分工作,因为你的 and 元素有效地实现了 AND 类型的规则。我会介绍一个可以容纳 和 元素的元素。

在你的能力范围内,你可以:

  • 一个 RuleBase 类,具有“公共抽象 bool Evaluate()”方法
  • TrueRule、FalseRule 和 OrRule 类,其中包含 RuleBase 对象的列表
  • QuestionRule 类,引用特定问题

您可以按如下方式对其中每一个实现 Evaluate 方法:

  • 真实规则: 仅当所有包含的规则从 Evaluate 返回 true 时才返回 true
  • 错误规则: 仅当所有包含的规则从 Evaluate 返回 false 时才返回 true
  • 或规则: 如果至少其中一个包含的规则从 Evaluate 返回 true,则返回 true
  • 提问规则: 返回原始问题的答案

这个类层次结构实现了一个简单的抽象语法树(AST)。LINQ 以 System.Expressions.Expression 类的形式执行几乎相同的操作,但如果所有内容如何组合在一起并不明显,那么编写您自己的会很有帮助。

其他提示

如果您使用支持推理的适当规则引擎,那么它将更有效且可扩展。

查看 http://www.flexrule.com ,这是一个灵活,可扩展的规则引擎,支持三种类型的规则。程序,推理和规则流规则可以从您的应用程序外部化,并使用此框架执行。

我不确定我是否完全理解您要解决的问题,但您可以使用简单的XPath来获取ID:

这会给你所有<!> quot; true <!> quot;规则ID = 1的ID: /规则[@id = QUOT <!>; <!> 1 QUOT;] /真// @ ID

与上面相同,它只给你错误的ID: /规则[@id = QUOT <!>; <!> 1 QUOT;] /假// @ ID

最后是指向.NET中XPath简介的链接 http://www.developer.com/xml/article.php/3383961

祝你好运

我建议将答案放在问题上,而不是使用 truefalse 对问题进行分组。我认为它使 XML 更易于阅读,但这一点值得商榷。无可争议的是,它使得评估一个 question 元素独立,即不了解您尝试评估它的上下文。这使得代码更简单。

我还会从 XML Schema 中获取一个页面,并将您的 OR 逻辑实现为 choice 元素。A choice 如果元素的任何子元素为 true,则该元素为 true。当然,您可以嵌套它们:

<rule id="1">
   <question id="123" answer="true" />
   <question id="124" answer="false" />
   <choice id="1">
      <question id="125" answer='true' />
      <choice id="2">
         <question id="126" answer='false' />
         <question id="127" answer='false' />
      </choice>
   </choice>
</rule>

这给您留下了四种非常简单的方法来实现,每一种方法都由其前面的方法使用:

  • bool GetProvidedAnswer(int questionID)
  • bool IsQuestionCorrect(XmlElement question)
  • bool IsChoiceCorrect(XmlElement choice)
  • bool IsRuleSatisfied(XmlElement rule)

XML 的结构使得这些方法的实现非常简单:

 bool IsRuleSatisfied(XmlElement rule)
 {
    bool satisfied = true;
    foreach (XmlElement child in rule.SelectNodes("*"))
    {
       if (child.Name == "question")
       {
          satisfied = satisfied && IsQuestionCorrect(child);
       }
       if (child.Name == "choice")
       {
          satisfed = satisfied && IsChoiceCorrect(child);
       }
       if (!satisfied)
       {
          return false;
       }
   }
   return true;
}

可能值得添加一个 List<XmlElement> 的参数 IsFooCorrect 方法。(如果规则引擎位于类中,则可以将其设为类字段。)“当答案错误时,所有方法都将当前元素添加到列表中。”然后,您可以检查该列表的内容,以准确了解规则失败的原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top