2009-09-12 5 views
0

У меня есть следующий метод и интерфейс:Является ли это нарушением единого принципа ответственности?

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 кажется хорошим компромиссом.

Является ли сценарий подобным контексту конкретным/субъективным, или есть ли действительно лучшая практика для применения здесь?

+1

"== true" является избыточным. –

+1

Параметр может быть IEnumerable . – TrueWill

ответ

4

Я думаю, что это больше похоже на нарушение Закона Деметры и инкапсуляции. Выражение EvaluateExpression похоже на правила. Рассмотрите это:

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

public interface IRule { 
    object EvaluateExpression(); 
} 

Таким образом, вам не нужно раскрывать внутренние правила, такие как «Опыт» или «Результат».

И да, если поведение, которое вы хотите, это то, что правила оцениваются в порядке предсказуемости, тогда убедитесь, что они отсортированы. Ответственность правила заключается в том, чтобы оценивать себя, в то время как это решение вызывающего в каком порядке их оценивать.

0

Мое голосование пойдет для варианта 3. Чтобы свести к минимуму связь, вы хотите убедиться, что вы не делаете слишком много предположений о данных, отправленных в функцию.

Если другой класс должен был использовать это позднее, предположите ли вы, что они знают, чтобы передать их отсортированным по приоритету?

0

В сценарии, как это я хотел бы сделать что-то вроде:

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

} 

Вы могли бы сделать, что абстрактный класс или какая-то функциональность других классов агрегировать.

 Смежные вопросы

  • Нет связанных вопросов^_^