2010-12-01 12 views
20

Necesito algunos consejos sobre el mejor enfoque para resolver este problema.Necesito un motor de reglas simple, creo?

Investigué 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 objetivo comercial. (Simplificado para la demostración)

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

necesito escribir un editor en una aplicación web que permitirá a reglas complejas para ser construidos en torno a estos campos. Necesito admitir lógica AND/OR compleja anidada. Solo necesito operadores básicos, y la regla debería simplemente evaluar a verdadero o falso. Si la regla se evalúa como verdadera o falsa, se producirá una acción, respectivamente.

Por ejemplo,

primerNombre contiene "valor" y (lastName es igual a "entrada" o departamento contiene "entrada")

lo que había pensado, tal vez yo 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 algún patrón de diseño específico que pueda investigar?

¿Cómo resolvería este problema? Una de las dudas sobre los motores de reglas es que tal vez son demasiado complejos para un simple problema.

+1

Ahh, necesito un lenguaje de expresión. Voy con http://mvel.codehaus.org/Home – Andy

+0

Hola, ¿has probado easyrules.org? Puede ayudarlo a implementar lo que está buscando. Espero que esto ayude. Saludos cordiales –

Respuesta

5

Esta no es una pregunta de sí o no, pero probablemente pueda compartir mis experiencias, y espero que ayude. He usado DROOLS con bastante éxito en algunos proyectos. Además de algunos casos (otro equipo tenía problemas con DROOLS bajo carga pesada), DROOLS es una biblioteca bastante útil.

I construyó una aplicación que:
1. leer la entrada de una fuente
2. eligió la siguiente acción en base a la entrada de un conjunto de operaciones disponibles

Tan trivial como parece, es necesario para ser muy flexible:
1. La entrada fue un conjunto variable de pares nombre-valor, nombres no predeterminados.
2. valores, presencia/ausencia de ciertos nombre/valores (basados ​​en la ocurrencia/ausencia de eventos), desencadenan diferentes acciones.
3. Las reglas de negocio pueden cambiar mientras se ejecuta la aplicación.

Quizás haya mejores soluciones, pero para bien o para mal, terminé usando DROOLS. Desarrollé un BPEL en el cual 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 de dominio 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 interfaz de usuario enriquecida) que ayudaría a los expertos de su dominio/tema a crear reglas y almacenarlas en una base de datos.

0

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

+0

Estoy un poco confundido con lo que quiere decir serializando el objeto. El front end web simplemente construirá la regla basada en los campos. Aplicaré las reglas en el back-end contra todos los objetos "Persona" en mi base de datos. – Andy

+0

La pregunta obviamente no es sobre el análisis del objeto, sino sobre el mejor enfoque para aplicar reglas sobre estos objetos. – rds

+0

Cuando dijo "Pensé, tal vez debería escribir mi propio analizador y evaluar la lógica en mi propio código". , Pensé que estaba preguntando la mejor manera de aplicar las reglas sobre un objeto que se construiría en el front-end utilizando la entrada del usuario. No entendió que quería establecer las reglas en el frente. –

0

Me gustaría echar un vistazo a 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 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.

0

Probablemente no. Necesitas un modelo de dominio decente No es uno donde sus objetos son solo marcadores de posición de datos. ¿Es probable que sus usuarios sean capaces de entender y usar un sistema de reglas tan complejo, y no preferirían simplemente programar en Java, donde tienen encapsulado y soporte de refactorización adecuados? Los sistemas de reglas solo funcionan con reglas simples en un dominio restringido, donde se 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 la programación, por lo que todavía necesita control de versiones, pruebas y no desea valores globales.

+0

@Stephen No estoy seguro Estoy de acuerdo con la declaración "Los sistemas de reglas solo funcionan con reglas simples en un dominio restringido, donde se puede explicar a las personas no formadas como programadores cómo construirlos" También son buenos para reglas complejas donde el algoritmo no es fácil definido. Utilicé un motor de reglas de manera efectiva para abordar un problema de aprovisionamiento de red que ninguno de los expertos pudo explicar de manera efectiva (excepto, por supuesto, su propia parte). – Bill

+0

Tengo que estar en desacuerdo allí. No son buenos para reglas complejas. La falta de visibilidad, la refactorización, la modularización, la velocidad y la flexibilidad son los problemas más comunes que he encontrado. Para aquellos que realmente prefiero algo así como un sistema Smalltalk, donde simplemente puede crear DSL y crear modelos potentes. –

1

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

A partir de los documentos ...

La respuesta más corta a esto es "cuando no existe un enfoque satisfactorio tradicional de programación para resolver el problema .". Dada esa respuesta corta, , se requiere más explicación.La razón por qué no hay "tradicional" enfoque es posiblemente uno de los siguiente:

- El problema es demasiado violín por código tradicional.

El problema puede no ser complejo, pero no se puede ver una forma no frágil de creando una solución para ello.

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

Es un problema complejo de resolver, no hay obvias tradicionales soluciones, o básicamente el problema no se entiende completamente.

- Los cambios de la lógica a menudo

La lógica misma, incluso puede ser simple pero las reglas cambiar con bastante frecuencia. En muchas versiones de software de las organizaciones son pocas y las reglas conectables pueden ayudar a proporcionar la "agilidad" necesaria y esperada en una forma razonablemente segura .

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

Los expertos en dominios a menudo poseen una riqueza de conocimientos sobre reglas de negocio y procesos . Generalmente son no 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 pensar lógicamente. Muchas personas en posiciones no técnicas no tienen formación en lógica formal, así que tenga cuidado y trabajar con ellos, como mediante la codificación de conocimiento del negocio en reglas, a menudo exponer agujeros en la forma en que las reglas de negocio y procesos son actualmente entendido.

Cuando no usar ...

Como motores de reglas son dinámicos ( dinámico en el sentido de que las reglas pueden ser guarda y gestiona y actualiza los datos ), a menudo se veían como una solución al problema de implementar el software . (Departamentos más lo parecen existen con el propósito de prevenir el software está desplegando.) Si esto es la razón por la que desea utilizar un motor de reglas , tenga en cuenta que los motores de reglas funcionan mejor cuando son capaces de escribir reglas declarativas. Como alternativa, puede considerar los diseños impulsados ​​por datos (tablas de búsqueda), o los motores de procesamiento de scripts donde los scripts se administran en una base de datos y pueden ser actualizados sobre la marcha.

+0

Leo esto. Vamos a tener "Expertos de dominio" para construir las reglas, pero no hay forma de que consideren la posibilidad de escribir reglas de Drools en el editor de Drools. Estas personas quieren un buen editor que prácticamente lo haga por ellos, y que esté diseñado específicamente para el dominio del problema. No me gusta la idea de escribir mi propio código que escribe reglas de drools, y me gusta escribir reglas de drools. :) – Andy

+0

No es necesario que los no programadores escriban reglas. Esa es una razón para tener un motor de reglas, pero está perfectamente bien que un programador escriba las reglas. Sin embargo, una mirada rápida a lo que ha dado apunta más a una solución no basada en reglas. Un analizador parece más simple, los motores de reglas no son triviales para configurar. – Bill

+0

Pero tenga en cuenta que aportar más agilidad a la organización es mucho más probable que arroje buenos resultados que impulsar un motor de reglas porque la organización de TI publica trimestralmente. No es difícil crear una organización que publique dos veces al mes. Y una vez que le permite a los programadores construir las reglas, efectivamente ha creado dos problemas de uno. –

-2

¿Has probado JBehave?

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

+0

No, lo buscaré en google. Gracias – Andy

+0

¿Cómo se supone que un marco de prueba ayuda a implementar las reglas comerciales? ¿Quiere decir que puede arrancar el motor de definición de prueba y reutilizarlo para implementar las reglas? – flup

+0

No estoy seguro de que esta respuesta sea para la pregunta anterior – Manu

0

Would not Jython ser útil?

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 alrededor de él y luego lo ejecuta.

También puede poner cualquier objeto/variable de Java propio en el contexto de jython para ser utilizado en el script/cuerpo de la función.

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

Cuestiones relacionadas