Monday, October 19, 2009

ILog y OpenRules

Gracias a una pregunta del foro de la comunidad java México http://www.comunidadjava.org/, me pareció importante crear una entrada sobre ILog y OpenRules.

Para empezar con el pie derecho vamos a plantear algunas preguntas:: ¿Se va a poner de moda openRules y/o ILog? según yo Sí! . ¿La moda sera planteada como una panacea? Sí, y los vendedores tocaran tu puerta. ¿Todos debemos usar un motor de reglas de negocio? No, pero buena parte podria (mas no deberia). ¿Puedo entrarle a ILog/OpenRules? Sí, hay que trabajar duro en el diseño pero todos podemos.

¿Es muy caro? Depende, openRules es openSource y es relativamente barato, ILog puede llegar a ser muy caro dependiendo de los módulos que te interesen.

Primero hay que dejar claro que los motores de reglas de negocio ILog y OpenRules son muy distintos pero con una filosofía similar, OpenRules solo trabaja con "Tablas de decisión" y un conjunto reducido de opciones, mientras que ILog es mas completo. A pesar de esto OpenRules es una herramienta sencilla, practica y poderosa, para descargar en ella la responsabilidad de manejar nuestras reglas de negocio.

¿Como que puedo hacer con OpenRules? Tablas de decisión, déjame mostrarte como es esto.

Los pasos que vamos a seguir son:


  • Entender nuestra regla de negocio y expresarla como una tabla en Excel.

  • Reordenar nuestra regla de negocio como una serie de condiciones que nos llevan
    a una serie de acciones. Dentro del mismo Excel!.

  • Leer y ejecutar la regla desde ese mismo Excel con la ayuda de OpenRules.



Supongamos que nuestro experto de negocio nos pasa una tabla en Excel donde están las reglas que quiere que el sistema valide, cosas del tipo:

  • Todos los clientes con cuatro o mas productos de la categoría A son acreedores a un descuento.

  • Cuando los productos de la categoría A y B para las sucursales 1,2,3 8 y 9, son usados para calcular el bono del vendedor se debe tomar la tasa especial del 4% para calcular su comisión.

  • Si los clientes hacen reservaciones en un Hotel de la cadena Hilton, se debe generar un bono por el 5% del monto total a facturar, valido en toda la cadena de hoteles con vigencia de tres meses, en destinos nacionales.



Este tipo de reglas y como muchas otras cosas son del tipo condición -> acción; causa -> efecto. Típicamente las reglas que genera el experto de negocio son fácilmente expresables como varias tablas de Excel, una vez que tenemos la regla expresada de esa manera, un desarrollador debe tomar esas reglas y afinarlas , para determinar posibles contradicciones y reglas múltiples.

Cada condición de la regla se evalúa usando expresión Java como la que usaríamos en un "IF" cualquiera . Está expresión se evalúa para cada uno de los posibles valores de la condición (los valores de la columna). Donde la expresión tenga un valor TRUE, la regla hace "match". Las condiciones de la tabla se leen de izquierda a derecha y de arriba hacia abajo. En la imagen que muestro a continuación vemos cinco columnas (C1,C2,C3,C4 y C5) de condiciones cada una con una variable asignada, Cliente, Monto, Sucursal, Producto y Frontera.



Después se le asigna un nombre como si fuera un método normal Java , en este caso recorteMontosInformal (atención a la firma del método!!!). Al terminar este proceso, vamos a diferenciar las columnas de la tabla como condiciones y acciones; estas condiciones y acciones quedan asociadas a métodos y/o otros atributos de clase (Ver imagen, lineas 49,50,51...). Por ejemplo en el caso presentado celda E50 tenemos "xSolicitud.getProducto().equals(producto)" donde:


  • xSolicitud: Es el parametro de entrada de la tabla. El parametro del método!

  • getProducto(): Es el nombre de un método en el objeto xSolicitud, un simple método get

  • equals(producto): Es aquí donde se ejecuta la regla, donde producto, son los valores de la columna uno a la vez para evaluar la condición.



Obviamente lo que sucede es que el nombre de la regla/tabla (void recorteMontosInformal(Solicitud xSolicitud) es asociado por el openRules a un fragmento Java generado por el en base a los datos de la tabla de Excel.

Traduciendo la primera regla de la tabla a palabras mas entendibles tendríamos (rango de celdas B53-I53) los clientes de tipo A con un monto de factura de 1800 de cualquier sucursal (por eso la celda en blanco) que compraron en la frontera deben.... (y es aquí cuando bienen las acciones (columnas de la G-I)...) mantener su monto en 1800 (solo muestro el valor para fines ilustrativos, pero la celda bien se puedo haber quedado en blanco, pues no hubo cambio de valor como en filas posteriores) y pagar una comisión de 90 pesos con su respectivo IVA.

La información para validar la regla estaba ya en el objeto xSolicitud que se paso como "parámetro" a la tabla y las acciones afectan a este objeto con código Java como el señalado por la flecha en la imagen anterior. Dejénme mostrar el detalle.



Para usar openRules en tus proyectos Java solo tienes que incluir unas pocas librerías (2 Mb) y generar tu archivo JAR, WAR o EAR. Lo que le da a OpenRules una firma de librerías muy reducida y lo hace muy flexible.

Además el código para "ejecutar" la tabla es también muy sencillo.




package basic_types;
import com.openrules.ruleengine.OpenRulesEngine;

public class TestOpenRules
{
public void process(Solicitud xSolicitud)
{
String fileName =
"file:/workspace/HelloJava/rules/main/123.xls";
String methodName = "obtenerVerificaciones";

OpenRulesEngine engine = new OpenRulesEngine(fileName);
Object[] objects = new Object[] { xSolicitud };
engine.run(methodName,objects);
}
}






Para este caso elegi "Eclipse Galileo" para hacer la implementación , aunque quiero dejar claro que no tengo ninguna inclinación particular por Eclipse, ni lo recomiendo, simplemente es la herramienta que me sirvio para este ejemplo, cualquier otra herramienta puede ser igual o mejor que Eclipse.

¿Que mas se puede hacer a partir de aquí? Crear un WebServices , crear un applet , JSP, Portlets ? Lo que tu quieras la imaginación es el limite. :D...

La siguiente entrega ??? Afghanistan, JavaFx, El arte de la guerra y MTG... no lo sé...

No comments:

Post a Comment