규칙 클래스

규칙 세트에 정의된 모든 CER 규칙 클래스는 동일한 규칙 세트의 데이터 유형으로 사용할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_ruleclassDataType"
  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="favoritePet">
      <type>
        <!-- 이 속성의 유형은 이 규칙 세트에
             정의된 규칙 클래스입니다.        -->
        <ruleclass name="Pet"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Pet">

    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>

상속

CER은 규칙 클래스의 단순 구현 상속을 지원합니다.

선택적으로 규칙 클래스가 extends 선언을 지정하여 동일한 규칙 세트의 다른 규칙 클래스를 하위 클래스로 분류할 수 있습니다.

하위 규칙 클래스는 모든 상위 클래스의 계산된 규칙 속성을 상속하고 선택적으로 이러한 속성을 대체하여 서로 다른 파생 계산 규칙을 제공합니다.

하위 규칙 클래스는 모든 상위 클래스의 초기화된 규칙 속성도 상속하고 하위 규칙 클래스의 모든 create 표현식은 하위 규칙 클래스 자체에 선언된 클래스 전에 하위 규칙 클래스의 모든 상위 규칙 클래스에 대한 초기화된 속성 값을 지정해야 합니다.

CER에서는 속성을 abstract으로 선언할 수 있습니다. 추상 속성을 정의하거나 상속하는(단 대체하지는 않음) 모든 규칙 클래스는 추상으로 선언되어야 합니다. 추상 클래스는 create 표현식에서 사용할 수 없습니다.

CER을 사용하면 상위 규칙 클래스 중 하나가 필요한 경우마다 규칙 클래스의 규칙 오브젝트 인스턴스가 리턴될 수 있습니다.

규칙 세트의 표현식이 호환되지 않는 값을 리턴하려고 하면 CER 규칙 세트 유효성 검증기가 오류를 보고합니다.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_ruleclassInheritance"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">


  <!-- 이 규칙 클래스에 추상 규칙 속성이
       포함되므로 CER 규칙 세트 유효성 검증기에서는 이 규칙 클래스가
       추상으로 표시되어야 합니다. -->
  <Class name="Resource" abstract="true">
    <Initialization>
      <!-- 자원 규칙 오브젝트를 작성할 때마다
           해당 소유자도 초기화해야 합니다.

           자원은 추상이므로
           <create> 표현식에서 사용될 수 없습니다.
           구체적 서브클래스만 사용될 수 있습니다. -->
      <Attribute name="owner">
        <type>
          <ruleclass name="Person"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- 자원의 화폐 가치입니다. -->
    <Attribute name="value">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- 모든 자원에는 금액이 있지만
             하위 클래스마다 다른 방법으로 계산됩니다. -->
        <abstract/>
      </derivation>
    </Attribute>
  </Class>

  <!-- 빌딩은 자원의 유형입니다. -->
  <Class name="Building" extends="Resource">
    <!-- 예를 들어, 빌딩의 실제 주소는
         123 Main Street입니다.

         수퍼 규칙 클래스의 초기화된
         속성인 상속된 소유자
         규칙 속성 외에도
         주소 값을 지정해야
         합니다. -->
    <Initialization>
      <Attribute name="address">
        <type>
          <javaclass name="String"/>
        </type>
      </Attribute>
    </Initialization>


    <!-- 빌딩은 구체적
         클래스이므로(말장난이 아님) CER
         규칙 세트 유효성 검증기에서는 이 클래스가
         상속된 모든 추상 규칙 속성의 계산을
         상속하거나 선언하도록 합니다. -->
    <Attribute name="value">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <arithmetic operation="-">
          <reference attribute="purchasePrice"> </reference>
          <reference attribute="outstandingMortgageAmount"/>
        </arithmetic>

      </derivation>
    </Attribute>

    <!-- 빌딩의 댓가로 원래 지불된 가격입니다. -->
    <Attribute name="purchasePrice">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- 이 빌딩과 관련하여 미지불된 대출 또는
         융자 금액입니다. -->
    <Attribute name="outstandingMortgageAmount">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Vehicle" extends="Resource">
    <Initialization>
      <Attribute name="registrationPlate">
        <type>
          <javaclass name="String"/>
        </type>
      </Attribute>
    </Initialization>

    <Attribute name="value">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <!-- 이 유형의 자원 값은 계산되지 않고
             직접 지정됩니다. -->
        <specified/>

      </derivation>
    </Attribute>

  </Class>

  <Class name="Person">

    <!-- 초기화된 속성이 상속되는 방식을 표시하는
         샘플 속성입니다. -->
    <Attribute name="sampleBuilding">
      <type>
        <ruleclass name="Building"/>
      </type>
      <derivation>
        <create ruleclass="Building">
          <!-- 첫 번째 초기화된 규칙 속성은
               자원에서 상속됩니다.

               이 개인이 소유자가 되도록 설정합니다. -->
          <this/>
          <!-- 두 번째 초기화된 규칙 속성은
            빌딩에 직접 지정됩니다.

            빌딩의 주소를 설정합니다. -->
          <String value="123 Main Street"/>
        </create>
      </derivation>
    </Attribute>

    <!-- 빌딩이 자원으로 리턴될 수 있는
         방법(빌딩이 자원"이기" 때문)을
         표시하는 샘플 속성 -->
    <Attribute name="sampleResource">
      <type>
        <ruleclass name="Resource"/>
      </type>
      <derivation>
        <reference attribute="sampleBuilding"/>
      </derivation>
    </Attribute>


  </Class>

</RuleSet>

루트 규칙 클래스

규칙 클래스가 확장할 다른 규칙 클래스를 지정하지 않으면 규칙 클래스가 CER의 "루트" 규칙 클래스를 자동으로 확장합니다. 이 "루트" 규칙 클래스에는 하나의 description 규칙 속성이 포함되어 있습니다.

description 규칙 속성은 규칙 오브젝트 인스턴스의 자국어 지원 가능 설명을 제공합니다. 규칙 클래스가 규칙 오브젝트 인스턴스에 대한 description 규칙 계산에서 파생된 사항을 대체할 수 있습니다.

모든 Java 클래스가 궁극적으로 java.lang.Object에서 상속되는 방식과 비슷하게 모든 규칙 클래스는 궁극적으로 루트 규칙 클래스에서 상속됩니다(따라서 description 규칙 속성을 포함함).

루트 규칙 클래스가 제공하는 description 규칙 속성의 기본 구현에서는 defaultDescription 표현식을 사용합니다.