سؤال

لدي بشكل أساسي دراسة استقصائية معروضة ، والأشخاص يجيبون على الأسئلة مثل الاختبار ، وهناك مسارات مختلفة ، إنه سهل للغاية حتى الآن ، لكنني أردت أن أجعله أكثر ديناميكية ، حتى أتمكن من الحصول على قاعدة عامة هو للاختبار مع جميع المسارات ، لجعل المقيِّم أسهل في العمل معه حاليًا فقط ، وأصبح كل أو بشكل أساسي قاعدة أخرى في المجموعة ،

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 خاطئة، فإنهما تنجحان أيضًا.يصبح هذا مملاً إذا كان هناك العديد من المجموعات، لذلك أريد تنفيذ OR في المنطق، لست متأكدًا من أفضل طريقة لحل هذه المشكلة.

أعتقد أن محرك القواعد معقد جدًا، ويجب أن تكون هناك طريقة أسهل، ربما إنشاء رسم بياني كما هو الحال في LINQ ثم تقييمه لمعرفة ما إذا كان سيتم اجتيازه أم لا.

شكرًا!

- ليس تخصصًا في Compsci.

هل كانت مفيدة؟

المحلول

لا يجب أن يكون هذا معقدًا:لقد قطعت معظم الطريق بالفعل، نظرًا لأن عناصرك وعناصرك تنفذ بشكل فعال قاعدة النوع AND.أود أن أعرض عنصرًا يمكنه الاحتفاظ بالعناصر.

في استطاعتك، كان من الممكن أن يكون لديك:

  • فئة RuleBase، بأسلوب "تقييم منطقي ملخص عام (())."
  • فئات TrueRule وFalseRule وOrRule، التي تحتوي على قوائم بكائنات RuleBase
  • فئة QuestionRule، والتي تشير إلى سؤال محدد

يمكنك تطبيق طريقة التقييم على كل منها كما يلي:

  • القاعدة الحقيقية: تُرجع true فقط إذا كانت جميع القواعد المضمنة تُرجع true من التقييم
  • قاعدة خاطئة: يُرجع صحيحًا فقط إذا كانت جميع القواعد المضمنة تُرجع خطأ من التقييم
  • القاعدة: تُرجع true إذا قامت إحدى القواعد المضمنة على الأقل بإرجاع true من التقييم
  • قاعدة السؤال: إرجاع الإجابة على السؤال الأصلي

يطبق هذا التسلسل الهرمي للفئة شجرة بناء جملة مجردة بسيطة (AST).LINQ، في شكل فئة System.Expressions.Expression، يفعل نفس الشيء تقريبًا، ولكن من المفيد أن تكتب صفحتك الخاصة إذا لم يكن من الواضح كيف يتناسب كل شيء معًا.

نصائح أخرى

إذا كنت تستخدم محرك القاعدة المناسبة التي تدعم الاستدلال أنه سيكون أكثر فعالية وقابلة للتوسيع.

ونلقي نظرة على http://www.flexrule.com حيث هو مرن، ولمد محرك قاعدة يدعم ثلاثة أنواع من القاعدة. الإجرائية، الاستدلال وحكم التدفق قواعد يمكن تخريجها من التطبيق الخاص بك والحصول على تنفيذها باستخدام هذا الإطار.

وأنا لست متأكدا من أنني أفهم تماما المشكلة التي تحاول حلها ولكن هل يمكن استخدام كسباث بسيطة للحصول على ال ID:

وهذا من شأنه أن يعطي لك كل عام "الحقيقية" ID حيث معرف القاعدة = 1: / حكم [@ ID = "1"] / صحيح // @ ID

وكما ورد أعلاه فقط أنها تعطيك ID كاذبة في: / حكم [@ ID = "1"] / // كاذبة @ ID

وأخيرا رابط لمقدمة لXPath في. NET http://www.developer.com/xml/article.php/3383961

وحظا سعيدا

أقترح وضع الإجابات على الأسئلة بدلاً من استخدامها true و false لتجميع الأسئلة.أعتقد أنه يجعل قراءة XML أسهل، وهو أمر قابل للنقاش.ما هو غير قابل للنقاش هو أنه يجعل من الممكن تقييم أ question عنصر مستقل، أي.دون أي معرفة بالسياق الذي تحاول تقييمه فيه.وهذا يجعل التعليمات البرمجية أبسط.

سأقوم أيضًا بأخذ صفحة من مخطط XML وتنفيذ منطق OR الخاص بك كملف 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>

يترك لك هذا أربع طرق بسيطة جدًا للتنفيذ، يتم استخدام كل منها بواسطة الطريقة التي تسبقها:

  • 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