create

Dieser Ausdruck ruft eine neue Instanz einer Regelklasse im Hauptspeicher der Sitzung ab. Alle vom Regelobjekt benötigten Initialisierungswerte müssen als untergeordnete Elemente des Ausdrucks create angegeben werden.

Seit Cúram Version 6 kann der Ausdruck create verwendet werden, um eine neue Instanz einer Regelklasse aus einem anderen Regelwerk zu erstellen, indem für das optionale XML-Attribut ruleset ein Wert definiert wird.

Anmerkung: Mit dem Ausdruck create erstellte Regelobjekte können während der Regelausführung nicht abgerufen werden, da dies das Ordnungsprinzip von CER verletzen würde.

Seit Cúram Version 6 besteht eine Auswahlmöglichkeit für die Syntax, die bei der Übergabe von Werten an ein erstelltes Regelobjekt verwendet wird:

Seit Cúram Version 6 werden Regelobjekte innerhalb der Sitzung "in einem Pool zusammengefasst". Durch diesen Pool können identische Anforderungen für die Erstellung eines Regelobjekts mit einem einzigen Regelobjekt erfüllt werden, was die Hauptspeicherbelegung und (durch die Verhinderung identischer Berechnungen) auch die CPU-Belastung verringert. Zwei Anforderungen für die Erstellung eines Regelobjekts sind dann identisch, wenn sie dieselbe Regelklasse anfordern und die Werte aller initialisierten und angegebenen Attribute gleich sind.

Falls im folgenden Beispiel die geschäftliche Telefonnummer einer Person mit der privaten Telefonnummer einer Person identisch ist, wird für beide Nummern ein einziges Regelobjekt verwendet und der abgeleitete Wert für isOutOfThisArea folglich nur ein einziges Mal berechnet. Bei unterschiedlichen geschäftlichen und privaten Nummern werden zwei Regelobjekte erstellt.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_create"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">

  <Class name="Person">

    <!-- Phone number details as gathered in evidence -->
    <Attribute name="homePhoneAreaCode">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="homePhoneNumber">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="workPhoneAreaCode">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="workPhoneNumber">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Create PhoneNumber rule objects
         and place them in a list -->
    <Attribute name="phoneNumbers">
      <type>
        <javaclass name="List">
          <ruleclass name="PhoneNumber"/>
        </javaclass>
      </type>
      <derivation>
        <fixedlist>
          <listof>
            <ruleclass name="PhoneNumber"/>
          </listof>

          <members>

            <!-- Phone Number for the home details. -->
            <create ruleclass="PhoneNumber">
              <!-- The value for PhoneNumber.owner -->
              <this/>
              <!-- The value for PhoneNumber.number -->
              <reference attribute="homePhoneNumber"/>
              <specify attribute="areaCode">
                <!-- The value for PhoneNumber.areaCode -->
                <reference attribute="homePhoneAreaCode"/>
              </specify>
            </create>

            <!-- Phone Number for the work details.

                 If a person's work phone number is identical to the
                 person's home phone number (i.e. the area code and
                 number are the same), then this <create> expression
                 will return the same rule object as the rule object
                 returned by the <create> expression above.  If the
                 phone numbers are not identical, then two different
                 rule objects will be returned.-->
            <create ruleclass="PhoneNumber">
              <this/>
              <reference attribute="workPhoneNumber"/>
              <specify attribute="areaCode">
                <reference attribute="workPhoneAreaCode"/>
              </specify>
            </create>

          </members>
        </fixedlist>
      </derivation>
    </Attribute>

  </Class>

  <Class name="PhoneNumber">

    <Initialization>
      <!-- The values for these attributes must be passed, in order,
           by any <create> expression. -->
      <Attribute name="owner">
        <type>
          <ruleclass name="Person"/>
        </type>
      </Attribute>
      <Attribute name="number">
        <type>
          <javaclass name="Number"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- The value for this attribute may be passed by a <specify>
         element within a <create> expression, which will override
         the default derivation here. -->
    <Attribute name="areaCode">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- Default implementation, used if the <create> expression
             does not <specify> a value for this attribute. -->
        <Number value="123"/>
      </derivation>
    </Attribute>

    <!-- For a pooled rule object, this derived value will only be
         calculated once.

         For example, if a person's work phone number is identical
         to the person's home phone number, then the same rule
         object will be used for both home and work phone numbers,
         and the "isOutOfThisArea" value for this single rule
         object will be calculated only once.
      -->
    <Attribute name="isOutOfThisArea">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <not>
          <equals>
            <reference attribute="areaCode"/>
            <!-- The area code for the agency's area -->
            <Number value="123"/>
          </equals>
        </not>
      </derivation>
    </Attribute>
  </Class>
</RuleSet>