¿Cómo funciona un sistema de reglas como el usado en Outlook Express funciona en la teoría? Como no podía ser hecho?

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

  •  19-09-2019
  •  | 
  •  

Pregunta

Tengo curiosidad acerca de esto:

En Microsoft de Outlook Express (o Outlook, no recuerdo bien, soy un usuario de Mac), tienen algo realmente bueno. reglas genéricas:

Se puede configurar un conjunto de reglas para ordenar automáticamente o eliminar mensajes de correo electrónico, por ejemplo. Es increíble potente y fácil de usar.

Estas reglas se veía más o menos así:

"Si el correo electrónico en la bandeja de entrada tiene objeto que contiene 'foo', o 'bar', o 'parametro' eliminarla"

Tengo que codificar algo similar para un potente sistema de validación de formularios. El desarrollador debe simplemente ser capaz de crear reglas de esta manera:

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]

Bueno, tengo algunas ideas de cómo esto se podría hacer, y voy a publicar aquí como respuesta. Pero antes de que reinventar la rueda: ¿Hay conceptos escritos que puedo usar como base para desarrollar un sistema de validación basado en reglas similares a esto? O si no, ¿tiene alguna sugerencia de cómo esto se podría hacer?

En el ejemplo anterior, todo en corchetes es el nombre de un elemento de formulario HTML. Todo en apóstrofes '' es un valor "codificado" con el que comparar.

Las reglas definidas se traducen en código PHP y el código JavaScript para hacer las dos cosas la validación del lado del cliente y el servidor.

Características esto debe ser capaz de:

  • Las reglas condicionales: Algo A depende de algo B
  • comparaciones de valor: Para enteros, flotadores, cuerdas
  • Habilitar alguna lógica de control forma, así, como en el "[género] is_equal_with 'hembra'" ejemplo anterior.

¿Cómo puede hacerse esto? ¿Cuáles son las entidades que deben tener en cuenta, desde un punto de vista científico?

Creo que el concepto teórico de esto es independiente de la plataforma. Aunque voy a implementar esto en PHP y JavaScript, no hay razón para que un dev C ++ no debe responder ;-) (Soy un tipo de Objective-C, por cierto)

¿Fue útil?

Solución

Es posible que desee echa un vistazo a algunos de los motores de reglas de código abierto; o incluso un pagado por uno.

Los ejemplos incluyen
Pagar por ello:
InRule , Las reglas de negocio del motor , ASA motor de reglas de negocios

Opensource:
OpenRules , Drools

Hay muchos más. Incluyendo algunas de ellas construidas en Java (Java API del motor de reglas (JSR94)), y .Net (Windows Workflow Foundation Reglas del motor).

No está seguro acerca de PHP recta sin embargo.

Como nota al margen, he usado un par de motores, como Reglas Haley (antes de que se fueron comprados por Oracle) para conducir interfaz de usuario web de. Tenga en cuenta que la velocidad de ejecución es absolutamente crítico. Tuvimos procesamiento Haley alrededor de 2000 por las reglas de carga de página (aplicación de la hipoteca), y que se estaba ejecutando en menos de 40 ms (no es un error tipográfico). Lo usamos para decidir qué campos estaban en la página, así como determinar si los datos introducidos era consistente, cumplió con los estándares legales, e incluso si se ha introducido correctamente.

Algunos de los otros motores eran mucho más lento incluso en mucho menor conjuntos de reglas debido al tiempo que tomó simplemente una instancia de los motores.

También he ido por el camino de escribir mi propia para sistemas más pequeños. En mi caso he utilizado javascript y simplemente configurar las variables con los datos de la página publicado antes de ejecutar los scripts que se guardaron con las formas.

Esto también fue performant en una escala más pequeña, pero limitado a solamente dando sencilla Go go / no respuestas.

Otros consejos

En un pequeño número de reglas y mensajes se puede aplicar un algoritmo de fuerza bruta: tomar cada regla y cada mensaje y comparar si encajan. Se llega a un O (r m ) la complejidad, donde r es el número de reglas y M es el número de mensaje, no tomando en consideración que una regla puede tener varias condiciones.

Para un gran número de reglas o mensajes que se pueden implementar una red Rete ( http: // en. wikipedia.org/wiki/Rete_algorithm ). Esto toma algo de memoria, pero es mucho más rápido en la práctica. Dependiendo de la forma de diseñar sus reglas obtendrá diferentes complejidades.

El primer enfoque es simple y no creo que necesito explicarlo. Sin embargo, si necesita ayuda, hágamelo saber y voy a detallar esa idea. Voy a explicar el segundo enfoque:

Leer un poco sobre el algoritmo Rete antes de seguir adelante.

En la parte de la red alfa Rete va a almacenar distintas condiciones que aparecen en las reglas. Algunas reglas podrían compartir algunas condiciones. Como:

Regla 1 : SI (message.date es igual a 24.10.2009) Y (message.title contiene "Hola") y luego hacer something1

Regla2 : SI (message.hasAttachement es TRUE) Y (message.date es igual a 24.10.2009) y luego hacer something2

Así que la parte de la red de Alfa tendrá 3 elementos

  • C1: (message.date es igual a 24.10.2009)
  • C2: (message.title contiene "Hola")
  • C3: (message.hasAttachement es TRUE)

En la red Beta tendrá dos se unen nodos que unen C1-C2 y C3-C1.

Los nodos de producción que terminan la red beta contendrán la serie de acciones que deben realizarse cuando un mensaje satisface todas las condiciones de la regla (en la parte alfa) y todas las comprobaciones de coherencia (en la parte beta).

La parte más complicada es la red beta. Si sólo desea la lógica AND en las reglas (no hay otra op lógica o paréntesis), entonces es trivial. Sin embargo, si desea construcciones más complicadas, entonces tendrá que escribir mucho código y hacer un montón de pruebas.

Para obtener más información sobre Rete:

  • coincidencia de producción para grandes sistemas de aprendizaje / - Robert B. Doorenbos. (1995)
  • En la aplicación eficiente de sistemas de producción / - Charles L. Forgy (1979)

En un diseño orientado a objetos, un enfoque sea para implementar el patrón de comandos o, para las necesidades más complejas, el patrón intérprete. Por lo general, crearía varias clases para diferentes categorías de normas, y se puede componerlos para los escenarios más complejos (mediante la construcción de CompositeRule, por ejemplo); todos ellos soportan una interfaz como Ejecutar () o Ejecutar (contexto).

A construir una cola de instancias de reglas, y llama a Ejecutar (contexto) en cada uno de ellos para cada objeto actuó sucesivamente. El contexto habría que contiene una instancia del objeto (mensajes, o forma, o lo que sea) que están actuando sobre.

Cadena las reglas en una cadena de responsabilidad .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top