Pregunta

He esencialmente una encuesta que se muestra, y la gente responde a las preguntas de muchos como una prueba, y hay diferentes caminos, es bastante fácil hasta ahora, pero quería hacerlo más dinámico, de modo que yo pueda tener una regla genérica que es para la prueba con todos los caminos, para hacer que el evaluador sea más fácil trabajar con la actualidad acabo de permitir Y s, y cada uno O esencialmente se convierte en otra Regla en el conjunto,

Idpregunta, a continuación, hago un montón de reglas Y así

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

esta regla 1 dice que si la pregunta 123 y 124 son respondidas verdadero, y 127, 128 son falsas, que pasan.O (regla 2) si es 123 y 125 son verdaderas y 127 es falso, que pasan así.Esto se vuelve tedioso si hay muchas combinaciones, por lo que quiero poner en práctica O en la lógica, simplemente no estoy seguro de lo mejor enfoque para este problema.

Creo que el motor de reglas es demasiado complicado, debe haber una manera más fácil, tal vez la construcción de un gráfico como en LINQ y, a continuación, evaluar para ver si pasan,

gracias!

--no compsci principales.

¿Fue útil?

Solución

Esto no tiene que ser complicado: ya estás en la mayor parte del camino, ya que tus elementos implementan efectivamente una regla de tipo AND. Introduciría un elemento que puede contener y elementos.

En tu poder, podrías tener:

  • Una clase RuleBase, con un " public abstract bool Evaluate () " método
  • Clases TrueRule, FalseRule y OrRule, que contienen listas de objetos RuleBase
  • Una clase QuestionRule, que se refiere a una pregunta específica

Implementaría el método Evaluar en cada uno de estos de la siguiente manera:

  • TrueRule: devuelve verdadero solo si todas las reglas contenidas devuelven verdadero de Evaluar
  • FalseRule: devuelve verdadero solo si todas las reglas contenidas devuelven falso de Evaluar
  • OrRule: devuelve verdadero si al menos una de las reglas contenidas devuelve verdadero de Evaluar
  • QuestionRule: devuelve la respuesta a la pregunta original

Esta jerarquía de clases implementa un árbol de sintaxis abstracta simple (AST). LINQ, en la forma de la clase System.Expressions.Expression, hace más o menos lo mismo, pero es útil escribir uno propio si no es obvio cómo encaja todo.

Otros consejos

Si utiliza un motor de reglas adecuado que admite inferencia, sería más eficiente y extensible.

Eche un vistazo a http://www.flexrule.com , que es un motor de reglas flexible y extensible que admite tres tipos de reglas. Las reglas de procedimiento, inferencia y flujo de reglas pueden externalizarse desde su aplicación y ejecutarse utilizando este marco.

No estoy seguro de entender completamente el problema que está tratando de resolver, pero podría usar un XPath simple para obtener los ID:

Esto le daría todo el " verdadero " ID donde la regla ID = 1: / rule [@id = " 1 "] / true // @ ID

Igual que el anterior solo te da las identificaciones falsas: / rule [@id = " 1 "] / false // @ ID

Por último, un enlace a una introducción a XPath en .NET http://www.developer.com/xml/article.php/3383961

Buena suerte

Te sugiero poner las respuestas en las preguntas, en lugar de utilizar true y false para el grupo de las preguntas.Creo que se hace para XML que es más fácil de leer, lo que es discutible.Lo que no es discutible es que se hace posible evaluar un question elemento de forma independiente, es decir,sin ningún conocimiento del contexto en el que usted está tratando de evaluar.Que se hace para simplificar el código.

También me gustaría tomar una página de Esquema XML y aplicar su lógica O como un choice elemento.Un choice elemento es true si alguno de sus hijos son verdaderas.Usted puede, por supuesto, nido de ellos:

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

Esto te deja con cuatro bastante simple de los métodos a aplicar, cada uno de los cuales es utilizado por el anterior:

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

La estructura del XML que hace que estos métodos bastante simple de implementar:

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

Valdría la pena agregar un List<XmlElement> a los parámetros de la IsFooCorrect métodos.(Si el motor de reglas se encuentra en una clase, usted podría hacer un campo de la clase.) Hacer " todos los métodos de agregar el elemento actual de la lista cuando una respuesta errónea.A continuación, puede examinar el contenido de esa lista para que sepas exactamente por qué una regla de error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top