표준 오퍼레이션 생성 메커니즘에는 다음 사항이 포함됩니다.
site.prp 파일에서 각 표준 오퍼레이션에 대해 클래스 레벨 특성 쌍을 제공해야 합니다. 이름의 형식은 다음과 같습니다.
이름의 "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
정의하는 표준 오퍼레이션의 코드에 클래스 멤버의 조작을 포함시키려는 경우, Rational Rhapsody는 클래스의 각 속성, 관계 또는 오퍼레이션에 대해 반복되는 코드를 생성하는 키워드를 제공합니다.
클래스의 모든 속성을 포함하는 코드를 정의하려면 다음을 수행하십시오.
클래스의 모든 연관을 포함하는 코드를 정의하려면 다음을 수행하십시오.
클래스의 모든 오퍼레이션을 포함하는 코드를 정의하려면 다음을 수행하십시오.
클래스의 각 인수에 대해 반복되는 코드를 정의할 수도 있습니다. 여기에는 클래스에 포함된 오퍼레이션의 모든 인수를 비롯한 이벤트 인수도 포함됩니다.
모든 인수를 포함하는 코드를 정의하려면 다음을 수행하십시오.
템플리트 클래스의 표준 오퍼레이션을 정의할 때 $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
클래스가 확장하는 기본 클래스에서 정보를 가져오는 코드를 정의할 수도 있습니다.
해당 코드를 정의하려면 다음을 수행하십시오.
CG::Class::StandardOperations 특성은 쉼표로 구분되는 오퍼레이션 참조 목록을 사용하며 이 목록은 사용자의 site.prp 파일에 포함된 특성 이름을 기반으로 합니다.
이름이 op1Declaration, op1Definition, op2Declaration 및 op2Definition인 클래스 레벨 특성을 추가한 경우, op1, op2를 해당 클래스의 StandardOperations 특성 값으로 지정하면 클래스에 대해 두 개의 표준 오퍼레이션이 생성됩니다.
이 예제는 표준 오퍼레이션 기능을 사용하여 이벤트의 직렬화를 구현하는 방법을 보여줍니다. 이 접근법은 직렬화 해제를 구현하는 방법과 유사합니다.
지정된 패키지의 모든 이벤트에 대한 오퍼레이션을 생성하려면 다음을 수행하십시오.
CG::Event::serializeDeclaration
public: strstream & serializer(strstream & theStrStream) const;
CG::Event::serializeDefinition
strstream & $Name::serialize(strstream & theStrStream) {
$Base
$Arguments
return theStrStream;
}
CG::Argument::serialize
theStrStream << $Name;
CG::Event::serializeBase
$Name::serialize(theStrStream);
두 개의 인수 severity 및 priority를 사용하여 , VoiceAlarm 이벤트를 정의했으며 VoiceAlarm이 Alarm에서 상속하는 경우, 생성되는 코드는 다음과 같습니다.
strstream & VoiceAlarm::serialize(strstream & theStrStream) {
Alarm::serialize(theStrStream);
theStrStream << severity;
theStrStream << priority;
return theStrStream;
}