choose

Dieser Ausdruck wählt einen Wert auf der Grundlage einer erfüllten Bedingung aus.

Der Ausdruck choose enthält Folgendes:

Die Bedingungen werden in der Reihenfolge der Ausdrücke when ausgewertet. Die Auswertung stoppt bei der ersten Bedingung, die den Test erfüllt. Nachfolgende Bedingungen werden nicht ausgewertet.

Der Ausdruck choose entspricht den Anweisungen if / else if /.../ else, die für die meisten Programmiersprachen typisch sind. Mit seiner Hilfe kann effektiv eine Entscheidungstabelle implementiert werden.

Es kann sinnvoll sein, die Bedingungen so anzuordnen, dass die am ehesten erfolgreichen Bedingungen am Beginn der Liste angegeben sind (was unnötige Berechnungen verhindert).

Achtung: Bei einfachen Bedingungen (z. B. zum Testen der Gleichheit mit einem einzelnen Wert) können Sie die Bedingungen normalerweise umordnen, ohne das Verhalten des Regelwerks zu beeinflussen.

Bei komplexeren Berechnungen (und somit im Allgemeinen) müssen Sie jedoch sorgfältig prüfen, ob eine andere Anordnung der Bedingungen zu unerwünschten Verhaltensänderungen führt.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_choose"
  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>

    <Attribute name="ageCategory">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <choose>
          <!-- There's no explicit <test> clause, so this
               <choose> statement will test each condition to
               see if it is TRUE. -->
          <type>
            <javaclass name="String"/>
          </type>

          <!-- Note that the order of these conditions is
               important; if we were to swap the positions of the
               "Newborn" and "Infant" tests, then all children
               under 5 (including those under 1) would be
               identified as Infants; no children would be
               identified as Newborns.  -->
          <when>
            <condition>
              <compare comparison="&lt;">
                <reference attribute="age"/>
                <Number value="1"/>
              </compare>
            </condition>
            <value>
              <String value="Newborn"/>
            </value>
          </when>
          <when>
            <condition>
              <compare comparison="&lt;">
                <reference attribute="age"/>
                <Number value="5"/>
              </compare>
            </condition>
            <value>
              <String value="Infant"/>
            </value>
          </when>
          <when>
            <condition>
              <compare comparison="&lt;">
                <reference attribute="age"/>
                <Number value="18"/>
              </compare>
            </condition>
            <value>
              <String value="Child"/>
            </value>
          </when>
          <otherwise>
            <value>
              <String value="Adult"/>
            </value>
          </otherwise>
        </choose>
      </derivation>
    </Attribute>

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

    <Attribute name="maritalStatus">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <choose>
          <type>
            <javaclass name="String"/>
          </type>
          <!-- Test the number of spouses -->
          <test>
            <reference attribute="numberOfSpouses"/>
          </test>
          <!-- Note that the order of the "0" and "1" tests do not
 matter -
               so you might want to order these according to whether
 most
               Person instances being tested have 0 or 1 spouses.
      -->
          <when>
            <condition>
              <Number value="0"/>
            </condition>
            <value>
              <String value="Unmarried"/>
            </value>
          </when>
          <when>
            <condition>
              <Number value="1"/>
            </condition>
            <value>
              <String value="Married - single spouse"/>
            </value>
          </when>
          <otherwise>
            <value>
              <String value="Married - multiple spouses"/>
            </value>
          </otherwise>
        </choose>

      </derivation>
    </Attribute>

  </Class>

</RuleSet>