Frage

Ich habe im Wesentlichen eine Umfrage, die angezeigt wird, und die Leute beantworten Fragen viel wie ein Test, und es gibt verschiedene Wege, es ist ziemlich einfach so weit, aber ich wollte es dynamischer gestalten, so dass ich eine allgemeine Regel haben kann, die für den Test mit allen Pfaden sind, den Evaluator zu erleichtern mit zur Zeit arbeiten i nur erlauben und das, und jeder oder im wesentlichen wird eine andere Regel in dem Satz,

QuestionID, dann bilden i eine Reihe von UND-Regeln wie so

<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>

Diese Regel 1 sagt, wenn Frage 123 und 124 wahr werden beantwortet, und 127, 128 sind falsch, sie passieren. OR (Regel 2) ist, wenn 123 und 125 wahr sind und 127 ist falsch, sie passieren auch. Dies wird langweilig, wenn es viele Kombinationen sind, so will ich implementieren oder in der Logik, ich bin nur nicht sicher, was am besten Ansatz für dieses Problem ist.

ich denke, Regel-Engine zu kompliziert ist, muss es einen einfacheren Weg geben, vielleicht ein Diagramm wie in LINQ konstruieren und dann die Bewertung, ob sie passieren,

Danke!

-. Keine compsci Haupt

War es hilfreich?

Lösung

Das muss nicht kompliziert sein: Sie die meisten der Art und Weise sind, bereits seit Ihrem und Elemente effektiv eine UND-Typ-Regel implementieren. Ich würde ein Element einzuführen, halten können und Elemente.

Ihr könnte, könnten Sie haben:

  • A RuleBase Klasse, mit einem "public abstract bool auswerten ()" Methode
  • TrueRule, FalseRule und OrRule Klassen, die Listen der RuleBase Objekte
  • enthalten
  • A QuestionRule-Klasse, die auf eine bestimmte Frage bezieht sich

würden Sie implementieren das Verfahren auf jede dieser auswerten wie folgt:

  • TrueRule: true zurück, nur, wenn alle enthaltenen Regeln true zurück, von Zensur
  • FalseRule: true zurück, nur, wenn alle enthaltenen Regeln false zurück von Zensur
  • OrRule: true zurück, wenn mindestens eines der enthaltenen Regeln gibt true zurück, von Zensur
  • QuestionRule: gibt die Antwort auf die ursprüngliche Frage

Diese Klassenhierarchie implementiert einen einfachen abstrakten Syntaxbaum (AST). LINQ, in Form der System.Expressions.Expression Klasse, macht ziemlich genau die gleiche Sache, aber es ist hilfreich, um Ihre eigenen zu schreiben, wenn es nicht offensichtlich ist, wie alles zusammen passt.

Andere Tipps

Wenn Sie eine richtige Rule Engine verwenden, die es unterstützt Inferenz wäre effizienter und erweiterbar.

Hier finden Sie aktuelle http://www.flexrule.com , die eine flexible, erweiterbare Regel-Engine, dass drei Arten von Regeln unterstützt. Procedural, Inference und Regel-Flow-Regeln können von Ihrer Anwendung externalisiert werden und erhalten diesen Rahmen ausgeführt werden.

Ich bin mir nicht sicher, ob ich völlig verstehe das Problem Sie versuchen zu lösen, aber man könnte eine einfache XPath verwendet an der IDs zu bekommen:

Dies würde Ihnen alle „true“ IDs, wo die Regel-ID = 1: / Regieren [@ id = "1"] / true // @ ID

Samt oben nur, wie es Ihnen die falsche IDs gibt: / Regel [@ id = "1"] / false // @ ID

Schließlich ein Link zu einer Einführung in XPath in .NET http://www.developer.com/xml/article.php/3383961

Good Luck

Ich würde vorschlagen, die Antworten auf die Fragen stellen, anstatt die Fragen true und false zur Gruppe mit. Ich denke, dass es für XML macht die einfacher zu lesen ist, was fraglich ist. Was nicht umstritten ist, dass sie es ermöglicht, ein question Element unabhängig, das heißt ohne Kenntnis des Kontextes zu beurteilen, in dem Sie versuchen, es zu bewerten. Das macht für eine einfachere Code.

Ich würde auch eine Seite von XML-Schema übernehmen und Ihre ODER-Logik als choice Element implementieren. Ein choice Element ist wahr, wenn eines seiner Kinder wahr sind. Sie können natürlich, nisten sie:

<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>

Dies lässt Sie mit vier recht einfache Methoden zu implementieren, von denen jede durch einen verwendet wird vorhergehenden es:

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

Die Struktur des XML macht diese Methoden ziemlich einfach zu implementieren:

 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;
}

Es könnte sein, lohnt sich ein List<XmlElement> zu den Parametern der IsFooCorrect Methoden hinzufügen. (Wenn die Regel-Engine in einer Klasse ist, können Sie es ein Klassenfeld machen.) Stellen Sie `alle Methoden fügen Sie das aktuelle Element auf der Liste, wenn eine Antwort ist falsch. Sie können dann den Inhalt dieser Liste untersuchen, genau zu wissen, warum eine Regel fehlgeschlagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top