4.3 Data Validation Process
4.3.1 Member checking by stakeholders
La transformación de RIF a OMG‐PRR se realiza para facilitar la representación de las reglas en UML. La idea es que, en el diseño de la aplicación empleando UML, se identificarán las clases que corresponden a servicios de decisión, las cuales comprenderán las reglas de negocio necesarias para la definición del servicio. Estas reglas se incorporarán a través de descripciones en OCL pero el diseñador únicamente indicará que se deben suministrar esas reglas, cuyos contenidos se generarán posteriormente utilizando K‐Site Rules para la definición de la regla.
La semántica operacional entre RIF y OMG‐PRR es equivalente, lo que facilita la transformación del uno al otro. Por ejemplo, en motores de reglas con encadenamiento hacia adelante es necesario un mecanismo de resolución de conflictos para elegir la instancia de regla que se ejecutará a continuación, que puede expresarse en ambos estándares. Es importante indicar que en esta propuesta no es necesaria una transformación bidireccional, basta con poder pasar de RIF a OMG‐ PRR. El caso contrario no se cubre, aunque resultaría de gran interés. También se hace necesario indicar que esta transformación es válida únicamente para reglas de producción, pero no para reglas de tipo evento‐condición‐acción o reglas de derivación, que no han sido contempladas en el estándar OMG‐PRR. Por otra parte, el estándar está más orientado a indicar la estructura que debe tener una regla y a facilitar la especificación de esa estructura frente a la definición de su contenido.
Como se explicó en la sección II.4.2.5, una regla en OMG PRR se compone de tres partes: una zona de declaración de variables, que se introduce mediante la palabra reservada 'ruleVariable', una zona para expresar las condiciones de la regla, que se encabeza con la palabra 'condition', y la zona de acciones de la regla, que se ejecutan si se cumplen las condiciones, y que se introducen con la palabra 'action'. En OMG PRR, al igual que en RIF, no existe la oportunidad de definir una zona 'si no' en la regla, es decir, no cabe la posibilidad de indicar, en una misma regla, qué sucede cuando no se cumplen las condiciones incluidas. A continuación se detalla el mecanismo de transformación de las distintas partes que componen una regla de negocio de RIF a OMG PRR
III.2.4.1.
Transformación de condiciones
Las condiciones en OMG PRR se introducen tras la palabra reservada 'condition' y al igual que en RIF, se permite la combinación de distintas condiciones de comparación entre atributos o entre atributos y constantes mediante los operadores lógicos 'and', 'or' y 'not'. Los operadores de comparación que se definen en OMG PRR son: ‘+,’ ‘‐,’ ‘*’, ‘/,’ ‘<,’ ‘>,’ ‘<>’, ‘<=’, ‘>=’, lo que proporciona la mismaIntroduciendo Semántica en un Proceso de Desarrollo Software a través de Reglas de Negocio
expresividad que RIF. Así por ejemplo, la expresión de la Figura III‐ 7 se representaría en OMG PRR como la mostrada en la Figura III‐ 12.
Para el caso del cuantificador existencial OMG PRR no proporciona un operador específico, con lo que la implementación de este operador pasa por seleccionar los objetos de la memoria de trabajo que cumplan una determinada condición y trabajar con el primero de ellos. Para este fin puede emplearse el operador 'select' que incorpora OMG PRR y que proporciona un conjunto con todos los objetos que satisfacen una determinada condición. Bastaría seleccionar uno de los objetos del conjunto resultado.
ruleVariable:
?poliza : Poliza -> any(); condition:
poliza.PotenciaCoche = 120
Figura III- 12. Expresión en OMG PRR de la parte de regla representada en la Figura III- 7
III.2.4.2.
Transformación de acciones
El estándar OMG PRR contempla la posibilidad de definir la parte de acción de una regla como una lista de operaciones de actualización, inserción y eliminación de objetos, así como la invocación de métodos externos. Para implementar estas acciones OMG PRR dispone de las clases: ImperativeExp, que implementa todos aquellos efectos colaterales contemplados en el estándar; AssignExp, que permite representar una expresión de asignación de un valor a una variable o a una propiedad; InvokeExp, que permite realizar llamadas a funciones externas no definidas en el ámbito del estándar; AssertExp, que permite añadir un objeto en el dominio del motor de reglas; RetractExp, que saca a un objeto determinado del ámbito del motor de reglas y UpdateExp, que facilita la actualización de objetos en el ámbito del motor de reglas. Como puede comprobarse tras la lectura del apartado anterior sobre representación de acciones en RIF, estas clases permiten expresar toda la funcionalidad definida ese estándar. En realidad, las clases mencionadas son abstractas, es decir, no existen como tal y tienen su reflejo en los operadores 'assert' y 'retract' en OMG PRR, así como en asignaciones de valores a propiedades de objetos cuando se trate de modificaciones o actualizaciones.
III.2.4.3.
Transformación de conjuntos de reglas
Por último, el estándar también incluye la posibilidad de definir grupos de reglas o rulesets. Como se explicaba anteriormente, estos rulesets no son más que agrupaciones de reglas de negocio atendiendo a parámetros funcionales. Para su especificación se emplea la palabra Ruleset, permiténdose también la especificación de parámetros de entrada (objetos a los que se referenciará en la definición de las reglas de negocio) y de variables, mediante la palabra reservada 'Variables', que tendrán como ámbito todas las reglas que se incluyan en el ruleset.
Por otra parte, como sucedía en el caso de RIF, no existe la posibilidad de definir distintas combinaciones de estos conjuntos de reglas, es decir, el estándar no dispone de ninguna herramienta que permita definir flujos dentro de los servicios de decisión.
A modo de ejemplo, la representación en OMG PRR de la regla expresada en RIF en la Figura III‐ 11 quedaría como se muestra en la Figura III‐ 13.
Introduciendo Semántica en un Proceso de Desarrollo Software a través de Reglas de Negocio
Rule ValidarPotenciayPrecio ruleVariable:
?poliza: Poliza = ShoppingCart->any() ?coche: Coche = ?poliza.coche
Condition:
?poliza.potenciacoche > 120 and coche.precio >= 15000
Action:
?poliza.precio = 500
Figura III- 13. Expresión en OMG PRR de la regla representada en lenguaje RIF en la Figura III- 11