Regelattribut description

Jede Regelklasse übernimmt letzlich aus einer so genannten "Stammregelklasse" von CER. Diese Stammklasse enthält ein Regelattribut description, für das es eine Standardimplementierung gibt, die jedoch nicht besonders hilfreich ist.

Der Wert des Attributs description eines Regelobjekts wird im RuleDoc und ebenfalls von der Methode toString für ein Element RuleObject ausgegeben (diese Methode wird in vielen integrierten Entwicklungsumgebungen für Java verwendet, wenn Sie auf eine Variable "klicken"). Ein aussagekräftiger Wert für das Attribut description ist für das Verständnis des Verhaltens einer Regelgruppe möglicherweise unabdingbar.

Sie sollten die Standardberechnung für das Attribut description überschreiben, indem Sie für jede Regelklasse explizit ein Attribut description erstellen. Im CER-Editor können Sie ein Attribut description genauso wie ein normales Attribut für eine Regelklasse erstellen. Der CER-Regelwerkvalidierer gibt eine Warnung aus, wenn eine Regelklasse vorhanden ist, die kein Regelattribut description definiert (oder aus einer anderen definierten Regelklasse übernimmt).

Das Attribut description ist eine lokalisierbare Nachricht und seine Berechnung kann (wie bei anderen Regelattributen) so einfach oder so komplex wie benötigt sein.

Das folgende Beispiel zeigt ein Regelwerk, bei dem einige Regelklassen eine Implementierung des Attributs description angeben:

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

    <!-- Override the default description -->
    <Attribute name="description">
      <type>
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Concatenate the person's first and last names -->
        <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">
    <!-- The person to which this
         income record relates. -->
    <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>

    <!-- Override the default description -->
    <Attribute name="description">
      <type>
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Concatenate the person's description and the start
 date-->
        <concat>
          <fixedlist>
            <listof>
              <javaclass name="Object"/>
            </listof>
            <members>

              <reference attribute="description">
                <reference attribute="person"/>
              </reference>
              <!-- In a real rule set, this description would use
                   a <ResourceMessage> to avoid hard-coded
                   single-language Strings.  -->
              <String value="'s income, starting on "/>
              <reference attribute="startDate"/>
            </members>
          </fixedlist>
        </concat>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Benefit">
    <!-- NB no override of <description>; the CER rule set validator
         will issue a warning, and rule objects of this class will
         be more difficult to understand in RuleDoc or a Java
         integrated development environment. -->
    <!-- The person to which this
         benefit record relates. -->
    <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>

Die nachfolgende Testklasse erstellt einige Regelobjekte (Person, Income und 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;

/**
 * Tests the description rule attribute.
 */
public class TestDescription extends TestCase {

  /**
   * Tests the description rule attribute.
   */
  public void testDescriptions() {

    /**
     * Create a new session.
     */
    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new StronglyTypedRuleObjectFactory()));

    /**
     * Create a SessionDoc to report on rule objects.
     */
    final SessionDoc sessionDoc = new SessionDoc(session);

    /*
     * Create a Person rule object.
     */
    final Person person =
        Person_Factory.getFactory().newInstance(session);
    person.firstName().specifyValue("John");
    person.lastName().specifyValue("Smith");

    /*
     * Create an Income rule object.
     */
    final Income income =
        Income_Factory.getFactory().newInstance(session);
    income.person().specifyValue(person);
    income.amount().specifyValue(123);
    income.startDate().specifyValue(Date.fromISO8601("20070101"));

    /*
     * Create a Benefit rule object.
     */
    final Benefit benefit =
        Benefit_Factory.getFactory().newInstance(session);
    benefit.person().specifyValue(person);
    benefit.amount().specifyValue(234);

    /*
     * The .toString method evaluates the description rule
     * attribute
     */
    System.out.println(person.toString());

    /*
     * println calls an object's toString method to print it.
     */
    System.out.println(income);

    /*
     * The benefit rule class does not provide an implementation of
     * the description rule attribute, so we'll get a default
     * description here
     */
    System.out.println(benefit);

    /*
     * Write out SessionDoc for this session.
     */
    sessionDoc.write(new File("./gen/sessiondoc"));
>
  }

}

Bei der Ausführung des Tests wird die folgende Ausgabe erzeugt, die die Beschreibungen der Regelobjekte enthält:

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

Am Ende des Tests werden die Regelobjekte der Sitzung als SessionDoc ausgegeben. Die allgemeine SessionDoc-Zusammenfassung zeigt die erstellten Regelobjekte und listet die Beschreibungen der einzelnen Regelobjekte auf:

Abbildung 1. SessionDoc mit Werten des Attributs description von RegelobjektenBeispiel für generiertes SessionDoc

Die Beschreibung für das Regelobjekt Benefit ist die Standardbeschreibung. Falls keine sinnvolle Implementierung des Attributs description gegeben ist, muss ein Benutzer, der das SessionDoc liest, möglicherweise zum SessionDoc für das Regelobjekt Benefit navigieren, damit die Angaben für ihn einen Sinn ergeben:

Abbildung 2. SessionDoc für ein Regelobjekt ohne überschriebenes Attribut descriptionBeispiel für generiertes SessionDoc

Der abschließende Screenshot zeigt, wie eine integrierte Entwicklungsumgebung (z. B. das im gezeigten Beispiel verwendete Eclipse) die Methode toString eines Objekts beim Debugging verwendet, die (für Regelobjekte) den Wert des Attributs description berechnet:

Abbildung 3. Verwendung des Attributs description in einer integrierten EntwicklungsumgebungBeispiel für Eclipse
Tipp: Denken Sie daran, dass ein Attribut description die Aufgabe hat, eine Regelobjektinstanz und nicht die Regelklasse selbst zu beschreiben.

Insbesondere sollte die Berechnung des Regelattributs description Daten einschließen, die eine einfache Unterscheidung der verschiedenen Regelobjektinstanzen einer Regelklasse ermöglichen.