Frage

Ich habe folgendes Verfahren und Schnittstelle:

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

Da Regeln einen Vorrang haben, sollten sie eigentlich nie aus der Reihenfolge verarbeitet werden. Dies führt mich mit (glaube ich) drei Lösungen:

  1. Sortieren Regeln, bevor sie in die Auswerter übergeben.
  2. Ändern Sie den Parametertyp auf etwas, das eine Sortierreihenfolge erzwingt.
  3. Sortieren innerhalb des Bewerters.

Ich mag die Option 3, da es sicherstellt, immer, dass es sortiert und Ich mag die Option 1, weil es mehr Zusammenhalt scheint. Und die Option 2 scheint ein guter Kompromiss.

Ist ein Szenario wie dieser Zusammenhang spezifischen / subjektiv, oder gibt es wirklich eine beste Praxis hier angewandt werden?

War es hilfreich?

Lösung

Ich denke, es ist eher wie ein Verstoß gegen das Gesetz von Demeter und Verkapselung. Die EvaluateExpression sieht aus wie es auf Regeln gehört. Bedenken Sie:

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

public interface IRule {
    object EvaluateExpression();
}

Auf diese Weise müssen Sie nicht die Interna von Regeln aussetzen, wie Exp oder Ergebnis.

Und ja, wenn das Verhalten, das Sie wollen, ist, dass die Regeln in der Reihenfolge der precendence ausgewertet werden, dann sicher, dass sie sortiert werden. Die Verantwortung der Regel selbst zu bewerten, während es den Anrufers Entscheidung ist das, was um sie zu bewerten.

Andere Tipps

Meine Stimme für Option 3. In dem Bemühen, zu minimieren Kopplung gehen würde, wollen Sie sicherstellen, dass Sie über die Daten in eine Funktion gesendet nicht zu viele Annahmen getroffen werden.

Wenn eine andere Klasse Verwendung dieses zu einem späteren Zeitpunkt zu machen, würden Sie annehmen, dass sie wissen, sie nach Vorrang sortiert bestehen?

In einem Szenario wie dies ich etwas tun würde, wie:

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

}

Sie können machen, dass eine abstrakte Klasse oder irgendeine Art von Funktionalität anderer Klassen aggregieren.

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