Wie funktioniert ein Regelsystem wie das in Outlook Express Arbeit in der Theorie verwendet? Wie konnte es geschehen?

StackOverflow https://stackoverflow.com/questions/2043546

  •  19-09-2019
  •  | 
  •  

Frage

Ich bin neugierig auf diese:

In Microsofts Outlook Express (oder Outlook, erinnere mich nicht gut, ich bin ein Mac-User), sie haben etwas wirklich cool. Allgemeine Regeln:

Sie können automatisch sortiert eine Reihe von Regeln konfigurieren oder Ihre E-Mails löschen, zum Beispiel. Es ist unglaublich leistungsfähig und einfach zu bedienen.

Diese Regeln sah ziemlich viel wie folgt aus:

"Wenn E-Mail in der Inbox Thema hat, die 'foo' enthält, oder 'bar' oder 'foobar' löschen"

Ich muss Code etwas ähnliches für eine leistungsfähige Form Validierungssystem. Der Entwickler sollte einfach in der Lage sein, Regeln zu erstellen, wie folgt aus:

rule: [password_1] is_not_equal_with [password_2]
consequence: show_error '2921'

rule: [firstName] has_less_characters_than '2'
consequence: show_error '1211'

rule: [age] is_numeric, is_smaller_than '13', is_greater_than '130'
consequence: show_error '1522'

rule: [gender] is_equal_with 'female'
consequence: show_group [female_questions]

rule: [termsAndConditionsAccepted] is_not_checked
consequence: show_error '482'

rule: [age] is_less_than 21
consequence: hide_group [income_questions]

Nun, ich ein paar Ideen, wie dies geschehen könnte, und ich werde sie hier als Antwort posten. Aber bevor ich das Rad neu erfinden: Gibt es schriftliche Konzepte, die ich als Grundlage verwenden, um ein regelbasierte Validierungssystem ähnlich wie diese zu entwickeln? Oder wenn nicht, machen Sie Vorschläge haben, wie dies geschehen könnte?

Im Beispiel oben, alles in eckigen Klammern ist der Name eines HTML-Formularelementes. Alles in apostrophs ‚‘ ist ein „hart codiert“ Wert vergleichen gegen.

Die definierten Regeln übersetzt werden in PHP-Code und JavaScript-Code sowohl client- und serverseitige Validierung zu tun.

Merkmale dieses in der Lage sein müssen:

  • Bedingte Regeln: Etwas A hängt von etwas B
  • Wertvergleiche: Für ganze Zahlen, die Schwimmer, Strings
  • Aktivieren irgendeine Form der Steuerlogik als auch, wie in dem "[Geschlecht] is_equal_with 'weiblich'" Beispiel oben.

Wie kann dies geschehen? Was die Einheiten sind muss ich berücksichtigen, aus wissenschaftlicher Sicht?

ich denke, das theoretische Konzept dafür ist plattformunabhängig. Obwohl ich dies in PHP und JavaScript implementieren wird, gibt es keinen Grund, warum ein C ++ Entwickler sollte nicht reagieren ;-) (Ich bin ein Objective-C Kerl, btw)

War es hilfreich?

Lösung

Sie möchten vielleicht einige der Open-Source-Regeln Motoren überprüfen; oder sogar eine bezahlte für einen.

Beispiele hierfür sind
Lohn für ihn:
InRule , Business Rules Engine , ASA Business Rules Engine

Opensource:
OpenRules , geifert

Es gibt eine Menge mehr. einige gebaut einschließlich in Java (Java Rule Engine API (JSR94)) und .NET (Windows Workflow Foundation Rules Engine).

Nicht sicher gerade PHP though.

Als Randbemerkung, habe ich ein paar Motoren verwendet, wie Haley Regeln (bevor sie wurden von Oracle gekauft) Web-UI zu fahren. Beachten Sie, dass die Ausführungsgeschwindigkeit absolut entscheidend ist. Wir hatten Haley Verarbeitung etwa 2000 Regeln pro Seite Last (Hypothek app), und es wurde die Ausführung in weniger als 40 ms (kein Tippfehler). Wir habe es zu entscheiden, welche Felder auf der Seite sowie festzustellen, ob die eingegebenen Daten entsprechen, erfüllen rechtliche Standards, und auch, ob es korrekt eingegeben wurde.

Einige der anderen Motoren waren viel viel langsamer sogar auf viel kleineren Regelsätze durch, wie lange es dauerte, um einfach die Motoren instanziiert.

Ich habe auch auf dem Weg gegangen, um für kleinere Systeme meines eigenen zu schreiben. In meinem Fall habe ich Javascript und einfach Variablen mit Daten aus der geposteten Seite vor der Ausführung der Skripte eingerichtet, die mit den Formen gespeichert wurden.

Dies war auch performant in kleinerem Maßstab, aber ich begrenzt es nur geben, einfach Go / No Go Antworten.

Andere Tipps

Für eine kleine Anzahl von Regeln und Nachrichten können Sie einen Brute-Force-Algorithmus anwenden: Nehmen Sie jede Regel und jede Nachricht und vergleichen, wenn sie passen. Sie werden zu einem O erhalten (r m ) Komplexität wobei r die Anzahl der Regeln ist und m die Anzahl der Nachricht ist, nicht in Betracht gezogen wird, dass eine Regel mehrere Bedingungen haben kann.

Für eine große Anzahl von Regeln oder Nachrichten können Sie ein Rete Netzwerk implementieren ( http: // en. wikipedia.org/wiki/Rete_algorithm ). Dies dauert einige Speicher, ist aber viel viel schneller in der Praxis. Je nachdem, wie Sie Ihre Regeln entwerfen finden Sie verschiedene Komplexitäten erhalten.

Der erste Ansatz ist einfach, und ich glaube nicht, dass ich es zu erklären. Wenn Sie jedoch Hilfe benötigen lassen Sie mich wissen, und ich werde Detail, die Idee. Lassen Sie mich den zweiten Ansatz erklären:

Lesen Sie ein wenig über Rete-Algorithmus vor weiter zu gehen.

In dem Alpha-Teil des RETE-Netzwerks finden Sie verschiedene Bedingungen speichern, die in Ihren Regeln erscheinen. Einige Regeln könnten einige Bedingungen teilen. Wie:

Rule1 : IF (message.date 24.10.2009 entspricht) und (message.title enthält "Hallo") THEN tun something1

Rule2 : IF (message.hasAttachement ist TRUE) AND (message.date gleich 24.10.2009) THEN tun something2

So ist der Alpha Teil des Netzes 3 Elemente

  • C1: (message.date gleich 24.10.2009)
  • C2: (message.title enthält "Hallo")
  • C3: (message.hasAttachement ist TRUE)

In der Beta net haben Sie zwei Knoten verbinden, dass Link C1-C2 und C3-C1.

Die Produktionsknoten, die die Beta-Netzwerk endet die Reihe von Aktionen enthalten, die, wenn eine Nachricht erfüllt alle Bedingungen der Regel (in der Alpha-Teil) durchgeführt werden müssen und alle die Konsistenzprüfungen (in der Beta-Teil).

Der komplizierteste Teil ist das Beta-Netzwerk. Wenn Sie nur die logische UND-Verknüpfung in Ihren Regeln (keine andere logische op oder Klammern) wollen, dann ist trivial. Wenn Sie jedoch mehr komplizierte Konstrukte wollen, dann werden Sie haben eine Menge Code zu schreiben und eine Menge Tests durchführen.

Für weitere Informationen über Rete:

  • Produktionsanpassung für große Lernsysteme / - Robert B. Doorenbos. (1995)
  • auf eine effiziente Implementierung von Produktionssystemen / - Charles L. Forgy (1979)

In einem objektorientierten Design, ein Ansatz, den Befehl Muster oder für komplexere Anforderungen zu implementieren, das Interpreter-Muster. Sie würden normalerweise mehrere Klassen für verschiedene Kategorien von Regeln erstellen, und Sie können sie für komplexere Szenarien definieren (von CompositeRule Aufbau, zum Beispiel); alle von ihnen eine Schnittstelle wie Execute () oder Ausführen (Kontext) unterstützen.

Sie eine Warteschlange von Regel Instanzen aufzubauen, und rufen Sie Execute (Kontext) auf jedem von ihnen für jedes Objekt beaufschlagt. Der Kontext wäre eine Instanz des Objekts (Nachricht oder Form, oder was auch immer), die Sie handeln auf.

Ketten der Regeln in einem Chain-of-Verantwortung .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top