예제

다음은 create 표현식을 사용하여 규칙에서 규칙 오브젝트를 조건부로 작성하는 예제 CER 규칙 세트입니다.

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

    <!-- <create>를 사용하여 새 규칙 오브젝트를 얻습니다.

         기타 계산(이 규칙 오브젝트나 다른 규칙 오브젝트에 대한)에서
         이 속성을 참조하여 새로 작성된 이 규칙 오브젝트에
         액세스할 수 있습니다. 즉, 다음과 같습니다.

         <reference attribute="minorAgeRangeTest"/> .

         작성된 규칙 오브젝트는 <readall> 표현식을 사용하여
         검색할 수 없습니다.
     -->
    <Attribute name="minorAgeRangeTest">
      <type>
        <ruleclass name="AgeRangeTest"/>
      </type>
      <derivation>
        <!-- 이 개인의 나이가 0 - 17(포함)세인지(즉,
             18세 미만)를 확인하는 나이 범위 테스트를
             작성합니다.
          -->
        <create ruleclass="AgeRangeTest">
          <this/>
          <Number value="0"/>
          <Number value="17"/>
        </create>
      </derivation>

    </Attribute>

    <!-- 나이 범위 검사를 사용하여 이 개인이
         미성년자인지를 판별합니다. -->
    <Attribute name="isMinor">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <reference attribute="isPersonInAgeRange">
          <reference attribute="minorAgeRangeTest"/>
        </reference>
      </derivation>
    </Attribute>

    <!-- 새 규칙 오브젝트를 얻기 위해 다른 표현식에서 <create>를
         사용합니다.

         새 규칙 오브젝트가 "익명으로" 작성되므로
         다른 규칙 오브젝트에서는 사용할 수 없습니다(단, SessionDoc에서는
         여전히 "작성됨"으로 표시됨).
    -->
    <Attribute name="isOfWorkingAge">
      <type>
        <javaclass name="Boolean"/>
      </type>
      <derivation>
        <!-- 이 개인이 법적으로 일할 수 있는지(즉,
             나이가 16세 이상 65세 미만)를 검사하는
             나이 범위 테스트를 작성한 다음
             테스트가 통과했는지 확인합니다. -->
        <reference attribute="isPersonInAgeRange">
          <create ruleclass="AgeRangeTest">
            <this/>
            <Number value="16"/>
            <Number value="64"/>
          </create>
        </reference>
      </derivation>

    </Attribute>

  </Class>

  <!-- 개인의 나이가 지정된 범위(포함)에
       범위(포함)에 있는지를 검사하는
       일반 테스트입니다. -->
  <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="&lt;=">
                <reference attribute="age">
                  <reference attribute="person"/>
                </reference>
                <reference attribute="maximumAge"/>
              </compare>
            </members>
          </fixedlist>
        </all>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>
참고: 모든 CER 표현식의 경우 create 표현식은 요청 시에만 계산됩니다. 예를 들어, minorAgeRangeTest 규칙 오브젝트는 클라이언트 코드나 다른 계산에서 해당 값 또는 isMinor 값이 요청된 경우에만 작성됩니다.

위의 예제에서는 isOfWorkingAge가 새로 작성된 규칙 오브젝트의 일부 속성을 참조하는 규칙 오브젝트를 작성하도록 표현식에 포함시켜 규칙 오브젝트를 "익명"으로 작성하는 기술을 사용합니다. 이러한 규칙 오브젝트는 다른 계산에서는 사용할 수 없지만 생성된 SessionDoc에는 여전히 표시됩니다.

익명의 규칙 오브젝트는 작성된 규칙 오브젝트의 규칙 속성에 액세스해야 하는 경우 유용하게 사용할 수 있지만 작성된 해당 규칙 오브젝트 자체를 다른 계산에서 사용하게 만들 필요는 없습니다.

내부 규칙 오브젝트 풀링

Cúram V6부터 CER은 세션 중에 작성된 내부 규칙 오브젝트 "풀"을 유지합니다.

create 표현식을 평가할 때마다 세션의 풀을 조회합니다. 동일한 초기화 및/또는 지정된 매개변수가 있는 규칙 오브젝트가 이미 작성된 경우 작성된 새 규칙 오브젝트가 아니라 풀에서 재사용됩니다.

이 풀링 접근 방법은 여러 create 명령문이 "동일한" 규칙 오브젝트를 작성하려고 시도하는 경우 효율성이 증대됩니다. 단일 규칙 오브젝트를 사용하면 여러 "동일한" 규칙 오브젝트에서 여러 번의 동일한 계산이 수행되지 않고 이 단일 규칙 오브젝트에서 계산된 속성이 최대 한 번만 계산됩니다.

CER의 핵심 원칙에 따라 모든 계산은 입력 사항에만 종속되므로 입력 내용이 동일하면 결과도 동일하게 보장되기 때문에 풀링된 규칙 오브젝트를 재사용하면 안전이 보장됩니다.