표준 오퍼레이션 생성

사본 생성자, 직렬화 또는 기본 클래스의 가상 오퍼레이션 대체 등의 목적으로 표준 오퍼레이션을 사용해야 하는 경우가 있습니다. Rational® Rhapsody®는 표준 오퍼레이션을 생성된 코드에 포함시키는 데 사용하는 메커니즘입니다.

표준 오퍼레이션 생성 메커니즘에는 다음 사항이 포함됩니다.

site.prp 파일의 표준 오퍼레이션 코드 지정

선언 및 정의 특성

site.prp 파일에서 각 표준 오퍼레이션에 대해 클래스 레벨 특성 쌍을 제공해야 합니다. 이름의 형식은 다음과 같습니다.

  • CG::Class::op1Declaration
  • CG::Class::op1Definition

이름의 "op1" 부분은 이 표준 오퍼레이션을 가리킬 StandardOperations 특성에 사용할 문자열입니다.

Declaration 특성의 컨텐츠는 관련 .h 파일에 생성됩니다. Definition 특성의 컨텐츠는 관련 .c 또는 .cpp 파일에 생성됩니다.

일반적으로 이러한 특성 값에서 하나 이상의 IBM Rational Rhapsody 키워드를 사용합니다. 예를 들면, 다음과 같습니다.

Subject CG
	Metaclass Class
		Property op1Declaration MultiLine "void $Name;"
		Property op1Definition MultiLine "void $Name:  $Name() {int x=7;}"
		Property op2Declaration MultiLine "void $Name_serialize;"
		Property op2Definition MultiLine "void $Name:  $Name_serialize{}"
	end
end
참고: site.prp 파일에 추가되는 특성 쌍은 C 및 C++에 맞게 디자인되어 있습니다. Java를 사용하는 경우 오퍼레이션에 Definition 특성만 추가해도 되며(예: javaOp1Definition) 필요한 모든 Java 코드를 해당 특성 값에 포함시켜야 합니다.

클래스 멤버의 코드 정의

정의하는 표준 오퍼레이션의 코드에 클래스 멤버의 조작을 포함시키려는 경우, Rational Rhapsody는 클래스의 각 속성, 관계 또는 오퍼레이션에 대해 반복되는 코드를 생성하는 키워드를 제공합니다.

클래스의 모든 속성을 포함하는 코드를 정의하려면 다음을 수행하십시오.

  • site.prp 파일에서 CG::Attribute::(표준 오퍼레이션의 참조 이름) 특성을 작성하십시오. 예: CG::Attribute::op1 이 특성을 사용하여 클래스의 모든 속성에 적용할 코드를 지정하십시오. 코드에서 속성 이름에 $Name과 같은 표준 키워드를 사용할 수 있습니다.
  • 표준 오퍼레이션에 작성한 Definition 특성 값에서 이 속성 관련 코드를 생성할 위치에 $Attributes 키워드를 삽입하십시오.

클래스의 모든 연관을 포함하는 코드를 정의하려면 다음을 수행하십시오.

  • site.prp 파일에서 CG::Relation::(표준 오퍼레이션의 참조 이름) 특성을 작성하십시오. 예: CG::Relation::op1 이 특성을 사용하여 클래스의 모든 연관에 적용할 코드를 지정하십시오. 코드에서 연관 이름에 $Name과 같은 표준 키워드를 사용할 수 있습니다.
  • 표준 오퍼레이션에 작성한 Definition 특성 값에서 이 관계와 관련된 코드를 생성할 위치에 $Relations 키워드를 삽입하십시오.

클래스의 모든 오퍼레이션을 포함하는 코드를 정의하려면 다음을 수행하십시오.

  • site.prp 파일에서 CG::Operation::(표준 오퍼레이션의 참조 이름) 특성을 작성하십시오. 예: CG::Operation::op1 이 특성을 사용하여 클래스의 모든 오퍼레이션에 적용할 코드를 지정하십시오. 코드에서 오퍼레이션 이름에 $Name과 같은 표준 키워드를 사용할 수 있습니다.
  • 표준 오퍼레이션에 작성한 Definition 특성 값에서 이 오퍼레이션 관련 코드를 생성할 위치에 $Operations 키워드를 삽입하십시오.

인수 코드 정의

클래스의 각 인수에 대해 반복되는 코드를 정의할 수도 있습니다. 여기에는 클래스에 포함된 오퍼레이션의 모든 인수를 비롯한 이벤트 인수도 포함됩니다.

모든 인수를 포함하는 코드를 정의하려면 다음을 수행하십시오.

  • site.prp 파일에서 CG::Argument::(표준 오퍼레이션의 참조 이름) 특성을 작성하십시오. 예: CG::Argument::op1 이 특성을 사용하여 모든 인수에 적용할 코드를 지정하십시오. 코드에서 인수 이름에 $Name과 같은 표준 키워드를 사용할 수 있습니다.
  • 표준 오퍼레이션에 작성한 Definition 특성 값에서 이 인수와 관련된 코드를 생성할 위치에 $Arguments 키워드를 삽입하십시오.

템플리트 클래스 코드 정의

템플리트 클래스의 표준 오퍼레이션을 정의할 때 $NameWithTemplateParams 키워드를 사용할 수 있습니다. 이름이 ClassA인 클래스가 있고 이것이 템플리트인 경우 이 키워드는 "ClassA<params>"로 대체됩니다. 클래스가 템플리트가 아닌 경우, 키워드는 "ClassA"로 대체됩니다. 다음 특성 정의는 사본 생성자 정의 시 이 키워드의 사용을 나타냅니다.

Subject CG
	Metaclass Class
		Property CopyCtorDeclaration MultiLine "$Name(const $NameWithTemplateParams & x);"
		Property CopyCtorDefinition MultiLine "$NameWithTemplateParams::$Name(const $NameWithTemplateParams & x) { /* some code */ }"
  end

기본 클래스 코드 정의

클래스가 확장하는 기본 클래스에서 정보를 가져오는 코드를 정의할 수도 있습니다.

해당 코드를 정의하려면 다음을 수행하십시오.

  • site.prp 파일에서 CG::Class::(표준 오퍼레이션의 참조 이름)Base 특성을 작성하십시오. 예: op1Base 이 특성을 사용하여 기본 클래스를 기초로 사용할 코드를 지정하십시오. 이 코드에서 $Attributes와 같은 키워드를 사용하는 경우, 기본 클래스의 각 속성에 대해 CG::Attribute::op1 특성으로 지정한 코드가 생성됩니다.
  • 표준 오퍼레이션에 작성한 Definition 특성 값에서 이 기본 클래스 관련 코드를 생성할 위치에 $Base 키워드를 삽입하십시오.

클래스에 대해 생성할 표준 오퍼레이션 지정

CG::Class::StandardOperations 특성은 쉼표로 구분되는 오퍼레이션 참조 목록을 사용하며 이 목록은 사용자의 site.prp 파일에 포함된 특성 이름을 기반으로 합니다.

이름이 op1Declaration, op1Definition, op2Declaration 및 op2Definition인 클래스 레벨 특성을 추가한 경우, op1, op2를 해당 클래스의 StandardOperations 특성 값으로 지정하면 클래스에 대해 두 개의 표준 오퍼레이션이 생성됩니다.

참고: CG::Class::StandardOperations 특성 값은 개별 클래스 레벨보다 높게 설정할 수 있습니다. 예를 들어, 패키지 레벨의 특성 값을 설정하는 경우, 패키지의 모든 클래스에 대해 표준 오퍼레이션이 생성됩니다.

예제 - 직렬화에 표준 오퍼레이션 사용

이 예제는 표준 오퍼레이션 기능을 사용하여 이벤트의 직렬화를 구현하는 방법을 보여줍니다. 이 접근법은 직렬화 해제를 구현하는 방법과 유사합니다.

지정된 패키지의 모든 이벤트에 대한 오퍼레이션을 생성하려면 다음을 수행하십시오.

생성된 코드

두 개의 인수 severitypriority를 사용하여 , VoiceAlarm 이벤트를 정의했으며 VoiceAlarm이 Alarm에서 상속하는 경우, 생성되는 코드는 다음과 같습니다.

strstream & VoiceAlarm::serialize(strstream & theStrStream) {
   Alarm::serialize(theStrStream);
   theStrStream << severity;
   theStrStream << priority;
   return theStrStream;
}

피드백