veureka s.a. de c.v gabriel andrade...

93
Reglas de Negocio con Drools BRMS Gabriel Andrade Aguilar Veureka S.A. de C.V

Upload: nguyentuyen

Post on 04-Nov-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

Reglas de Negocio con Drools BRMS

Gabriel Andrade AguilarVeureka S.A. de C.V

Software utilizado● Sistema operativo: Linux● Java JDK 1.5 o superior● Drools Distribution 6.0● Eclipse 3.7 o superior● Eclipse Drools Plugin● Software de hojas de cálculo

¿Qué son las reglas de negocio?● Reglas que definen el comportamiento de

una organización o negocio● Definidas en el lenguaje de la organización● Definidas por personal de negocios

¿Qué son las reglas de negocio?● Cuando se codifican en aplicaciones, se

conocen como la Lógica de Negocio● Se encuentran como parte del código

fuente o en bases de datos.● No es fácil que el personal de negocio

pueda modificarlas o entenderlas una vez implementadas en los sistemas

¿Qué son las reglas de negocio?● Hoy en día, existe toda una rama de

estudio.● Sus características se han

"Estandarizado" en The Business Rules Manifesto

¿Qué son las reglas de negocio?● Las reglas de negocio son una forma de

Representación del Conocimiento (Knowledge Representation and Reasoning). Un área de inteligencia artificial.

● Si, podría hacerse un sistema experto usando reglas

¿Qué son las reglas de negocio?Las reglas de negocio suelen expresarse

como enunciados:• CUANDO

– se cumplan ciertas condiciones• ENTONCES

– realizar ciertas acciones

¿Qué son las reglas de negocio?● Los sistemas especializados en manejar

las reglas se denominan BRMS (Business Rules Management Systemo Crear reglas (Authoring)o Desplegarlas (Deploy)o Almacenar reglas (Repository)o Modificar y monitorear reglas

Reglas de negocio con Drools● Proyecto comunitario de JBoss● Soporte comercial de Red Hat● Open Source y Free Software (Licencia Apache 2.0)● Multiplataforma (Java)● Fácil integración con otras tecnologías abiertas

Reglas de negocio con DroolsMétodos para crear reglas● Reglas en formato DRL ● Tablas de decisión (XLS)● Lenguaje natural (Con DSL)

Ejemplo 1: Hello World● Crear nuevo

proyecto desde Eclipseo New Drools Project

● Drools Runtime 6

● Crear nuevo proyecto desde Eclipseo New Drools Project

● Drools Runtime 6

Ejemplo 1: Hello World● groupId=drools● artifactId=drools● version=1

Contenido no relevante para este tallerConvención Maven

● groupId=drools● artifactId=drools● version=1

Contenido indiferenteConvención maven

Sample.drl

Message().- La regla se activa si hay un objeto Message en la memoria de Drools

status ==.-Los objetos deben cumplir esta condiciónmymessage:.- Asignamos el campo message del objeto a una variable

temporal de DroolsDe igual forma, asignamos nuestro objeto Message a una variable temporal m.

Esto permite usar los objetos temporales en las consecuencias de la regla o en otras condiciones

Sample.drl

Consecuencias.- Codigo Javaupdate.- Función de Drools para volver a evaluar el objeto

en las reglasend.- Fin de declaración de la regla

Traducción a idioma humanoCuando:● Tengamos un objeto tipo Message en la

memoria● Con un status de tipo Hello● Copiar el mensaje en la variable

mymessage● Copiar el objeto en la variable m

Traducción a idioma humanoEntonces:● Mostrar el mensaje almacenado en

mymessage● Cambiar el texto del mensaje a "Goodbye

cruel world"● Cambiar el status del mensaje a Goodbye● Notificar a Drools que el objeto ha cambiado

Traducción a idioma humano• Por default, una regla sólo puede

activarse una vez para un mismo objeto en Drools.

• Con la instrucción modify, le decimos a Drools que vuelva a evaluar ese objeto

Archivos fuente● El proyecto sigue una

estructura de archivos Maven.● Drools carga los archivos de

reglas que estén en las rutas por defecto

● El archivo META-INF/kmodule.xml debe existir en la carpeta resources para que Drools detecte el proyecto

● El proyecto sigue una estructura de archivos Maven.

● Drools carga los archivos de reglas que estén en las rutas por defecto

● El archivo META-INF/kmodule.xml debe existir en la carpeta resources para que Drools detecte el proyecto

kmodule.xml

ksession.- Se usa para cargar las reglas desde Java

Objeto Message• Los objetos usados en

Drools deben ser clases Java POJOs (Simple Plain Java Object)

• No olvidar métodos set y get.

DroolsTest.java

DroolsTest.java● Líneas 15-17: Cargar servicio y sesión de

reglas. ● Línea 20-23: Crear un objeto e insertarlo

en la memoria de reglas de Drools● Línea 24: Disparar las reglas.

DroolsTest.java• Las reglas verifican si algún objeto en la

memoria cumple las condiciones de alguna regla

• Si esto ocurre, ejecuta la regla indicada para el objeto

• Puede ser que una regla se active una vez, muchas veces o ninguna

¿Qué hicimos?Las reglas utilizadas son las siguientes:● CUANDO tengamos un mensaje de saludo,

ENTONCES imprimir un saludo y cambiarlo a mensaje de despedida con un texto de despedida

● CUANDO tengamos un mensaje de despedida, ENTONCES mostrar el texto de despedida

RecordatorioEl procedimiento de desarrollo es a la

inversa:● Primero se identifican las reglas.● Después se implementan, en este caso en

un archivo DRL.● Normalmente, las reglas ya existen en las

organizaciones.

Formato de las reglas en DroolsDrools utiliza un formato llamado DRL

(Drools Rule Language).Las reglas tienen la siguiente estructura

Formato de las reglas en Drools● Rule: Indica el inicio de una nueva regla.● When: Condiciones de la regla● Then: Consecuencias o acciones de la regla● End: Terminar declaración de la regla

● Las reglas deben incluir imports de las clases utilizadas.

CondicionesPara agregar condiciones adicionales sobre los atributos

del objeto, incluirlos dentro del paréntesis● Message( message == "hola")Notar que no usamos getMessage(), Drools puede usar el

nombre del campo si existe un método get.Si se tienen muchas condiciones, separarlas con comas

CondicionesBinding● Podemos "asignar" un objeto o atributo a una variable de

Drools● Nos permite reutilizar ese valor posteriormente● Se usa ":" para hacer el bind.

ConsecuenciasSe ejecutan con código en JavaFunciones auxiliares de Drools● modify● update● insert● etc...

Ejemplo 2: Politicos Honestos• Este ejemplo muestra que las reglas

pueden insertar nuevos Facts.• InsertLogical significa que si el Fact que

causó una inserción cambia su valor de verdad, se debe retirar el Fact que insertó.

Ejemplo 2: Politicos Honestos• Creamos un Proyecto Nuevo en Ecilpse

(Drools Project)• Sugerencia de uso:

Ejemplo 2: Politicos Honestos

• A partir del proyecto generado creamos nuestros archivos

Ejemplo 2: Politicos Honestos• Crear las clases y las reglas necesarias• Modificar el archivo kmodule.xml para

usar nuestras reglas

Ejemplo 2: Politicos Honestos• CUANDO haya políticos honestos.

– ENTONCES habrá esperanza• CUANDO haya esperanza

– ENTONCES celebremos la democracia• CUANDO haya un político honesto

– ENTONCES habrá una corporación lista para corromperlo

• CUANDO no haya esperanza– ENTONCES preocuparse por la democracia

Ejemplo 2: Politicos Honestos• Usamos dos tipos de facts:

– Hope– Politician

Ejemplo 2: Politicos Honestos• exists: La regla se ejecuta una vez aunque

exista uno o muchos objetos que cumplen la regla

• insertLogical: Inserta un nuevo objeto, pero se elimina si la condicion de la regla llega a cambiar

Ejemplo 2: Politicos Honestos

Ejemplo 2: Politicos Honestos• Not: La regla se ejecuta si NO existe

ningún objeto del tipo indicado en la memoria de Drools

• modify: Permite modificar varios campos de un objeto a la vez

Ejemplo 2: Politicos Honestos• Consideraciones:

– En las condiciones de las reglas siempre se tiene que tomar en cuenta condiciones para diferenciar objetos, similar a cross products en SQL

Ejemplo 2: Politicos Honestos• kmodule.xml

– packages.- Nombre de las carpetas con reglas– ksession name.- Se usa para cargar desde Java

Ejemplo 2: Politicos Honestos• Archivo .java

Ejemplo 3: Calcular FibonacciEl cálculo de Fibonacci expresado como

reglas es:● SI el número es 1, ENTONCES su Fibonacci es 1● SI el número es 2, ENTONCES su Fibonacci es 1● Si el número n es mayor a 1, ENTONCES su Fibonacci

es F(n) + F(n -1)Se necesitan tener todos los Fibonaccis anteriores para

calcular el Fibonacci de n

Ejemplo 3: Calcular FibonacciCálculo RecursivoLas reglas deben considerar si ya se calculó el Fibonacci

de un número.Si no se ha calculado aún, su Fibonacci es -1

Ejemplo 3: Calcular Fibonacci

Si el número es 1 o 2, y si aún no se calcula su Fib

Entonces, el Fib es 1.

Ejemplo 3: Calcular Fibonacci

• Si se tiene un número n al que aún no se calcula su Fib, y aún NO tenemos el Fib de 1

• Entonces, insertar el Fib de n-1 para su cálculo.

Ejemplo 3: Calcular Fibonacci• Si tenemos el Fib de s1 y s2 (s2 == s1 +1), y no

hemos calculado el de s3 ( s3 == s2 + 1)• Entonces, calcular el Fib de s3 usando Fib de s1

y s2

Ejemplo 3: Calcular FibonacciNotar que "enlazamos" los valores a s1, s2 y

s3 para reutilizarlos en la regla.¿Cómo se activarán las reglas al solicitar el

Fibonacci de un número n, que tal 10?

Ejemplo 3: Calcular FibonacciCreamos el proyecto

desde Eclipse .Creamos el proyecto

desde Eclipse .

Ejemplo 3: Calcular FibonacciClase Fibonacci:● Sequence: Número al

que se le calcula Fib● Value: Valor de su FibInicializar value siempre en

-1 cuando aún no se calcula

No olvidar get y set

Clase Fibonacci:● Sequence: Número al

que se le calcula Fib● Value: Valor de su FibInicializar value siempre en

-1 cuando aún no se calcula

No olvidar get y set

Ejemplo 3: Calcular FibonacciCódigo para ejecutar las reglas

Ejemplo 3: Calcular Fibonacci

y así sucesivamente...

Diferencias entre reglas y métodos● Los métodos deben llamarse directamente● Se deben enviar instancias específicas a

los métodos● Una llamada a un método implica una

ejecución

Diferencias entre reglas y métodos● Las reglas se ejecutan contra cualquier dato que

esté presente en la memoria de Drools● Las reglas nunca son llamadas directamente● No es necesario pasar un objeto específico a las

reglas● Dependiendo los objetos, una regla puede

activarse una vez, muchas veces o ninguna

Ejercicios1. Crear ejemplo Hello World desde cero.2. Modificar Fibonacci para calcular

Factorial.

Ejemplo 4: Calcular descuentos de compras

● Tenemos registros de pedidos de tacos:● Nombre del cliente● Monto de compra● Número de tacos pedidos● Información sobre si pidió bebida o no

● Calcular si su compra merece un descuento

Ejemplo 4: Calcular descuentos de compras

● Si la compra es de menos de 15 pesos, no aplica descuento

● Si la compra es de entre 15 y 15, aplica 10% de descuento

● Si la compra es de más de 25, aplica 15% de descuento

● Si compró más de 2 tacos e incluyó bebida, otorgar un 5% de descuento adicional

Ejemplo 4: Calcular descuentos de compras

● Con las siguientes compras:● John, 1 taco, 18 pesos, no bebida● Gabriel, 4 tacos, 40 pesos, no bebida● Carlos, 2 tacos, 25 pesos, bebida● Ana, 3 tacos, 30 pesos, bebida● Silvia, 1 taco, 14 pesos, no bebida

● ¿Qué descuentos aplicarían?

Ejemplo 4: Calcular descuentos de compras

¡¡Manos a la obra!!

Facilitando las reglas● Las reglas con Drools siguen siendo

difíciles de entender● Se requiere aprender un nuevo lenguaje● ¿Y si tu jefe necesita modificar o crear las

reglas?

Conociendo al DSL● Otro nombre exótico.● Acrónimo para Domain Specific Language● Suficiente teoría por el momento

Conociendo al DSL● Gracias al DSL podemos pasar de reglas

en lenguaje natural a reglas Drools.● Se usa un archivo "intermediario" de

mapeo.

Conociendo al DSL

● Archivo de texto con extensión DSL● Plantilla para mapear a Drools

Conociendo al DSL● Las reglas se crean en un archivo dslr● "Expander" le indica a Drools el archivo DSL a

usar para el mapeo

Conociendo al DSL● El archivo Java para ejecutar el proyecto

se modifica muy poco● El proyecto de "Tacos" usando DSL

quedaría:

Tablas de decisión● Es un formato familiar para el personal de

negocio● Reglas que pueden expresarse como una

misma plantilla con distintos valores● Formato xls o csv● Pueden crearse y modificarse con Excel,

Openoffice, etc...

Ejemplo 5: Hello World con Tablas● Tablas soportadas: XLS, CSV● Crear proyecto Drools desde Eclipse● Agregar opciones de DecisionTables● Se pueden usar opciones de formateo

para facilitar la visualización

Ejemplo 5: Hello World con Tablas

Ejemplo 5: Hello World con Tablas● RuleSet: Indica a Drools donde empezar a

analizar la tabla, nombre de paquete opcional

● Imports separados por comas● Notes, Opcional, comentarios

Ejemplo 5: Hello World con Tablas● RuleTable: Empezar a leer las reglas● Condition, Action: Especificar el tipo de

columna● Indicar objeto sobre el que actuará la

columna● Operación a realizar, con $param o $1, $2

se usan valores de los renglones

Tablas de decisión● Siguiente renglón, opcional, útil para

documentar● Siguiente renglón, empiezan los valores● Si una celda está vacía, no se considera

en la regla

Tablas de decisión● Cada renglón es una regla.● Cada columna es una condición o acción.● Útil cuando hay muchas reglas donde solo

cambian los valores de comparación● Internamente, Drools convierte cada una

al formato DRL

Tablas de decisión

Ejemplo 5: Hello World con Tablas

● ¿Qué dicen las reglas?

Ejemplo 5: Hello World con Tablas● ¡¡¡ CUIDADO !!!● Con las comillas, son causa de errores

extraños

Ejemplo 6: Seguros● Se tienen un conjunto de reglas para

decidir que tipo de seguro es aplicable a un solicitante.

● Se consideran 4 factores● Edad del solicitante● Perfil de riesgo de su ubicación● Solicitudes previas● Tipo de seguro solicitado

Ejemplo 6: Seguros● Las reglas son:

● Si tiene entre 18 y 24 años, esta en perfil de bajo riesgo, a hecho una solicitud previa, y envia una solicitud de tipo comprehensiva

● ENTONCES la cuota base del seguro es de $450

● Si tiene entre 18 y 24 años, esta en perfil de riesgo medio, no ha hecho solicituded previas, y envia una solicitud de tipo fuego o robo

● ENTONCES la cuota base del seguro es de $200, porque los antecedentes no son relevantes

● Si tiene entre 18 y 24 años, esta en perfil de riesgo medio, no ha hecho solicituded previas, y envia una solicitud de tipo comprehensiva

● ENTONCES la cuota base del seguro es de $300

● Y asi con muchas reglas!!!

Ejemplo 6: Seguros● Dependiendo el caso, se establece la

cuota del seguro y una posible razón● Opcionalmente se dan descuentos por

buenos conductores

Lo que no se vió● Diferencia entre sesiones de Drools

(Stateless vs Stateful)● Funciones adicionales en las condiciones● Modificadores en las reglas● Diferencia entre "dialectos" mvel y java en

las reglas● Reglas en Excel con DSL

Lo que no se vió● Drools Workbench.- Aplicación web para

crear y administrar reglas● Base de Red Hat JBoss BRMS

Lo que no se vió●

Lo que no se vió● Drools Server.- Interfaz para ejecutar las

reglas de manera remota, a través de servicios REST y XML

Integración con otras herramientas● Jbpm y Activiti

Integración con otras herramientas● Optaplanner

Herramientas Similares● DecisionLogic:

Reglas en formato de tablas de decisión, ejecutables desde Python, C# o Javascript

Herramientas Similares● LogicGem:

Reglas en formato de tablas de decisión

● Generación de código a partir de las tablas

Herramientas Similares● IBM BRMS● Oracle Business Rules● Fico Blaze Advisor BRMS● Pegasystems Business Rules● Bosch Business Rules Management● Corticon Business Rules

Todas de pago

Otras herramientas Open Source de interés

● Apache Maven ● Apache Tomcat ● Eclipse + Drools Plugin ● Optaplanner ● Jackson ● XStream ● Jersey

Apuntes finales• Reglas de Negocio es un área de estudio

muy difundida y con mucho interés en la industria

Apuntes finales• Las reglas siguen un proceso de desarrollo

al igual que el software

Apuntes finales• Son útiles para separar la lógica de negocio

de los sistemas.• Permiten que las reglas sean manejadas por

los encargados de crearlas• Trabajar con herramientas como Drools

requiere cambiar un poco la forma de pensar respecto a las aplicaciones

Reglas de Negocio con Drools BRMS

Gabriel Andrade [email protected]