Classes de règles

Toute classe de règles CER définie dans votre jeu de règles peut être utilisée comme type de données de ce jeu de règles.

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

    <Attribute name="firstName">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="favoritePet">
      <type>
        <!-- Le type de cet attribut est une classe de règles
             définie à un autre endroit de ce jeu de règles.        -->
        <ruleclass name="Pet"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Pet">

    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>

Héritage

CER prend en charge l'héritage d'implémentation simple pour les classes de règles.

Une classe de règles peut éventuellement spécifier une déclaration étend pour créer une sous-classe contenant une autre classe de règles du même jeu de règles.

Une sous-classe de règles hérite des attributs de règle calculés de toutes ses classes ancêtre, et peut éventuellement remplacer n'importe lequel de ces attributs afin de fournir des règles de calcul de dérivation différentes.

Une sous-classe de règles hérite également des attributs de règle initialisés de toutes ses classes ancêtre, et toute expression create liée à la sous-classe de règles doit indiquer la valeur des attributs initialisés de toutes les classes de règles ancêtre liées à la sous-classe de règles avant celles déclarées sur la sous-classe de règles elle-même.

CER autorise un attribut à être déclaré abstract. Chaque classe de règles qui définit ou hérite d'un attribut abstrait (sans le remplacer) doit également être déclarée abstraite. Une classe abstraite ne peut pas être utilisée dans une expression create.

CER permet à une instance d'objet de règle d'une classe de règles d'être renvoyée à chaque fois que l'une de ses classes de règles ancêtre est attendue.

Le valideur de jeu de règles CER signale une erreur si une expression de votre jeu de règles tente de renvoyer une valeur incompatible :

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


  <!-- Le valideur de jeu de règles CER insiste pour que cette
       classe de règles soit marquée comme abstraite, car elle contient
       un attribut de règle abstrait. -->
  <Class name="Resource" abstract="true">
    <Initialization>
      <!-- A chaque fois qu'un objet de règle Ressource est créé,
           son propriétaire doit être initialisé. 
           Etant donné que la ressource est abstraite, elle ne peut pas être
           utilisée dans une expression <create> ; cela n'est possible que pour les
           sous-classes concrètes. -->
      <Attribute name="owner">
        <type>
          <ruleclass name="Person"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- La valeur monétaire de la ressource. -->
    <Attribute name="value">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- Chaque ressource a un montant, mais celui-ci est
             calculé selon une méthode spécifique à la sous-classe. -->
        <abstract/>
      </derivation>
    </Attribute>
  </Class>

  <!-- Un bâtiment est un type de ressource. -->
  <Class name="Building" extends="Resource">
    <!-- L'adresse physique du bâtiment,
         par exemple, 123 Main Street. 
         La valeur d'adresse doit être spécifiée
         en complément de l'attribut de règle
         de propriétaire hérité, qui est un
         attribut initialisé de la super-classe
         de règles. -->
    <Initialization>
      <Attribute name="address">
        <type>
          <javaclass name="String"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- Les bâtiments constituent une classe
         concrète, donc le valideur de jeu de règles CER
         insiste pour que cette classe
         hérite d'un calcul ou le déclare
         pour tous les attributs de règle abstraits hérités. -->
    <Attribute name="value">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <arithmetic operation="-">
          <reference attribute="purchasePrice"> </reference>
          <reference attribute="outstandingMortgageAmount"/>
        </arithmetic>

      </derivation>
    </Attribute>

    <!-- Le prix initialement payé pour le bâtiment. -->
    <Attribute name="purchasePrice">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Le montant des prêts ou des hypothèques en cours pour
         ce bâtiment. -->
    <Attribute name="outstandingMortgageAmount">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Vehicle" extends="Resource">
    <Initialization>
      <Attribute name="registrationPlate">
        <type>
          <javaclass name="String"/>
        </type>
      </Attribute>
    </Initialization>

    <Attribute name="value">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- La valeur de ce type de ressource est
             spécifiée directement, et non calculée.-->
        <specified/>

      </derivation>
    </Attribute>

  </Class>

  <Class name="Person">

    <!-- Un exemple d'attribut illustrant comment les attributs initialisés
         sont hérités. -->
    <Attribute name="sampleBuilding">
      <type>
        <ruleclass name="Building"/>
      </type>
      <derivation>
        <create ruleclass="Building">
          <!-- Le premier attribut de règle initialisé
               est hérité de la ressource. 
               Définir cette personne comme le propriétaire -->
          <this/>
          <!-- Le second attribut de règle initialisé
            est spécifié directement sur le bâtiment. 
            Définir l'adresse du bâtiment. -->
          <String value="123 Main Street"/>
        </create>
      </derivation>
    </Attribute>

    <!-- un exemple d'attribut qui montre comment un bâtiment peut être
         renvoyé en tant que ressource (car un bâtiment *IS* une
         ressource -->
    <Attribute name="sampleResource">
      <type>
        <ruleclass name="Resource"/>
      </type>
      <derivation>
        <reference attribute="sampleBuilding"/>
      </derivation>
    </Attribute>


  </Class>

</RuleSet>

La classe de règles racine

Si une classe de règles ne spécifie aucune autre classe de règles à étendre, la classe de règles étend automatiquement la classe de règles racine de CER, qui contient un seul attribut de règle description.

L'attribut de règle description fournit une description localisable de l'instance d'objet de règle. Les classes de règles peuvent remplacer librement la dérivation du calcul de règle description de leurs instances d'objet de règle.

Chaque classe de règles hérite finalement de la classe de règles racine (et contient donc un attribut de règle description), de la même manière dont toutes les classes Java héritent finalement de java.lang.Object.

L'implémentation par défaut de l'attribut de règle description, fournie par la classe de règles racine, utilise l'expression defaultDescription.