Beispiel

Das folgende Beispiel zeigt ein CER-Regelwerk, das den Ausdruck "create" (siehe create) verwendet, um eine bedingte Erstellung von Regelobjekten aus Regeln vorzunehmen:

<?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>

    <!-- Uses <create> to get a new rule object.

         Other calculations (on this or other rule objects) can
         access this newly-created rule object by referring to
         this attribute, i.e.

         <reference attribute="minorAgeRangeTest"/> .

         The rule object created CANNOT be retrieved using a
         <readall> expression.
     -->
    <Attribute name="minorAgeRangeTest">
      <type>
        <ruleclass name="AgeRangeTest"/>
      </type>
      <derivation>
        <!-- Create an age-range test which checks whether this
             person is aged between 0-17 inclusive (i.e. is
             under 18 years).
          -->
        <create ruleclass="AgeRangeTest">
          <this/>
          <Number value="0"/>
          <Number value="17"/>
        </create>
      </derivation>

    </Attribute>

    <!-- Uses the age-range check to determine whether this person
         is a minor. -->
    <Attribute name="isMinor">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <reference attribute="isPersonInAgeRange">
          <reference attribute="minorAgeRangeTest"/>
        </reference>
      </derivation>
    </Attribute>

    <!-- Uses <create> to get a new rule object, within
         another expression.

         Because the new rule object is created "anonymously",
         it is not available to any other rule objects (but
         it will still show up as "created" in any SessionDoc.
    -->
    <Attribute name="isOfWorkingAge">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <!-- Create an age-range test which checks whether this
             person is legally permitted to work (i.e. is aged
             at least 16 and less than 65), and then check
             whether the test passes. -->
        <reference attribute="isPersonInAgeRange">
          <create ruleclass="AgeRangeTest">
            <this/>
            <Number value="16"/>
            <Number value="64"/>
          </create>
        </reference>
      </derivation>

    </Attribute>

  </Class>

  <!-- A generic test which checks whether the
       person's age lies within a specified (inclusive)
       range. -->
  <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>
Anmerkung: Wie alle CER-Ausdrücke wird der Ausdruck "create" (siehe create) nur berechnet, wenn er angefordert wird. Beispielsweise wird das Regelobjekt minorAgeRangeTest nur dann erstellt, wenn sein Wert oder der Wert von isMinor durch den Client-Code oder durch eine andere Berechnung angefordert wird.

Im obigen Beispiel verwendet isOfWorkingAge das Verfahren für die "anonyme" Erstellung eines Regelobjekts. Hierzu wird die Erstellung des Regelobjekts in einen Ausdruck einschlossen, der auf ein Attribut im neu erstellten Regelobjekt verweist. Solche Regelobjekte sind nicht für andere Berechnungen verfügbar, werden jedoch in jedem generierten SessionDoc aufgeführt.

Ein anonymes Regelobjekt kann nützlich sein, wenn Sie in einem erstellten Regelobjekt auf Regelattribute zugreifen müssen, das erstellte Regelobjekt selbst jedoch nicht für andere Berechnungen zur Verfügung stehen muss.

Pool für interne Regelobjekte

Seit Cúram Version 6 behält CER einen "Pool" mit internen Regelobjekten bei, die während einer Sitzung erstellt wurden.

Der Pool der Sitzung wird immer dann abgefragt, wenn ein Ausdruck "create" (siehe create) ausgewertet wird. Falls bereits ein Regelobjekt mit derselben Initialisierung und/oder denselben angegebenen Parametern erstellt wurde, wird es aus dem Pool wiederverwendet, statt ein neues Regelobjekt zu erstellen.

Diese Strategie der Poolnutzung verbessert die Effizienz in Situationen, bei denen viele Anweisungen "create" (siehe create) versuchen, identische Regelobjekte zu erstellen. Die Verwendung eines einzigen Regelobjekts bedeutet, dass alle berechneten Attribute für das einzelne Regelobjekt höchstens ein Mal berechnet werden und keine identischen Berechnungen für viele identische Regelobjekte ausgeführt werden müssen.

Die Wiederverwendung von Regelobjekten aus dem Pool ist garantiert unbedenklich, da die Kernprinzipien von CER sicherstellen, dass jede Berechnung ausschließlich von ihren Eingabewerten abhängig ist, was wiederum bedeutet, dass identische Eingaben identische Ausgaben gewährleisten.