標準操作の生成

標準操作は、コピー・コンストラクター、シリアル化、または基底クラスの仮想操作のオーバーライドなど、多くの目的で使用できます。 Rational® Rhapsody® は、標準操作を生成されたコードに組み込むためのメカニズムを提供します。

標準操作を生成するためのメカニズムには、次が必要です。

site.prp ファイルで標準操作のコードを指定

Declaration プロパティーおよび Definition プロパティー

site.prp ファイルで、各標準操作に 1 ペアのクラス・レベルのプロパティーを指定する必要があります。 この名前では、以下のフォーマットを使用する必要があります。

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

名前の "op1" 部分は、この標準操作を参照するために StandardOperations プロパティーで使用するストリングです。

Declaration プロパティーのコンテンツは、関連する .h ファイルに生成されます。 Definition プロパティーのコンテンツは、関連する .c または .cpp ファイルに生成されます。

通常、これらのプロパティーの値では、1 つ以上の 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::op1 などの CG::Attribute::(標準操作の参照名) というプロパティーを作成します。 このプロパティーを使用して、クラスのすべての属性に適用するコードを指定します。 コードでは、属性の名前として $Name などの標準のキーワードを使用できます。
  • 標準操作用に作成した Definition プロパティーの値内で、この属性に関連するコードを生成する場所にキーワード $Attributes を挿入します。

クラスのすべての関連を含むコードを定義するには、次のようにします。

  • site.prp ファイルで、CG::Relation::op1 などの CG::Relation::(標準操作の参照名) というプロパティーを作成します。 このプロパティーを使用して、クラスのすべての関連に適用するコードを指定します。 コードでは、関連の名前として $Name などの標準のキーワードを使用できます。
  • 標準操作用に作成した Definition プロパティーの値内で、この関係に関連するコードを生成する場所にキーワード $Relations を挿入します。

クラスのすべての操作を含むコードを定義するには、次のようにします。

  • site.prp ファイルで、CG::Operation::op1 などの CG::Operation::(標準操作の参照名) というプロパティーを作成します。 このプロパティーを使用して、クラスのすべての操作に適用するコードを指定します。 コードでは、操作の名前として $Name などの標準のキーワードを使用できます。
  • 標準操作用に作成した Definition プロパティーの値内で、この操作に関連するコードを生成する場所にキーワード $Operations を挿入します。

引数のコードの定義

クラスの各引数に対して繰り返されるコードを定義することもできます。 これには、イベント引数およびクラスに存在する操作のすべての引数が含まれます。

すべての引数を含むコードを定義するには、次のようにします。

  • site.prp ファイルで、CG::Argument::op1 などの CG::Argument::(標準操作の参照名) というプロパティーを作成します。 このプロパティーを使用して、すべての引数に適用するコードを指定します。 コードでは、引数の名前として $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 ファイルで、op1Base などの CG::Class::(標準操作の参照名)Base というプロパティーを作成します。 このプロパティーを使用して、基底クラスに基づくコードを指定します。 このコードで $Attributes のようなキーワードを使用する場合は、基底クラスの各属性に、プロパティー CG::Attribute::op1 を使用して指定したコードが生成されます。
  • 標準操作用に作成した Definition プロパティーの値内で、この基底クラスに関連するコードを生成する場所にキーワード $Base を挿入します。

クラスに生成する標準操作の指定

プロパティー CG::Class::StandardOperations は、site.prp ファイルに挿入されたプロパティー名に基づいて、操作参照のコンマ区切りのリストを取得します。

op1Declaration、op1Definition、op2Declaration、および op2Definition という名前のクラス・レベルのプロパティーを追加した場合は、クラスのプロパティー StandardOperations の値として op1、op2 を指定すると、そのクラスに 2 つの標準操作が生成されます。

注: プロパティー CG::Class::StandardOperations の値は、個別クラスより上のレベルで設定することもできます。 例えば、パッケージ・レベルでプロパティー値を設定すると、そのパッケージ内のすべてのクラスに標準操作が生成されます。

例 - シリアル化での標準操作の使用

この例では、標準操作フィーチャーを使用して、イベントのシリアル化を実装する方法を示します。 このアプローチは、非シリアル化の実装と同様です。

特定のパッケージのすべてのイベントで操作を生成するには、次のようにします。

生成されるコード

2 つの引数 severitypriority を持つ VoiceAlarm という名前のイベントを定義し、VoiceAlarm が Alarm から継承する場合、生成されるコードは以下のようになります。

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

フィードバック