產生標準作業

您可能會想將標準作業用於許多目的,例如複製建構子、序列化或置換基礎類別的虛擬作業。Rational® Rhapsody® 提供了在產生的程式碼中包括標準作業的機制。

用於產生標準作業的機制涉及:

在 site.prp 檔案中為標準作業指定程式碼

Declaration 和 definition 內容

在 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;
}

意見回饋