Ejemplo

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="&lt;=">
                <reference attribute="age">
                  <reference attribute="person"/>
                </reference>
                <reference attribute="maximumAge"/>
              </compare>
            </members>
          </fixedlist>
        </all>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>
Nota: Como para todas las expresiones CER, las expresiones create sólo se calcularán si se solicitan, por ejemplo el objeto de regla minorAgeRangeTest sólo se creará si su valor o el valor de isMinor se solicita mediante código de cliente u otro cálculo.

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.

Agrupación de objetos de regla interno

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.