5

私の.NETアプリケーションは、実行時にユーザー定義のルールを評価します。これらのルールは、ユーザーがGUIメニューを介してシステムに入力します。それに対応する論理ステートメントを生成し、データベースに保存します。

例:(Name ='John' AND Surname ='Smith')OR Number> 12

ただし、ユーザーがGUIでルールを編集したい場合は、逆の操作を行って、保存されているルールからメニューの状態を判別する必要があります。これは、コストがかかり、複雑です。メニューの状態に簡単に戻すことができる方法でルールを保存することをどのように推奨しますか?

4

1 に答える 1

5

ルールをASTとして保存できます-ツリーのノードを表すいくつかのクラスを実装します。

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、データベースの可読性を気にしない場合はバイナリ)を使用して、そのようなツリーを保存できます。デシリアライズでは、解析を行う必要はなく、ツリーをトラバースしてメニューにデータを入力できます。

"(Name ='John' AND Surname ='Smith')OR Number> 12"の印刷は、ASTがある場合にも簡単です-BinaryExpressionの場合:左に印刷、演算子を印刷、右に印刷。

あなたはすでに評価を実施していると言っているので、これは省略します。この質問もご覧ください。

于 2011-07-04T10:10:04.680 に答える