Exemple

Voici un exemple de jeu de règles CER qui utilise l'expression create pour créer des objets de règle conditionnels à partir de règles :

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

    <!-- Utilise <create> pour obtenir un nouvel objet de règle.

         D'autres calculs (sur cet objet de règle ou d'autres) peuvent
         accéder à cet objet de règle récemment créé en se référant à
         cet attribut, c'est-à-dire

         <reference attribute="minorAgeRangeTest"/> .

         L'objet de règle créé ne peut PAS être extrait à l'aide d'une expression
         <readall>.
     -->
    <Attribute name="minorAgeRangeTest">
      <type>
        <ruleclass name="AgeRangeTest"/>
      </type>
      <derivation>
        <!-- Créer un test de plage d'âges qui vérifie si cette
             personne est âgée de 0 à 17 ans inclus (c'est-à-dire si elle a
             moins de 18 ans).
          -->
        <create ruleclass="AgeRangeTest">
          <this/>
          <Number value="0"/>
          <Number value="17"/>
        </create>
      </derivation>

    </Attribute>

    <!-- Utilise la vérification de plage d'âges pour déterminer si cette personne
         est mineure. -->
    <Attribute name="isMinor">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <reference attribute="isPersonInAgeRange">
          <reference attribute="minorAgeRangeTest"/>
        </reference>
      </derivation>
    </Attribute>

    <!-- Utilise <create> pour obtenir un nouvel objet de règle, au sein d'une
         autre expression.

         Etant donné que le nouvel objet de règle est créé de manière anonyme,
         il n'est pas accessible à tous les autres objets de règle (mais
         il apparaît toujours comme Créé dans tous les SessionDoc.
    -->
    <Attribute name="isOfWorkingAge">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <!-- Créer un test de plage d'âges qui vérifie si cette
             personne est légalement autorisée à travailler (c'est-à-dire si elle est âgée
             d'au moins 16 ans et de moins de 65 ans), puis vérifier
             la réussite du test. -->
        <reference attribute="isPersonInAgeRange">
          <create ruleclass="AgeRangeTest">
            <this/>
            <Number value="16"/>
            <Number value="64"/>
          </create>
        </reference>
      </derivation>

    </Attribute>

  </Class>

  <!-- Un test générique qui vérifie si
       l'âge de la personne est compris dans une plage
       spécifiée. -->
  <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>
Remarque : Comme pour toutes les expressions CER, les expressions create ne sont calculées que si nécessaire. Par exemple, l'objet de règle TestPlageAgesMineur n'est créé que si sa valeur ou celle de estMineur est demandée par le code client ou un autre calcul.

Dans l'exemple ci-dessus, la valeur estEnAgeDeTravailler utilise la technique de création d'un objet de règle anonyme en encapsulant la création d'un objet de règle dans une expression qui fait référence à un attribut sur l'objet de règle récemment créé. Ces objets de règle ne sont pas accessibles à d'autres calculs mais s'affichent toujours dans n'importe quel SessionDoc généré.

Un objet de règle anonyme peut être utile lorsque vous souhaitez accéder aux attributs de règle dans un objet de règle créé, mais il n'est pas nécessaire de mettre cet objet de règle créé à la disposition de tous les autres calculs.

Regroupement d'objets de règle internes en pools

Depuis Cúram V6, CER conserve un pool d'objets de règle internes qui ont été créés au cours d'une session.

Le pool de session est interrogé à chaque fois qu'une expression create est évaluée. Si un objet de règle avec les mêmes paramètres d'initialisation et/ou spécifiés a déjà été créé, il est réutilisé à partir du pool et non d'un nouvel objet de règle créé.

Cette approche de regroupement en pool améliore l'efficacité dans les situations où de nombreuses instructions create tentent de créer des objets de règle identiques. L'utilisation d'un objet de règle unique signifie que tous les attributs calculés sur cet objet de règle unique le sont au moins une fois, et évite des calculs identiques se produisant sur de nombreux objets de règle identiques.

La réutilisation des objets de règle regroupés en pool est garantie comme sûre, car les principes de base de CER garantissent que tout calcul dépend uniquement de ses entrées ; des entrées identiques garantissent donc des sorties identiques.