Come fa un sistema di regole come quello utilizzato in Outlook Express funziona in teoria? Come potrebbe essere fatto?

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

  •  19-09-2019
  •  | 
  •  

Domanda

Sono curioso di sapere questo:

In Microsofts Outlook Express (o Outlook, non ricordo bene, io sono un utente Mac), hanno qualcosa di veramente cool. regole generiche:

È possibile configurare un insieme di regole per ordinare automaticamente o cancellare le e-mail, per esempio. E 'incredibile potente e facile da usare.

Queste regole sembravano più o meno in questo modo:

"Se email nella casella di posta ha oggetto che contiene 'foo', o 'bar', o 'foobar' eliminarlo"

Ho bisogno di codificare qualcosa di simile per un potente sistema di validazione dei form. Lo sviluppatore deve semplicemente essere in grado di creare regole in questo modo:

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]

Bene, ho alcune idee su come questo potrebbe essere fatto, e li posterò qui come risposta. Ma prima di reinventare la ruota: Ci sono dei concetti scritti che posso usare come basi per sviluppare un sistema di validazione basato su regole simile a questo? O se non, avete qualche suggerimento di come questo potrebbe essere fatto?

Nell'esempio precedente, tutto in parentesi quadre è il nome di un elemento form html. Tutto in apostrophs '' è un valore "hard coded" da confrontare.

Le regole definite sono tradotte in codice PHP e il codice JavaScript per fare sia la validazione lato client e server.

Caratteristiche questo deve essere in grado di:

  • regole condizionali: Qualcosa A dipende da qualcosa di B
  • il confronto di valore: Per gli interi, galleggianti, le stringhe
  • Abilita qualche logica di controllo forma e, come nel "[sesso] is_equal_with 'femminile'" esempio di cui sopra.

Come potrebbe questo essere fatto? Quali sono le entità devo considerare, da un punto di vista scientifico?

Credo che il concetto teorico di questo è indipendente dalla piattaforma. Anche se devo implementare questo in PHP e JavaScript, non c'è alcun motivo per cui uno sviluppatore C ++ non dovrebbe rispondere ;-) (Sono un ragazzo Objective-C, btw)

È stato utile?

Soluzione

Si potrebbe voler controllare alcuni dei motori di regole opensource; o anche un pagamento per uno.

Gli esempi includono
Pagare per questo:
InRule , business Rules Engine , ASA business Rules Engine

Opensource:
OpenRules , Drools

Ci sono molto di più. Compresi alcuni costruiti in Java (Java API motore regole (JSR94)), e .Net (Windows Workflow Foundation Rules Engine).

Non è sicuro su PHP dritto però.

Come nota a margine, ho usato un paio di motori, come Regole Haley (prima che sono stati acquistati da Oracle) per guidare web UI. Essere consapevoli del fatto che la velocità di esecuzione è assolutamente fondamentale. Abbiamo avuto l'elaborazione Haley circa 2000 norme per caricamento della pagina (mutuo app), e si stava eseguendo in meno di 40 ms (non è un refuso). Abbiamo usato per decidere quali campi erano sulla pagina e determinare se i dati inseriti è stato coerente, incontrato norme di legge, e anche se è stato inserito correttamente.

Alcuni degli altri motori erano molto molto più lento anche su molto più piccola regola imposta a causa di quanto tempo ha preso per istanziare semplicemente i motori.

Ho anche andato giù per il sentiero di scrivere il mio per i sistemi più piccoli. Nel mio caso ho usato javascript e semplicemente impostare variabili con i dati dalla pagina pubblicata prima di eseguire gli script che sono state salvate con le forme.

Questo è stato anche performante su una scala più piccola, ma ho limitato al solo dando semplice go / no go risposte.

Altri suggerimenti

Per un piccolo numero di regole e messaggi è possibile applicare un algoritmo di forza bruta: prendere ogni regola e ogni messaggio e confrontare se si adattano. Si arriva a un O (r m ) complessità dove r è il numero di regole e m è il numero di messaggio, non prendendo in considerazione che una norma può avere più condizioni.

Per un numero enorme di regole o messaggi che è possibile implementare una rete Rete ( http: // it. wikipedia.org/wiki/Rete_algorithm ). Questo richiede un po 'di memoria, ma è molto molto più veloce nella pratica. A seconda del modo di progettare le regole si ottengono diversi complessità.

Il primo approccio è semplice e non credo che ho bisogno di spiegarlo. Tuttavia, se hai bisogno di aiuto fammelo sapere e lo farò dettaglio che idea. Mi spiego il secondo approccio:

Per saperne un po 'di algoritmo rete prima di andare avanti.

Nella parte alpha della rete Rete si memorizzare condizioni distinte che appaiono nelle regole. Alcune regole potrebbero condividere alcune condizioni. Come:

Regola1 : IF (message.date uguale 24.10.2009) E (message.title contiene "ciao") poi fare something1

Regola2 : IF (message.hasAttachement è vero) e (message.date uguale 24.10.2009) poi fare something2

Così la parte Alpha della rete avrà 3 elementi

  • C1: (message.date uguale 24.10.2009)
  • C2: (message.title contiene "ciao")
  • C3: (message.hasAttachement è VERO)

Nella rete Beta si avrà due uniscono nodo che collega C1-C2 e C3-C1.

I nodi di produzione che finiscono nella rete beta conterrà la serie di azioni che devono essere eseguite quando un messaggio soddisfa tutte le condizioni della regola (nella parte alpha) e tutti i controlli di coerenza (nella parte Beta).

La parte più complicata è la rete di beta. Se si desidera solo la logica e nelle vostre regole (nessun altro op logico o parentesi) allora è banale. Tuttavia, se si desidera costrutti più complessi, allora dovrete scrivere un sacco di codice e fare un sacco di test.

Per ulteriori informazioni sulla Rete:

  • Produzione di corrispondenza per i grandi sistemi di apprendimento / - Robert B. Doorenbos. (1995)
  • Nella efficace attuazione di Sistemi di Produzione / - Charles L. Forgy (1979)

In un progetto orientato agli oggetti, un approccio sia per attuare il modello di comando o, per esigenze più complesse, il modello interprete. Faresti di solito creano diverse classi per le diverse categorie di regole, e li si può comporre per gli scenari più complessi (con la costruzione di CompositeRule, per esempio); tutti loro supportare un'interfaccia simile execute () o Execute (contesto).

Si crea una coda di istanze della regola, e si chiama Execute (contesto) su ciascuno di essi per ogni oggetto ha agito su. Il contesto sarebbe contenente un'istanza dell'oggetto (messaggio, o forma, o qualsiasi altra cosa) si agisce su.

a catena delle regole di una catena di responsabilità .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top