A continuación se muestra un conjunto de reglas CER de ejemplo que utiliza la expresión create para crear condicionalmente objetos de regla desde reglas:
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_internalRuleObjects" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Person"> <Attribute name="age"> <type> <javaclass name="Number"/> </type> <derivation> <specified/> </derivation> </Attribute> <!-- Utiliza <create> para obtener un nuevo objeto de regla. Otros cálculos (en este u otros objetos de regla) pueden acceder a este objeto de regla recién creado haciendo referencia a este atributo, es decir <reference attribute="minorAgeRangeTest"/> . El objeto de regla creado NO PUEDE recuperarse utilizando una expresión <readall>. --> <Attribute name="minorAgeRangeTest"> <type> <ruleclass name="AgeRangeTest"/> </type> <derivation> <!-- Crear una prueba de rango de edad que comprueba si esta persona tiene entre 0 y 17 años inclusive (es decir menos de 18 años). --> <create ruleclass="AgeRangeTest"> <this/> <Number value="0"/> <Number value="17"/> </create> </derivation> </Attribute> <!-- Utiliza la comprobación de rango de edad para determinar si esta persona es un menor. --> <Attribute name="isMinor"> <type> <javaclass name="Boolean"/> </type> <derivation> <reference attribute="isPersonInAgeRange"> <reference attribute="minorAgeRangeTest"/> </reference> </derivation> </Attribute> <!-- Utiliza <create> para obtener un objeto de regla nuevo, dentro de otra expresión. Dado que el objeto de regla nuevo se crea de "forma anónima", no está disponible a ningún otro objeto de regla (pero se seguirá mostrando como creado ("created") en cualquier SessionDoc. --> <Attribute name="isOfWorkingAge"> <type> <javaclass name="Boolean"/> </type> <derivation> <!-- Crear una prueba de rango de edad que comprueba si esta persona está legalmente autorizada a trabajar (es decir, tiene como mínimo 16 años y menos de 65) y, a continuación, comprobar si la prueba pasa. --> <reference attribute="isPersonInAgeRange"> <create ruleclass="AgeRangeTest"> <this/> <Number value="16"/> <Number value="64"/> </create> </reference> </derivation> </Attribute> </Class> <!-- Una prueba genérica que comprueba si la edad de la persona está dentro de un rango especificado (inclusive). --> <Class name="AgeRangeTest"> <Initialization> <Attribute name="person"> <type> <ruleclass name="Person"/> </type> </Attribute> <Attribute name="minimumAge"> <type> <javaclass name="Number"/> </type> </Attribute> <Attribute name="maximumAge"> <type> <javaclass name="Number"/> </type> </Attribute> </Initialization> <Attribute name="isPersonInAgeRange"> <type> <javaclass name="Boolean"/> </type> <derivation> <all> <fixedlist> <listof> <javaclass name="Boolean"/> </listof> <members> <compare comparison=">="> <reference attribute="age"> <reference attribute="person"/> </reference> <reference attribute="minimumAge"/> </compare> <compare comparison="<="> <reference attribute="age"> <reference attribute="person"/> </reference> <reference attribute="maximumAge"/> </compare> </members> </fixedlist> </all> </derivation> </Attribute> </Class> </RuleSet>
En el ejemplo anterior, isOfWorkingAge utiliza la técnica de crear un objeto de regla de "forma anónima" envolviendo la creación de un objeto de regla en una expresión que hace referencia a algún atributo en el objeto de regla recién creado. Estos objetos de regla no están disponibles para otros cálculos pero siguen mostrándose en cualquier SessionDoc generado.
Un objeto de regla anónimo puede ser útil cuando necesite acceder a los atributos de regla en un objeto de regla creado, pero no es necesario que el objeto de regla creado esté disponible para cualquier otro cálculo.
Desde Cúram V6, CER mantiene una "agrupación" de objetos de regla internos que se han creado durante una sesión.
La agrupación de la sesión se consulta siempre que se evalúa una expresión create. Si ya se ha creado un objeto de regla con los mismos parámetros especificados y/o de inicialización, se volverá a utilizar desde la agrupación en lugar de crearse un objeto de regla nuevo.
Este enfoque de agrupación mejora la eficiencia en la situación donde muchas sentencias create intentan crear objetos de regla "idénticos". El uso de un solo objeto de regla significa que los atributos calculados en el único objeto de regla se calculan como máximo una vez, en lugar de producirse cálculos idénticos en muchos objetos de regla "idénticos".
Se garantiza que la reutilización de los objetos de regla agrupados es segura, porque los principios básicos de CER aseguran que cualquier cálculo depende sólo de sus entradas y, por consiguiente, entradas idénticas garantizan salidas idénticas.