tutorial - Motor de reglas ligeras en Javascript
javascript tutorial (6)
Estoy buscando sugerencias para un motor de reglas ligero implementado en Javascript.
La razón de tal implementación es construir una simulación basada en navegador muy ligera pero rápida utilizando un pequeño conjunto de reglas (menos de 20). La simulación tomaría media docena de parámetros y ejecutaría las reglas y mostraría los resultados en el navegador sin necesidad de volver al servidor. Piense en una interfaz de usuario con un par de botones de opción, casillas de verificación, cuadros de texto y controles deslizantes para controlar los parámetros. La simulación se volvería a ejecutar rápidamente en función de cualquier cambio de parámetro.
Este es un motor de reglas muy simple, que usa javascript del lado del servidor (el motor Rhino de Mozilla) (quizás sea útil para usted) http://jubyrajan.blogspot.com/2010/04/implementing-simple-deterministic-rule.html
He creado un ejemplo de motor de reglas html / javascript para un configurador de productos. El motor de reglas se basa en las declaraciones de if. Las declaraciones if entonces serán verificadas con una matriz. Esta matriz se llena con todas las opciones posibles cada vez que se cambia una opción. Echa un vistazo a mi blog para el ejemplo. Enlace a mi blog "Motor de reglas de javascript de encadenamiento hacia adelante"
Creo que "obj [key] = val" es la clave para un motor de reglas javascript. Jquery ayuda con el manejo de javascript.
He implementado una versión (más complicada) de lo que está describiendo en c #, y pensando en el código, todo sería posible con JavaScript. Estoy de acuerdo con los comentarios publicados de que escribir el tuyo es una opción viable. Puede ser tan simple o complejo como quieras que sea.
Observaciones generales para este tipo de motor de reglas (sin ningún orden en particular):
Las búsquedas no lineales son tus amigas. En JavaScript, esto sería fácil usando la sintaxis
obj[key] = val
. Una vez que determine la salida de una regla para un conjunto dado de parámetros, almacene en caché los resultados para que pueda usarla nuevamente sin volver a ejecutar la regla.Determine si necesita o no procesar combinaciones únicas de entradas. Por ejemplo, supongamos que permite que el usuario ingrese varios nombres y pida sugerencias sobre XYZ. En realidad, ahora necesita ejecutar todas las reglas contra cada valor de entrada. Esto puede ser irrelevante, simple o inmensamente complicado (imagine un sistema de reservaciones de hotel que toma múltiples fechas, horarios, ubicaciones y criterios, y hace sugerencias).
setTimeout () se puede usar para suavizar el comportamiento de la IU, pero las reglas que describe deben ejecutarse en unos pocos milisegundos o menos, por lo que debe preocuparse por el rendimiento en último lugar. El rendimiento es menos preocupante de lo que podría pensar con un motor de reglas básicas.
Las definiciones de reglas serán más fáciles de manipular si son objetos (o incluso árboles de objetos simples).
No ate los elementos de la interfaz de usuario a los resultados de salida; es decir, ponga los resultados de la ejecución de la regla en una lista de objetos flexible para que pueda crear cualquier salida visual que desee de ella.
Los mensajes de salida personalizados son muy útiles para un usuario. Lo que significa que, en lugar de desencadenar un mensaje genérico cuando se cumple una condición, intente insertar un valor real en el mensaje de salida, como "Su puntaje de crédito es solo 550. Necesita un mínimo de 600 para continuar".
Eso es todo lo que tengo en la cabeza. Buena suerte.
Por favor revise (JSL) https://www.npmjs.com/package/lib-jsl .
Desde el documento de descripción general, JSL es una biblioteca de programación lógica basada en JSON para uso integrado en programas JS. Utiliza JSON como su sintaxis, así como el método de E / S, y proporciona devoluciones de llamada en el entorno de host para la optimización del rendimiento.
Rule Reactor ( https://github.com/anywhichway/rule-reactor ) es un motor de reglas empresariales de cadena ligera, rápido y expresivo que aprovecha los elementos internos de JavaScript, productos cruzados diferidos y funciones como objetos en lugar de Rete. Se puede utilizar en el navegador o en el servidor.