Comment un système de règles comme celui utilisé dans Outlook Express fonctionne en théorie? Comment pourrait-on le faire?

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

  •  19-09-2019
  •  | 
  •  

Question

Je suis curieux de savoir ceci:

, ils ont dans Microsofts Outlook Express (je suis un utilisateur Mac ou Outlook, ne me souviens pas bien,) quelque chose de vraiment cool. règles génériques:

Vous pouvez configurer un ensemble de règles pour trier ou supprimer automatiquement vos e-mails, par exemple. Il est incroyable puissant et facile à utiliser.

Ces règles avaient l'air à peu près comme ceci:

« Si courriel dans la boîte de réception est sujet contenant « foo », ou « bar », ou « foobar » supprimer »

Je dois coder quelque chose de similaire pour un système de validation de forme puissante. Le développeur doit simplement être en mesure de créer des règles comme ceci:

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]

Eh bien, j'ai quelques idées comment cela pourrait se faire, et je vais les poster ici réponse. Mais avant de réinventer la roue: Y a-t-il des concepts écrits que je peux utiliser comme base pour développer un système de validation fondé sur des règles similaires à cela? Ou sinon, avez-vous des suggestions comment cela pourrait se faire?

Dans l'exemple ci-dessus, tout en crochets est le nom d'un élément de formulaire HTML. Tout dans apostrophs « » est une valeur « codée en dur » à comparer.

Les règles définies sont traduites en code PHP et le code JavaScript pour faire les deux de validation côté client et serveur.

Caractéristiques cela doit être capable de:

  • Règles conditionnelles: A quelque chose dépend de quelque chose B
  • comparaisons de valeur: Pour les entiers, flottants, chaînes
  • Activer une logique de contrôle de la forme ainsi, comme dans le « [gender] is_equal_with « femme » » exemple ci-dessus.

Comment cela pourrait-il être fait? Quelles sont les entités que je dois examiner, d'un point de vue scientifique?

Je pense que le concept théorique de cette plate-forme est indépendante. Bien que je mettrai en œuvre ce en PHP et JavaScript, il n'y a aucune raison pour qu'un C ++ dev ne doit pas répondre ;-) (Je suis un gars Objective-C, BTW)

Était-ce utile?

La solution

Vous pouvez vérifier quelques-unes des règles opensource moteurs; ou même payé pour un.

Les exemples incluent
Payer pour cela:
InRule , Règles d'affaires moteur, ASA moteur de règles métier

Opensource:
OpenRules , Drools

Il y a beaucoup plus. Y compris certains ont été construits pour Java (Java API Règle Engine (JSR94)) et .Net (Windows Workflow Foundation Règles Engine).

Je ne sais pas à propos de PHP directement si.

Comme une note de côté, j'ai utilisé un moteur couple, comme règles Haley (avant ont été achetés par Oracle) pour conduire l'interface utilisateur Web de. Sachez que la vitesse d'exécution est absolument critique. Nous avons eu le traitement Haley environ 2000 règles par page charge (application hypothécaire), et il exécutait en moins de 40 ms (pas une faute de frappe). Nous l'avons utilisé pour décider quels champs étaient sur la page, ainsi que de déterminer si les données saisies était conforme, respecté les normes juridiques, et même si elle a été correctement saisi.

Certains des autres moteurs étaient beaucoup plus lent même beaucoup plus petit ensembles de règles en raison de combien de temps il a fallu pour instancier simplement les moteurs.

Je suis aussi allé sur le chemin de l'écriture de mon propre pour les petits systèmes. Dans mon cas, je javascript et les variables simplement mis en place avec les données de la page affichée avant d'exécuter les scripts qui ont été enregistrés avec les formes.

Ce fut aussi à une plus petite performante échelle, mais je me suis limité à seulement donner simplement go / no go réponses.

Autres conseils

Pour un petit nombre de règles et de messages que vous pouvez appliquer un algorithme de force brute: prendre chaque règle et chaque message et comparer si elles correspondent. Vous arriverez à un O (r m ) complexité où r est le nombre de règles et m est le nombre de message, ne pas prendre en considération le fait que la règle peut avoir plusieurs conditions.

Pour un grand nombre de règles ou de messages que vous pouvez mettre en œuvre un réseau Rete ( http: // fr. wikipedia.org/wiki/Rete_algorithm ). Cela prend un peu de mémoire, mais est beaucoup plus rapide dans la pratique. En fonction de la façon dont vous concevez vos règles, vous obtiendrez des complexités différentes.

La première approche est simple et je ne pense pas que je dois l'expliquer. Toutefois, si vous avez besoin d'aide me le faire savoir et je détaillerai cette idée. Permettez-moi d'expliquer la deuxième approche:

Lire un peu plus sur l'algorithme Rete avant d'aller plus loin.

Dans la partie alpha du réseau Rete vous stockerez conditions distinctes qui apparaissent dans vos règles. Certaines règles peuvent partager certaines conditions. Comme:

Règle1 : IF (message.date est égal 24.10.2009) ET (message.title contient "bonjour") faire alors something1

Règle2 : IF (message.hasAttachement est vrai) et (message.date est égal à 24.10.2009) faire alors something2

Ainsi, la partie Alpha du réseau aura 3 éléments

  • C1: (message.date est égal 24.10.2009)
  • C2: (message.title contient "bonjour")
  • C3: (message.hasAttachement est TRUE)

Dans le réseau de Beta, vous aurez deux noeud de jonction qui relient C1-C2 et C3-C1.

Les noeuds de production qui se terminent le réseau bêta contiendra la série d'actions qui doivent être effectuées lorsqu'un message satisfait à toutes les conditions de la règle (dans la partie alpha) et tous les contrôles de cohérence (dans la partie bêta).

La partie la plus complexe est le réseau bêta. Si vous voulez juste la logique et dans vos règles (pas d'autre op logique ou entre parenthèses) est alors trivial. Toutefois, si vous voulez des constructions plus complexes, vous devrez écrire beaucoup de code et faire beaucoup de tests.

Pour plus d'informations sur Rete:

  • correspondant de production pour les grands systèmes d'apprentissage / - Robert B. Doorenbos. (1995)
  • Sur la mise en œuvre efficace des systèmes de production / - Charles L. Forgy (1979)

Dans une conception orientée objet, une approche de mettre en œuvre le modèle de commande ou, pour les besoins plus complexes, le modèle d'interprétation. Typiquement, vous créez plusieurs classes pour différentes catégories de règles, et vous pouvez les composer pour des scénarios plus complexes (en construisant CompositeRule, par exemple); Tous supportent une interface comme execute () ou Exécuter (contexte).

Vous construisez une file d'attente des instances de règle, et appelez Execute (contexte) sur chacun d'eux pour chaque objet donné suite. Le contexte ne contenant une instance de l'objet (message, ou la forme, ou autre) vous agissez sur.

Chaîne des règles dans un chaîne de responsabilité .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top