문제

나는 본질적으로 보여지는 설문 조사를 가지고 있으며 사람들은 시험과 같은 질문에 대답하고 다른 길이 있습니다. 지금까지는 매우 쉽지만 더 역동적으로 만들고 싶었습니다. 모든 경로를 사용하여 테스트를위한 것입니다. 평가자가 현재 허용하고 현재 허용하고, 각각 또는 본질적으로 세트에서 다른 규칙이됩니다.

QuestionId, 그런 다음 나는 많은 사람들과 같은 규칙을 형성합니다.

<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이 거짓이라면 통과한다면. 또는 (규칙 2) 123과 125가 참이고 127이 거짓이면 통과합니다. 조합이 많이 있으면 지루해 지므로 논리를 구현하거나 논리로 원합니다.이 문제에 가장 적합한 접근 방식이 확실하지 않습니다.

규칙 엔진이 너무 복잡하다고 생각합니다. 더 쉬운 방법이 있어야합니다. 아마도 LINQ와 같은 그래프를 구성한 다음 통과 여부를 평가하여 평가합니다.

감사해요!

-COMPSCI 전공이 아닙니다.

도움이 되었습니까?

해결책

이것은 복잡 할 필요가 없습니다. 당신은 이미 대부분의 방식으로, 당신과 요소는 효과적으로 유형 규칙을 구현하기 때문입니다. 나는 붙잡을 수있는 요소와 요소를 소개 할 것입니다.

당신은 할 수 있는데, 당신은 다음을 가질 수 있습니다.

  • "public bool bool evaluate ()"메소드가 포함 된 룰베이스 클래스
  • 룰베이스 객체 목록을 포함하는 truerule, falserule 및 orrule 클래스
  • 특정 질문을 나타내는 QuestionRule 클래스

다음과 같이 각각의 각각의 평가 방법을 구현합니다.

  • truerule : 포함 된 모든 규칙이 평가에서 true를 반환하는 경우에만 True를 반환합니다.
  • Falserule : 포함 된 모든 규칙이 평가에서 False를 반환하는 경우에만 True를 반환합니다.
  • Orrule : 포함 된 규칙 중 하나 이상이 평가에서 true를 반환하면 true를 반환합니다.
  • QuestionRule : 원래 질문에 대한 답을 반환합니다

이 클래스 계층 구조는 간단한 추상 구문 트리 (AST)를 구현합니다. LINQ는 System.expressions.expression 클래스의 형태로 거의 똑같은 일을하지만 모든 것이 어떻게 어울리는 지 명확하지 않은 경우 자신의 글을 쓰는 것이 도움이됩니다.

다른 팁

추론을 지원하는 적절한 규칙 엔진을 사용하는 경우 더 효율적이고 확장 가능합니다.

보세요 http://www.flexrule.com 이것은 세 가지 유형의 규칙을 지원하는 유연하고 확장 가능한 규칙 엔진입니다. 절차, 추론 및 규칙 흐름 규칙은 응용 프로그램에서 외부화 하고이 프레임 워크를 사용하여 실행 될 수 있습니다.

나는 당신이 해결하려는 문제를 완전히 이해하지 못하지만 간단한 xpath를 사용하여 ID를 얻을 수 있습니다.

이것은 규칙 id = 1 :/rule [@id = "1"]/true //@id 인 모든 "true"ID를 줄 것입니다.

위와 동일하게 오지 당신에게 false id를 제공합니다 :/rule [@id = "1"]/false //@id

마지막으로 .NET의 XPath 소개에 대한 링크http://www.developer.com/xml/article.php/3383961

행운을 빕니다

사용하기보다는 질문에 답을 넣는 것이 좋습니다. true 그리고 false 질문을 그룹화합니다. 나는 그것이 읽기 쉬운 XML을 만들어 내고 논쟁의 여지가 있다고 생각합니다. 논쟁의 여지가없는 것은 question 독립적으로, 즉, 그것을 평가하려는 맥락에 대한 지식없이. 그것은 더 간단한 코드를 만듭니다.

또한 XML 스키마에서 페이지를 가져 와서 귀하의 또는 논리를 choice 요소. ㅏ choice 어린이 중 하나라도 사실이라면 요소가 사실입니다. 물론 당신은 그들을 둥지 할 수 있습니다.

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

이를 통해 구현할 수있는 4 가지 간단한 방법이 있습니다. 각 방법은 이전의 하나에 의해 사용됩니다.

  • 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