سؤال

لدي الطريقة التالية و واجهة:

public object ProcessRules(List<IRule> rules)
{
    foreach(IRule rule in rules)
    {
        if(EvaluateExpression(rule.Exp) == true) return rule.Result;
    }

    //Some error handling here for not hitting any rules
}

public interface IRule
{
    Expression Exp;
    Object Result;
    int Precedence;
}

لأن قواعد الأسبقية ، ينبغي أن الواقع لم تتم معالجتها خارج الترتيب.هذا يقودني مع (أعتقد) ثلاثة حلول:

  1. نوع القواعد قبل تمريرها إلى المقيم.
  2. تغيير نوع المعلمة إلى شيء يفرض ترتيب الفرز.
  3. نوع داخل المقيم.

أنا مثل الخيار 3 لأنه يضمن دائما أن ذلك يتم فرز وأنا مثل الخيار 1 لأنه يبدو أكثر تماسكا.و الخيار 2 يبدو حلا وسطا جيدا.

سيناريو مثل هذا السياق محددة/ذاتية ، أو هل هناك حقا أفضل الممارسات التي ينبغي تطبيقها هنا ؟

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

المحلول

أعتقد أنها أكثر من ذلك مثل انتهاكا للقانون ديميتر و التغليف.على EvaluateExpression يبدو أنه ينتمي على القواعد.النظر في هذا:

public object ProcessRules(List<IRule> rules) {
    foreach(IRule rule in rules) {
        return rule.EvaluateExpression();
    }
}

public interface IRule {
    object EvaluateExpression();
}

وبهذه الطريقة لم يكن لديك لفضح الداخلية من القواعد ، مثل Exp أو نتيجة.

نعم ، إذا كان السلوك الذي تريده هو أن القواعد التي يتم تقييمها في ترتيب precendence ، ثم التأكد من أن يتم فرزها.القاعدة مسؤولية تقييم نفسها ، في حين أنه هو المتصل قرار في ما أجل تقييم لهم.

نصائح أخرى

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

إذا فئة مختلفة من هذا في وقت لاحق, سوف نفترض أنهم يعرفون أن يمر بها مرتبة حسب أسبقية?

في سيناريو مثل هذا كنت تفعل شيئا مثل:

public class RuleProcessor
{   
     public void SortRules(List<IRule> rules){}

     //You could make this an abstract method
     public object ProcessSortedRules(List<IRule> rules)
     {
         foreach(IRule rule in rules)
         {
             if(EvaluateExpression(rule.Exp) == true) return rule.Result;
         }

     //Some error handling here for not hitting any rules

     }

     public object ProcessRules(List<IRule> rules)
     {
          SortRules(rules);
          ProcessSortedRules(rules);
     }

}

هل يمكن أن تجعل هذا فئة مجردة أو نوعا من وظائف الفئات الأخرى الكلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top