2011-06-22 37 views
5

Ứng dụng .NET của tôi đánh giá các quy tắc do người dùng xác định khi chạy. Các quy tắc này được nhập vào hệ thống thông qua các menu GUI của người dùng. Tôi tạo ra một câu lệnh logic tương ứng với nó và lưu nó trong cơ sở dữ liệu.Công cụ quy tắc - Cách lưu trữ các quy tắc để tránh phân tích cú pháp khi chỉnh sửa?

Ví dụ: (Tên = 'John' VÀ Họ = 'Smith') OR Số> 12

Tuy nhiên, khi người dùng muốn chỉnh sửa quy tắc bằng cách GUI, tôi cần phải thực hiện một thao tác ngược lại để xác định trạng thái menu từ quy tắc được lưu trữ, tốn kém và phức tạp. Làm thế nào bạn sẽ khuyên bạn nên lưu trữ các quy tắc theo cách mà nó có thể được đảo ngược đến trạng thái menu dễ dàng?

+1

Điều đó phụ thuộc rất nhiều vào quy tắc bạn hỗ trợ và mức độ linh hoạt mà bạn cung cấp cho người dùng. –

+2

Nếu quy tắc của bạn phức tạp, bạn nên thực hiện một công cụ quy tắc nghiệp vụ được thiết lập thay vì tự quản lý quy tắc mã hóa. Có nhiều quy tắc hơn các menu GUI đơn giản và tạo ra câu lệnh động. – Kizz

Trả lời

5

Bạn có thể lưu trữ các quy tắc như AST s - thực hiện một vài lớp đại diện cho các nút của cây:

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

Cây ví dụ của bạn sẽ trông như thế này:

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

Bạn sau đó có thể sử dụng serialization (tốt nhất JSON, hoặc XML, thậm chí có thể nhị phân nếu bạn không quan tâm đến khả năng đọc trong db) để lưu các cây như vậy. Khi deserialization, bạn không cần phải làm bất kỳ phân tích cú pháp và có thể đi qua cây để cư các menu.

In "(Tên = 'John' và họ = 'Smith') HOẶC Số> 12" cũng dễ dàng khi bạn có AST - cho một BinaryExpression: in Trái, in Toán tử, in Phải.

Bạn nói rằng bạn đã có đánh giá được triển khai vì vậy tôi sẽ bỏ qua điều này. Bạn cũng có thể xem this question.

Các vấn đề liên quan