Я думаю, что это больше похоже на нарушение закона Деметры и инкапсуляции. Выражение EvaluateExpression выглядит так, как будто оно принадлежит правилам. Учтите это:
public object ProcessRules(List<IRule> rules) {
foreach(IRule rule in rules) {
return rule.EvaluateExpression();
}
}
public interface IRule {
object EvaluateExpression();
}
Таким образом, вам не нужно раскрывать внутренние правила, такие как Exp или Result.
И да, если вы хотите, чтобы правила оценивались в порядке приоритета, убедитесь, что они отсортированы. Правило ответственности состоит в том, чтобы оценивать себя, в то время как вызывающий абонент решает, в каком порядке их оценивать.