Das folgende Beispiel zeigt ein CER-Regelwerk, das den Ausdruck "create" (siehe create) verwendet, um eine bedingte Erstellung von Regelobjekten aus Regeln vorzunehmen:
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_internalRuleObjects" 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> <!-- Uses <create> to get a new rule object. Other calculations (on this or other rule objects) can access this newly-created rule object by referring to this attribute, i.e. <reference attribute="minorAgeRangeTest"/> . The rule object created CANNOT be retrieved using a <readall> expression. --> <Attribute name="minorAgeRangeTest"> <type> <ruleclass name="AgeRangeTest"/> </type> <derivation> <!-- Create an age-range test which checks whether this person is aged between 0-17 inclusive (i.e. is under 18 years). --> <create ruleclass="AgeRangeTest"> <this/> <Number value="0"/> <Number value="17"/> </create> </derivation> </Attribute> <!-- Uses the age-range check to determine whether this person is a minor. --> <Attribute name="isMinor"> <type> <javaclass name="Boolean"/> </type> <derivation> <reference attribute="isPersonInAgeRange"> <reference attribute="minorAgeRangeTest"/> </reference> </derivation> </Attribute> <!-- Uses <create> to get a new rule object, within another expression. Because the new rule object is created "anonymously", it is not available to any other rule objects (but it will still show up as "created" in any SessionDoc. --> <Attribute name="isOfWorkingAge"> <type> <javaclass name="Boolean"/> </type> <derivation> <!-- Create an age-range test which checks whether this person is legally permitted to work (i.e. is aged at least 16 and less than 65), and then check whether the test passes. --> <reference attribute="isPersonInAgeRange"> <create ruleclass="AgeRangeTest"> <this/> <Number value="16"/> <Number value="64"/> </create> </reference> </derivation> </Attribute> </Class> <!-- A generic test which checks whether the person's age lies within a specified (inclusive) range. --> <Class name="AgeRangeTest"> <Initialization> <Attribute name="person"> <type> <ruleclass name="Person"/> </type> </Attribute> <Attribute name="minimumAge"> <type> <javaclass name="Number"/> </type> </Attribute> <Attribute name="maximumAge"> <type> <javaclass name="Number"/> </type> </Attribute> </Initialization> <Attribute name="isPersonInAgeRange"> <type> <javaclass name="Boolean"/> </type> <derivation> <all> <fixedlist> <listof> <javaclass name="Boolean"/> </listof> <members> <compare comparison=">="> <reference attribute="age"> <reference attribute="person"/> </reference> <reference attribute="minimumAge"/> </compare> <compare comparison="<="> <reference attribute="age"> <reference attribute="person"/> </reference> <reference attribute="maximumAge"/> </compare> </members> </fixedlist> </all> </derivation> </Attribute> </Class> </RuleSet>
Im obigen Beispiel verwendet isOfWorkingAge das Verfahren für die "anonyme" Erstellung eines Regelobjekts. Hierzu wird die Erstellung des Regelobjekts in einen Ausdruck einschlossen, der auf ein Attribut im neu erstellten Regelobjekt verweist. Solche Regelobjekte sind nicht für andere Berechnungen verfügbar, werden jedoch in jedem generierten SessionDoc aufgeführt.
Ein anonymes Regelobjekt kann nützlich sein, wenn Sie in einem erstellten Regelobjekt auf Regelattribute zugreifen müssen, das erstellte Regelobjekt selbst jedoch nicht für andere Berechnungen zur Verfügung stehen muss.
Seit Cúram Version 6 behält CER einen "Pool" mit internen Regelobjekten bei, die während einer Sitzung erstellt wurden.
Der Pool der Sitzung wird immer dann abgefragt, wenn ein Ausdruck "create" (siehe create) ausgewertet wird. Falls bereits ein Regelobjekt mit derselben Initialisierung und/oder denselben angegebenen Parametern erstellt wurde, wird es aus dem Pool wiederverwendet, statt ein neues Regelobjekt zu erstellen.
Diese Strategie der Poolnutzung verbessert die Effizienz in Situationen, bei denen viele Anweisungen "create" (siehe create) versuchen, identische Regelobjekte zu erstellen. Die Verwendung eines einzigen Regelobjekts bedeutet, dass alle berechneten Attribute für das einzelne Regelobjekt höchstens ein Mal berechnet werden und keine identischen Berechnungen für viele identische Regelobjekte ausgeführt werden müssen.
Die Wiederverwendung von Regelobjekten aus dem Pool ist garantiert unbedenklich, da die Kernprinzipien von CER sicherstellen, dass jede Berechnung ausschließlich von ihren Eingabewerten abhängig ist, was wiederum bedeutet, dass identische Eingaben identische Ausgaben gewährleisten.