Attribut de règle description

Chaque classe de règles hérite enfin d'une "classe de règles racine" CER. Cette classe racine inclut un attribut de règle description qui dispose d'une implémentation de valeur par défaut (mais pas particulièrement utile).

La valeur description d'un objet de règle est sortie dans RuleDoc, ainsi que par la méthode toString sur RuleObject (que de nombreux IDE utilisent lorsque vous "cliquez" sur une variable). Par conséquent, attribut de règledescription significatif peut être indispensable lors de l'explication du comportement de votre jeu de règles.

Vous devez remplacer le calcul description par défaut en créant de façon explicite un attribut description sur chacune de vos classes de règles. Vous pouvez utiliser l'éditeur CER pour créer un attribut description comme la création d'un attribut normal sur une classe de règles. Le valeur du jeu de règles CER signale un avertissement si vous disposez d'une classe de règles qui ne définit pas (ou hérite d'une autre classe de règles définie) un attribut de règle description.

L'attribut description est un message localisable et (tout comme d'autres attributs de règle) son calcul peut être simple ou aussi complexe que nécessaire.

Voici un exemple de jeu de règles, dans lequel certaines classes de règles fournissent une implémentation de description :

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_description"
  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="lastName">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Remplacement de la description par défaut -->
    <Attribute name="description">
      <type>
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Concaténation du prénom et du nom de la personne -->
        <concat>
          <fixedlist>
            <listof>
              <javaclass name="Object"/>
            </listof>
            <members>

              <reference attribute="firstName"/>
              <String value=" "/>
              <reference attribute="lastName"/>
            </members>
          </fixedlist>
        </concat>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Income">
    <!-- Personne à laquelle cet
         enregistrement de revenu est associé. -->
    <Attribute name="person">
      <type>
        <ruleclass name="Person"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>
    <Attribute name="startDate">
      <type>
        <javaclass name="curam.util.type.Date"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>
    <Attribute name="amount">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Remplacement de la description par défaut -->
    <Attribute name="description">
      <type>
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Concaténation de la description de la personne et de la date de
 début-->
        <concat>
          <fixedlist>
            <listof>
              <javaclass name="Object"/>
            </listof>
            <members>

              <reference attribute="description">
                <reference attribute="person"/>
              </reference>
              <!-- Dans un jeu de règles réel, cette description utilise
                   un attribut <ResourceMessage> pour éviter
                   les chaînes unilingues codées en dur.  -->
              <String value="'s income, starting on "/>
              <reference attribute="startDate"/>
            </members>
          </fixedlist>
        </concat>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Benefit">
    <!-- NB Pas de remplacement de <description> ; le valideur de jeu de règles CER
         émet un avertissement et les objets de règle de cette classe
         sont plus difficiles à comprendre dans RuleDoc ou un environnement
         de développement intégré Java. -->
    <!-- Personne à laquelle cet
         enregistrement de prestation est associé. -->
    <Attribute name="person">
      <type>
        <ruleclass name="Person"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

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

</RuleSet>

Voici une classe de test qui crée des objets de règle (Person, Income et Benefit) :

package curam.creole.example;

import java.io.File;

import junit.framework.TestCase;
import curam.creole.execution.session.RecalculationsProhibited;
import curam.creole.execution.session.Session;
import curam.creole.execution.session.SessionDoc;
import curam.creole.execution.session.Session_Factory;
import
 curam.creole.execution.session.StronglyTypedRuleObjectFactory;
import curam.creole.ruleclass.Example_description.impl.Benefit;
import
 curam.creole.ruleclass.Example_description.impl.Benefit_Factory;
import curam.creole.ruleclass.Example_description.impl.Income;
import
 curam.creole.ruleclass.Example_description.impl.Income_Factory;
import curam.creole.ruleclass.Example_description.impl.Person;
import
 curam.creole.ruleclass.Example_description.impl.Person_Factory;
import curam.creole.storage.inmemory.InMemoryDataStorage;
import curam.util.type.Date;

/**
 * Test de la description de l'attribut de règle.
 */
public class TestDescription extends TestCase {

  /**
   * Test de la description de l'attribut de règle.
   */
  public void testDescriptions() {

    /**
     * Création d'une nouvelle session.
     */
    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new StronglyTypedRuleObjectFactory()));

    /**
     * Création SessionDoc pour produire un rapport sur les objets de règle.
     */
    final SessionDoc sessionDoc = new SessionDoc(session);

    /*
     * Création d'un objet de règle Person.
     */
    final Person person =
        Person_Factory.getFactory().newInstance(session);
    person.firstName().specifyValue("John");
    person.lastName().specifyValue("Smith");

    /*
     * Création d'un objet de règle Income.
     */
    final Income income =
        Income_Factory.getFactory().newInstance(session);
    income.person().specifyValue(person);
    income.amount().specifyValue(123);
    income.startDate().specifyValue(Date.fromISO8601("20070101"));

    /*
     * Création d'un objet de règle Benefit.
     */
    final Benefit benefit =
        Benefit_Factory.getFactory().newInstance(session);
    benefit.person().specifyValue(person);
    benefit.amount().specifyValue(234);

    /*
     * La méthode .toString évalue l'attribut de règle
     * description
     */
    System.out.println(person.toString());

    /*
     * println appelle la méthode toString d'un objet pour l'imprimer.
     */
    System.out.println(income);

    /*
     * La classe de règles benefit ne fournit pas d'implémentation de
     * l'attribut de règle description. Nous allons par conséquent obtenir ici une description
     * par défaut
     */
    System.out.println(benefit);

    /*
     * Ecriture de SessionDoc pour cette session.
     */
    sessionDoc.write(new File("./gen/sessiondoc"));
>
  }

}

Lorsque le test est exécuté, il génère cette sortie, qui indique les descriptions d'objet de règle :

John Smith
John Smith's income, starting on 01/01/07 00:00
Undescribed instance of rule class 'Benefit', id '3'

A la fin du test, les objets de règle de la session sont sortis en tant que SessionDoc. Le récapitulatif SessionDoc de niveau supérieur affiche les objets de règle créés et répertorie la description de chaque objet de règle :

Figure 1. SessionDoc indiquant les valeurs description de l'objet de règleExemple de documentation de session générée.

La description de l'objet de règle Benefit est la description par défaut. En cas d'absence d'une bonne implémentation de description, une personne lisant SessionDoc devra peut-être parcourir SessionDoc pour donner un sens à l'objet de règle Benefit :

Figure 2. SessionDoc pour un objet de règle sans remplacement d'élément descriptionExemple de documentation de session générée.

Cette capture d'écran présente comment un environnement de développement intégré (tel qu'Eclipse) utilise la méthode toString d'un objet lors du débogage, qui calcule (pour les objets de règle) l'élément description :

Figure 3. Utilisation d'un élément description dans un environnement de développement intégréExemple Eclipse.
Conseil : N'oubliez pas que le but de l'élément description est de décrire une instance d'objet de règle, et non la classe de règles proprement dite.

En particulier, le calcul de votre attribut de règle description doit inclure des données indiquant qu'il est facile de faire la distinction entre différentes instances d'objet de règle de votre classe de règles.