El atributo de regla description

Cada clase de regla hereda básicamente de una "clase de regla raíz" de CER. Esta clase raíz incluye un atributo de regla description que tiene una implementación predeterminada (pero no especialmente útil).

El valor de un atributo description de objeto de regla se produce en RuleDoc y también mediante el método toString en un RuleObject (que muchos IDE Java utilizando cuando se "pulsa" en una variable). Como tal, una descripción (description) significativa puede ser indispensable al comprender el comportamiento del conjunto de reglas.

Debe alterar temporalmente el cálculo de description predeterminado creando explícitamente un atributo description en cada una de las clases de regla. Puede utilizar el Editor CER para crear un atributo description como se crea un atributo normal en cualquier clase de regla. El validador de conjunto de reglas CER emitirá un aviso si tiene una clase de regla que no define (o hereda de otra clase de regla definida) un atributo de regla description.

El atributodescription es un mensaje traducible y (como otros atributos de regla) su cálculo puede ser tan simple o tan complejo como sea necesario.

A continuación se muestra un conjunto de reglas de ejemplo, donde algunas clases de regla proporcionan una implementación 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>

    <!-- Alterar temporalmente la descripción predeterminada -->
    <Attribute name="description">
      <type>
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Concatenar el nombre y apellido de la persona -->
        <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">
    <!-- La persona con la que este
         registro de ingresos está relacionado. -->
    <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>

    <!-- Alterar temporalmente la descripción predeterminada -->
    <Attribute name="description">
      <type>
        <javaclass name="curam.creole.value.Message"/>
      </type>
      <derivation>
        <!-- Concatenar la descripción de la persona y la fecha
 de inicio-->
        <concat>
          <fixedlist>
            <listof>
              <javaclass name="Object"/>
            </listof>
            <members>

              <reference attribute="description">
                <reference attribute="person"/>
              </reference>
              <!-- En un conjunto de reglas real, esta descripción utilizará
                   un <ResourceMessage> para evitar series codificadas
                   monolingües.-->
              <String value="'s income, starting on "/>
              <reference attribute="startDate"/>
            </members>
          </fixedlist>
        </concat>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Benefit">
    <!-- NB ninguna alteración temporal de <description>; el validador de conjunto de reglas CER
         emitirá un aviso y los objetos de regla esta clase
         serán más difíciles de entender en RuleDoc o un
         entorno de desarrollo integrado. -->
    <!-- La persona con la que este
         registro de prestación está relacionado. -->
    <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>

Y aquí se muestra una clase de prueba que crea algunos objetos de regla (Person, Income y 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;

/**
 * Prueba el atributo de regla de descripción.
 */
public class TestDescription extends TestCase {

  /**
   * Prueba el atributo de regla de descripción.
   */
  public void testDescriptions() {

    /**
     * Crear una sesión nueva.
     */
    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new StronglyTypedRuleObjectFactory()));

    /**
     * Crear un SessionDoc para informar sobre objetos de regla.
     */
    final SessionDoc sessionDoc = new SessionDoc(session);

    /*
     * Crear un objeto de regla Person.
     */
    final Person person =
        Person_Factory.getFactory().newInstance(session);
    person.firstName().specifyValue("Juan");
    person.lastName().specifyValue("Herrero");

    /*
     * Crear un objeto de regla Income.
     */
    final Income income =
        Income_Factory.getFactory().newInstance(session);
    income.person().specifyValue(person);
    income.amount().specifyValue(123);
    income.startDate().specifyValue(Date.fromISO8601("20070101"));

    /*
     * Crear un objeto de regla Benefit.
     */
    final Benefit benefit =
        Benefit_Factory.getFactory().newInstance(session);
    benefit.person().specifyValue(person);
    benefit.amount().specifyValue(234);

    /*
     * El método .toString evalúa el atributo de regla
     * de descripción
     */
    System.out.println(person.toString());

    /*
     * println llama a un método toString de un objeto para imprimirlo.
     */
    System.out.println(income);

    /*
     * La clase de regla de prestación no proporciona una implementación
     * del atributo de regla de descripción, por lo tanto aquí obtendremos una
     * descripción predeterminada
     */
    System.out.println(benefit);

    /*
     * Escribir SessionDoc para esta sesión.
     */
    sessionDoc.write(new File("./gen/sessiondoc"));
>
  }

}

Cuando la prueba se ejecuta, produce esta salida, mostrando las descripciones de objeto de regla:

Juan Herrero
Ingresos de Juan Herrero, a partir del 01/01/07 00:00
Instancia no descrita de la clase de regla 'Benefit', id '3'

Al final de la prueba, los objetos de regla de la sesión se producen como SessionDoc. El resumen de SessionDoc de alto nivel muestra los objetos de regla creados y lista la descripción de cada objeto de regla:

Figura 1. SessionDoc que muestra los valores de description de objeto de reglaEjemplo de documentación de sesión generada.

La descripción para el objeto de regla Benefit es la descripción predeterminada; en ausencia de una buena implementación de description, alguien que lea el SessionDoc puede tener que navegar al SessionDoc para el objeto de regla Benefit a fin de comprenderlo:

Figura 2. SessionDoc para un objeto de regla sin alteración temporal de description Ejemplo de documentación de sesión generada.

Por último, esta captura de pantalla muestra cómo un entorno de desarrollo integrado (por ejemplo Eclipse, mostrado) utiliza el método toString de un objeto al depurar, que (para los objetos de regla) calcula la descripción (description):

Figura 3. Uso de description en un entorno de desarrollo integradoEjemplo de Eclipse.
Consejo: Recuerde que la finalidad de description es describir una instancia de objeto de regla, no la clase de regla propiamente dicha.

En concreto, el cálculo del atributo de regla description debe incluir datos, lo que significa que es fácil distinguir entre instancias de objeto de regla diferentes de la clase de regla.