2010-08-07 10 views
46

Sto cercando suggerimenti per un motore di regole leggero implementato in Javascript.Motore di regole leggere in Javascript

Il motivo di tale implementazione è di creare una simulazione basata su browser molto leggera ma veloce utilizzando un piccolo insieme di regole (meno di 20). La simulazione richiede una mezza dozzina di parametri ed esegue le regole e visualizza i risultati nel browser senza che sia necessario tornare al server. Pensa a un'interfaccia utente con un paio di pulsanti radio, caselle di controllo, caselle di testo e cursori per controllare i parametri. La simulazione si riavvierà rapidamente in base a qualsiasi modifica dei parametri.

+0

@Philippe - Stai parlando di regole di validazione? – TheCloudlessSky

+0

No, più di una serie di regole if-then per restringere un contesto in termini di criteri, portando infine a un modo per cercare i valori decisionali in una matrice. Quindi questo sarebbe come un semplice motore di concatenamento in avanti. –

+5

Hai un linguaggio di programmazione pienamente funzionante, di quale funzionalità mancano? – aaaaaaaaaaaa

risposta

11

Ho implementato una (più complicata) versione di ciò che stai descrivendo in C# e ripensando al codice, tutto sarebbe possibile con JavaScript. Sono d'accordo con i commenti postati che scrivere il proprio è un'opzione praticabile. Può essere semplice o complesso come vuoi che sia.

Osservazioni di carattere generale per questo tipo di motore di regole (in nessun ordine particolare):

  1. lookups non lineari sono il tuo amico. In JavaScript, questo sarebbe facile usando la sintassi obj[key] = val. Una volta determinato l'output di una regola per un determinato set di parametri, memorizzare i risultati nella cache in modo da poterlo utilizzare nuovamente senza eseguire nuovamente la regola.

  2. Determinare se è necessario elaborare o meno combinazioni univoche di input. Ad esempio, supponiamo che tu permetta all'utente di inserire più nomi e chiedere suggerimenti su XYZ. In realtà, ora è necessario eseguire tutte le regole rispetto a ciascun valore di input. Questo può essere irrilevante, semplice o immensamente complicato (immagina un sistema di prenotazioni alberghiere che richiede più date, orari, luoghi e criteri e suggerisce suggerimenti).

  3. setTimeout() può essere utilizzato per attenuare il comportamento dell'interfaccia utente, ma le regole che descrivi devono essere eseguite in pochi millisecondi o meno, quindi preoccuparsi per le prestazioni. Le prestazioni sono meno preoccupanti di quanto si possa pensare con un motore di regole di base.

  4. Le definizioni delle regole sono più facili da manipolare se sono oggetti (o anche semplici alberi di oggetti).

  5. Non collegare gli elementi dell'interfaccia utente ai risultati di output; nel senso, metti i risultati dell'esecuzione della regola in un elenco di oggetti flessibile in modo da poter creare qualsiasi output visivo tu desideri da esso.

  6. I messaggi di output personalizzati sono molto utili per un utente. Significa, piuttosto che innescare un messaggio generico quando una condizione è soddisfatta, prova ad inserire un valore reale nel messaggio di output come "Il tuo punteggio di credito è solo 550. Hai bisogno di un minimo di 600 per continuare".

Questo è fuori di testa. In bocca al lupo.

+1

Non è proprio quello che avevo in mente, ma visto che sei su questo argomento, ho trovato un ottimo framework per modellare le catene di dipendenza: KnockoutJS http://knockoutjs.com/. Infatti attualmente lo sto utilizzando in combinazione con la libreria di rete neurale Brain (http://harthur.github.com/brain/) per creare una simulazione dinamica. Ma per il problema originale che sto cercando di risolvere non posso usare una rete neurale perché ho bisogno di modellare una serie di regole (coppie di condizioni/azioni) che posso valutare in base a un obiettivo (dimostrare l'obiettivo X cioè il concatenamento all'indietro). o basato su una serie di fatti (ad esempio concatenamento in avanti). –

+0

@Phillipe - d'accordo, una rete neurale non affronta il problema che hai descritto. Potrei aver espresso male la mia risposta; in breve, non conosco un framework esistente che faccia ciò che hai chiesto, ma in base alla mia esperienza, potresti facilmente mettere fuori gioco un motore di regole base ma flessibile in pochi giorni, anche in JS. Le campane/fischi/avvertimenti sono dove il tempo è perso (motivo per cui ho sottolineato le cose che avevo imparato che erano state delle insidie). Non so se scrivere da solo sia un'opzione o meno. –

1

Ho fatto un esempio HTML/JavaScript motore di regole per un prodotto configuratore. Il motore delle regole si basa su se poi dichiarazioni. Le istruzioni if ​​then verranno verificate con un array. Questo array è pieno di tutte le opzioni possibili ogni volta che viene modificata una opzione. Dai un'occhiata al mio blog per l'esempio. Link to my blog "Forward chaining javascript rule engine"

Penso che "obj [chiave] = val" sia la chiave per un motore di regole javascript. Jquery aiuta con la gestione di javascript.

11

Verificare il motore di regole nools implementato in puro JavaScript per node.js. Ha una sintassi piuttosto semplice per le definizioni delle regole.

+0

Come si può fare questo lavoro per IE 8-9? – niceman

+4

nools non è più gestito da C2FO, esperto dal loro repo github: 'C2FO non sta più mantenendo questo progetto. Si prega di utilizzare di conseguenza. Se vuoi aiutare a mantenere o prendere in consegna il progetto, faccelo sapere –

1

Si prega di controllare (JSL) https://www.npmjs.com/package/lib-jsl.

Dal documento di panoramica, JSL è una libreria di programmazione logica basata su JSON pensata per l'uso incorporato nei programmi JS. Utilizza JSON come sintassi e metodo I/O e fornisce callback nell'ambiente host per l'ottimizzazione delle prestazioni.

5

Reactor di regola (https://github.com/anywhichway/rule-reactor) è un motore di regole di business leggero, rapido ed espressivo, che sfrutta internamenti JavaScript, prodotti incrociati pigri e funzioni come oggetti anziché Rete. Può essere utilizzato nel browser o sul server.

Problemi correlati