Механизм правил - Как хранить правила, чтобы избежать анализа при редактировании? - PullRequest
5 голосов
/ 22 июня 2011

Мое приложение .NET оценивает пользовательские правила во время выполнения.Эти правила вводятся в систему через меню GUI пользователем.Я генерирую логическое утверждение, которое соответствует ему, и сохраняю его в базе данных.

Например: (Имя = 'Джон' И Фамилия = 'Смит') ИЛИ Номер> 12

Однако, когдапользователь хочет отредактировать правило с помощью графического интерфейса, мне нужно выполнить обратную операцию, чтобы определить состояния меню из сохраненного правила, что является дорогостоящим и сложным.Как бы вы порекомендовали хранить правила таким образом, чтобы их можно было легко перевести в состояния меню?

1 Ответ

5 голосов
/ 04 июля 2011

Вы можете хранить правила как AST s - реализовать несколько классов, которые представляют узлы дерева:

interface INode
{
}

enum BinaryOperator 
{
    AND, OR, Equal, Greater, Lower;
}

class BinaryExpression : INode
{
    BinaryOperator Operator { get; set; }
    INode Left { get; set; }
    INode Right { get; set; } 
}

class PropertyRerefence : INode
{
    string PropertyName { get; set; }
}

class Constant : INode
{
    string Value { get; set; }
}

Дерево для вашего примера будет выглядеть так:

BinaryExpression(OR)
  Left=BinaryExpression(AND)
          Left=...
          Right=...
  Right=BinaryExpression(Greater)
          Left=PropertyReference("Number")
          Right=Constant("12")

Затем вы можете использовать сериализацию (лучше всего JSON или XML, возможно даже двоичный, если вам не нужна читабельность в БД) для сохранения таких деревьев.При десериализации вам не нужно выполнять какой-либо синтаксический анализ, и вы можете пройти по дереву для заполнения меню.

Печать "(Имя = 'Джон' И Фамилия = 'Смит') ИЛИ Number> 12" такжелегко, когда у вас есть AST - для выражения BinaryExpression: напечатайте Left, напечатайте Operator, напечатайте Right.

Вы говорите, что оценка уже выполнена, поэтому я опущу это.Вы также можете посмотреть на этот вопрос .

...