Dieser Ausdruck wählt einen Wert auf der Grundlage einer erfüllten Bedingung aus.
Der Ausdruck choose enthält Folgendes:
Eine Datentypkennung (siehe Unterstützte Datentypen), die den Typ des auszuwählenden Werts angibt.
Ein Ausdruck, der wiederum den für das Element condition in jedem Ausdruck when zu testenden Wert angibt. Falls kein Ausdruck test angegeben ist, wird das Element condition in jedem Ausdruck when gestestet, um zu überprüfen, ob der Wert true zurückgegeben wird.
Jeder Ausdruck enthält eine Bedingung (condition) für den Wert und einen Wert (value), der beim Erfüllen der Bedingung zurückgegeben wird.
Ein Ausdruck, der einen zurückzugebenden Wert (value) enthält (damit auf alle Fälle immer ein Wert ausgewählt wird).
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).
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="<"> <reference attribute="age"/> <Number value="1"/> </compare> </condition> <value> <String value="Newborn"/> </value> </when> <when> <condition> <compare comparison="<"> <reference attribute="age"/> <Number value="5"/> </compare> </condition> <value> <String value="Infant"/> </value> </when> <when> <condition> <compare comparison="<"> <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>