rulebook libreria example engine easy business java business-logic rules rule-engine

libreria - rulebook java



Necesito un motor de reglas simple, creo? (7)

¿Has probado JBehave ?

JBehave es un marco para el desarrollo guiado por el comportamiento (BDD). BDD es una evolución del desarrollo impulsado por pruebas (TDD) y el diseño impulsado por pruebas de aceptación, y su objetivo es hacer que estas prácticas sean más accesibles e intuitivas para los recién llegados y expertos por igual. Cambia el vocabulario de ser basado en pruebas a basado en el comportamiento, y se posiciona a sí mismo como una filosofía de diseño.

Necesito un consejo sobre el mejor enfoque para resolver este problema.

He investigado DROOLS, Java Rule Engine y algunos otros. Todos estos son poderosos, y tienen cosas buenas sobre ellos. No sé cuál (si alguna) será la mejor opción para mí.

Tengo un objeto de negocio. (simplificado para demostración)

Person firstName:String lastName:String departMent:String hireDate:Date

Necesito escribir un editor en una aplicación web que permita la creación de reglas complejas en torno a estos campos. Necesito soportar la lógica Y / O anidada compleja. Solo necesito operadores básicos, y la regla debería evaluar simplemente como verdadero o falso. Si la regla se evalúa como verdadera o falsa, se producirá una acción, respectivamente.

Por ejemplo,

el primer nombre CONTIENE el "valor" AND (el último nombre es IGUAL "entrada" O el departamento CONTIENE la "entrada")

Pensé, tal vez debería escribir mi propio analizador y evaluar la lógica en mi propio código. No sé qué hacer, cualquier consejo o enlace a algo para leer sería muy apreciado. ¿Hay un patrón de diseño específico que podría investigar?

Como resolverías este problema? Una de las reservas acerca de los motores de reglas es que quizás sean demasiado complejas para un simple problema.


¿No sería útil Jython?

Cada expresión / regla compleja podría ser el cuerpo de una función. De modo que el usuario proporciona el cuerpo y su código coloca la especificación de la función a su alrededor y luego lo ejecuta.

También puede colocar cualquier objeto / variable de Java de su propiedad en el contexto jython que se usará en el cuerpo de su script / función.

Entonces tiene un lenguaje estandarizado, extensible y ampliamente utilizado a su alcance. Pero creo que el editor de Jython podría ser un desafío.


Esta no es una pregunta de sí / no, pero probablemente pueda compartir mis experiencias y espero que ayude. He utilizado DROOLS con bastante éxito en algunos proyectos. Aparte de algunos casos (otro equipo tuvo problemas con DROOLS bajo una gran carga), DROOLS es una biblioteca bastante útil.

Construí una aplicación que:
1. leer la entrada de una fuente
2. eligió la siguiente acción basada en la entrada de un conjunto de operaciones disponibles

Por más trivial que parezca, tenía que ser muy flexible:
1. La entrada era un conjunto variable de pares nombre-valor, nombres no predeterminados.
2. Los valores, presencia / ausencia de cierto nombre / valores (según la ocurrencia / ausencia de eventos), desencadenan diferentes acciones.
3. Las reglas de negocios pueden cambiar mientras la aplicación se está ejecutando.

Quizás haya mejores soluciones, pero para bien o para mal, terminé usando DROOLS. Desarrollé un BPEL en el que las decisiones son tomadas por el componente DROOLS. El componente DROOLS lee internamente las reglas de toma de decisiones de una hoja de cálculo de Microsoft Excel. Reconstruye las reglas si hay un cambio en el archivo. Ahora los expertos en dominios cambian esta hoja de cálculo cuando es necesario, ¡y no pasamos por implementaciones dolorosas!

Si desea una interfaz de usuario sofisticada, DROOLS Guvnor es una aplicación web fácilmente disponible (con una interfaz de usuario enriquecida) que ayudaría a sus expertos en dominio / materia a crear reglas y almacenarlas en una base de datos.


La documentación de Drools habla sobre cuándo usar un motor de reglas. http://downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/html_single/index.html#d0e181

De los documentos ...

La respuesta más breve a esto es "cuando no hay un enfoque de programación tradicional satisfactorio para resolver el problema". Dada esa breve respuesta, se requiere más explicación. La razón por la que no existe un enfoque "tradicional" es posiblemente una de las siguientes:

- El problema es demasiado complicado para el código tradicional.

Puede que el problema no sea complejo, pero no puede ver una forma no frágil de crear una solución para él.

- El problema está más allá de cualquier solución algorítmica obvia.

Es un problema complejo de resolver, no hay soluciones tradicionales obvias o, básicamente, el problema no se comprende por completo.

- La lógica cambia a menudo.

La lógica en sí misma puede ser simple pero las reglas cambian con bastante frecuencia. En muchas organizaciones, las versiones de software son pocas y distantes entre sí y las reglas conectables pueden ayudar a proporcionar la "agilidad" que se necesita y espera de una manera razonablemente segura.

- Los expertos en dominios (o analistas de negocios) están disponibles, pero no son técnicos.

Los expertos en dominios a menudo poseen una gran cantidad de conocimientos sobre las reglas y los procesos comerciales. Normalmente no son técnicos, pero pueden ser muy lógicos. Las reglas pueden permitirles expresar la lógica en sus propios términos. Por supuesto, todavía tienen que pensar críticamente y ser capaces de un pensamiento lógico. Muchas personas en puestos no técnicos no tienen capacitación en lógica formal, así que tenga cuidado y trabaje con ellos, ya que al codificar el conocimiento del negocio en reglas, a menudo expondrá los agujeros en la forma en que se entienden actualmente las reglas y los procesos del negocio.

Cuando no usar ...

Como los motores de reglas son dinámicos (dinámicos en el sentido de que las reglas pueden almacenarse y administrarse y actualizarse como datos), a menudo se consideran una solución al problema de implementación de software. (La mayoría de los departamentos de TI parecen existir con el fin de evitar que el software se despliegue.) Si esta es la razón por la que desea utilizar un motor de reglas, tenga en cuenta que los motores de reglas funcionan mejor cuando puede escribir reglas declarativas. Como alternativa, puede considerar los diseños controlados por datos (tablas de búsqueda) o los motores de procesamiento de scripts donde los scripts se administran en una base de datos y se pueden actualizar sobre la marcha.


Me gustaría ver algunas interfaces de motor de reglas de muestra y ver cuáles me gustan. Puede consultar las interfaces de reglas de correo electrónico basadas en la web para obtener algunas ideas. Si realmente necesita un motor de reglas simple, solo necesita crear una buena interfaz, y luego puede enviar las reglas al servidor con javascript.


Probablemente no. Necesitas un modelo de dominio decente. No uno donde sus objetos son solo marcadores de posición de datos. ¿Es probable que sus usuarios puedan entender y usar un sistema de reglas tan complejo, y aquellos que realmente prefieren la programación en java, donde cuentan con el soporte adecuado de encapsulación y refactorización? Los sistemas de reglas solo funcionan con reglas simples en un dominio restringido, donde puede explicar a las personas que no están capacitadas como programadores cómo construirlas. Y no olvide que la creación de reglas es solo programación, por lo que aún necesita control de versiones, pruebas y no desea globales.


Yo sugeriría su propio analizador. En este contexto, ¿por qué no puede serializar el objeto y usar AJAX para validarlo en el back-end? Luego separa la lógica de validación de la interfaz de usuario.