2010-08-07 7 views
46

Ich bin auf der Suche nach Vorschlägen für eine schlanke Regel-Engine in Javascript implementiert.Leichte Regel-Engine in Javascript

Der Grund für eine solche Implementierung ist die Erstellung einer sehr leichten, aber schnellen browserbasierten Simulation mit einer kleinen Anzahl von Regeln (weniger als 20). Die Simulation würde ein halbes Dutzend Parameter benötigen und die Regeln und Ergebnisse im Browser anzeigen, ohne dass man zum Server zurückkehren muss. Stellen Sie sich eine Benutzeroberfläche mit einigen Optionsfeldern, Kontrollkästchen, Textfeldern und Schiebereglern vor, um die Parameter zu steuern. Die Simulation würde basierend auf einer Parameteränderung schnell erneut ausgeführt werden.

+0

@Philippe - Sprechen Sie Validierungsregeln? – TheCloudlessSky

+0

Nein, mehr von einer Reihe von Wenn-Dann-Regeln, um einen Kontext in Bezug auf Kriterien einzuschränken, was schließlich zu einer Möglichkeit führt, Entscheidungswerte in einer Matrix nachzuschlagen. Das wäre also wie eine einfache Vorwärtskette. –

+5

Sie haben eine vollwertige Programmiersprache, welche Funktion fehlt ihr? – aaaaaaaaaaaa

Antwort

11

Ich habe eine (kompliziertere) Version dessen, was Sie in C# beschreiben, implementiert, und wenn ich an den Code zurückdenke, wäre alles mit JavaScript machbar. Ich stimme den Kommentaren zu, dass das Schreiben Ihrer eigenen eine praktikable Option ist. Es kann so einfach oder komplex sein, wie Sie es möchten.

Allgemeine Beobachtungen für diese Art von Regel-Engine (in keiner bestimmten Reihenfolge):

  1. Nicht-lineare Lookups sind dein Freund. In JavaScript wäre dies mit der Syntax obj[key] = val einfach. Sobald Sie die Ausgabe einer Regel für einen bestimmten Parametersatz festgelegt haben, speichern Sie die Ergebnisse zwischen, damit Sie sie erneut verwenden können, ohne die Regel erneut auszuführen.

  2. Bestimmen Sie, ob Sie eindeutige Kombinationen von Eingaben verarbeiten müssen. Angenommen, Sie erlauben dem Benutzer, mehrere Namen einzugeben und nach Vorschlägen für XYZ zu fragen. In Wirklichkeit müssen Sie jetzt alle Regeln für jeden Eingabewert ausführen. Dies kann irrelevant, einfach oder immens kompliziert sein (stellen Sie sich ein Hotelreservierungssystem vor, das mehrere Daten, Zeiten, Orte und Kriterien akzeptiert und Vorschläge macht).

  3. setTimeout() kann verwendet werden, um das Verhalten der Benutzeroberfläche zu glätten, aber die Regeln, die Sie beschreiben, sollten in wenigen Millisekunden oder weniger ausgeführt werden. Leistung ist weniger wichtig als Sie vielleicht mit einer grundlegenden Regel-Engine denken.

  4. Regeldefinitionen können am einfachsten manipuliert werden, wenn es sich um Objekte (oder sogar einfache Objektbäume) handelt.

  5. Keine UI-Elemente an die Ausgabeergebnisse binden; Das bedeutet, dass Sie die Ergebnisse der Regelausführung in eine flexible Objektliste einfügen, damit Sie die gewünschte visuelle Ausgabe erstellen können.

  6. Angepasste Ausgabenachrichten sind für einen Benutzer sehr nützlich. Das heißt, anstatt eine generische Nachricht auszulösen, wenn eine Bedingung erfüllt ist, versuchen Sie, einen echten Wert in die Ausgabenachricht einzufügen, wie "Ihr Kredit-Score ist nur 550. Sie benötigen ein Minimum von 600, um fortzufahren."

Das ist es aus der Spitze meines Kopfes. Viel Glück.

+1

Das ist nicht wirklich, was ich im Sinn hatte, aber da Sie zu diesem Thema sind, habe ich eine großartige gefunden Framework zur Modellierung von Abhängigkeitsketten: KnockoutJS http://knockoutjs.com/. Tatsächlich benutze ich es derzeit in Verbindung mit der neuronalen Netzwerkbibliothek von Brain (http://harthur.github.com/brain/), um eine dynamische Simulation zu erstellen. Aber für das ursprüngliche Problem, das ich zu lösen versuche, kann ich kein neuronales Netz benutzen, da ich eine Reihe von Regeln (Bedingung/Aktionspaare) modellieren muss, die ich entweder basierend auf einem Ziel auswerten kann (z. B. Ziel X, Rückwärtsverkettung). oder basierend auf einer Reihe von Fakten (zB Vorwärtsverkettung). –

+0

@Phillipe - vereinbart, ein neuronales Netzwerk befasst sich nicht mit dem Problem, das Sie beschrieben haben. Ich habe meine Antwort vielleicht schlecht formuliert; Kurz gesagt, ich kenne keinen existierenden Rahmen, der das tun würde, was Sie gefragt haben, aber basierend auf meiner Erfahrung, könnten Sie in wenigen Tagen eine grundlegende, aber flexible Regel-Engine knacken, sogar in JS. Die Glocken/Pfeifen/Vorbehalte sind, wo Zeit verloren ist (weshalb ich auf Dinge hingewiesen habe, die ich gelernt hatte, die Fallstricke waren). Ich weiß nicht, ob das Schreiben Ihrer eigenen eine Option ist oder nicht. –

1

ich ein Beispiel html gemacht haben/javascript Regel-Engine für ein Produkt Konfigurator. Die Regel-Engine basiert auf if then then-Anweisungen. Die if then-Anweisungen werden mit einem Array überprüft. Dieses Array ist bei jeder Änderung einer Option mit allen möglichen Optionen gefüllt. Schau dir mein Blog für das Beispiel an. Link to my blog "Forward chaining javascript rule engine"

Ich denke, dass "obj [key] = val" der Schlüssel zu einer JavaScript-Regel-Engine ist. Jquery hilft bei der Handhabung von Javascript.

11

Überprüfen Sie die Rule-Engine nools, die für node.js in reinem JavaScript implementiert ist. Es hat eine ziemlich einfache Syntax für Regeln Definitionen.

+0

Wie kann man dies für IE 8-9 arbeiten? – niceman

+4

nols wird nicht mehr von C2FO gewartet, Experte von ihrem github Repo: 'C2FO führt dieses Projekt nicht länger. Bitte verwenden Sie entsprechend. Wenn Sie helfen möchten, das Projekt zu erhalten oder zu übernehmen, lassen Sie es uns bitte wissen.' –

1

Bitte überprüfen Sie (JSL) https://www.npmjs.com/package/lib-jsl.

Aus dem Übersichtsdokument ist JSL eine JSON-basierte Logikprogrammierbibliothek, die für die eingebettete Verwendung in JS-Programmen gedacht ist. Es verwendet JSON als seine Syntax sowie I/O-Methode und bietet Rückrufe in die Host-Umgebung zur Leistungsoptimierung.

5

Rule Reactor (https://github.com/anywhichway/rule-reactor) ist eine leichtgewichtige, schnelle, ausdrucksstarke Business-Rule-Engine, die JavaScript-Internals, faule Cross-Produkte und Funktionen als Objekte anstelle von Rete nutzt. Es kann im Browser oder auf dem Server verwendet werden.