UML から C++ への変換の再実行時の考慮事項

UML から C++ への変換により、@generated タグが生成された特定の要素に追加されます。 変換の再実行時には、変換により、@generated タグつきの要素は上書きされます。 生成されたコードに対する変更を保護するには、コードに書きこまれた @generated タグを除去する必要があります。 モデル化できない C++ 要素を表現する場合は、変換出力のユーザー定義のセクションにコードを追加します。

変換により生成される要素

UML から C++ への変換により、@generated タグが以下の要素に追加されます。

生成されたコードの保護

UML から C++ への変換を再実行する場合、 デフォルトでは、変換によって生成されるメソッド本文も、ユーザーが作成したメソッド本文もその変換では上書きされません。 変換では、@generated タグを削除したかどうかにかかわらず、メソッド本文は常に保持されます。

以下の要素から @generated タグが削除されていない場合は、それが最上位にあってもネストされている場合でも、変換により上書きされます。
  • クラス
  • 構造体
  • 共用体
  • 型定義
  • 列挙型

変換では常にメソッド本文は保持されますが、 メソッドに対する構造上の変更点を保持するには、メソッドから @generated タグを削除する必要があります。 例えば、メソッド・シグニチャーを変更した場合や、コンストラクターにイニシャライザーを追加した場合、メソッドに例外を追加した場合、ソース・コードにコメントを追加した場合などは、そのメソッドから @generated タグを削除する必要があります。

@generated タグを削除しないと、@generated タグが適用される要素が変換により上書きされます。 変換では、以下の要素も上書きされます。
  • mutable、const、volatile、static、auto、および register の各キーワード
  • クラスのメンバー
  • パラメーター
注: ソースの UML モデルにメソッドを追加するには、後方変換を実行します。
以下の表には、変換により保持または上書きされる要素の例がリストされています。 変更されたコードの列には、以下の変更点が含まれるコードがリストされています。
変換を再実行すると、以下の項目が実行されます。
  • @generated タグが削除されているため、継承を保持します
  • @generated タグが削除されていないため、メソッド・シグニチャーへの変更を上書きします
  • 変換では新規のメソッド本文が属するメソッドが検索できないため、メソッド本文への変更を保存しません
  • メソッド本文 Operation2 への変更を保持します
UML モデル要素 生成されたコード 変更されたコード 変換の再実行後の生成されたコード
このイメージは、整数属性 と、パラメーターがない 2 つの操作が含まれている Class1 という名前の UML クラスを示しています。 Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//ファイル Class1.h のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.h のセクションの終了

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Class1 のセクションの開始
    //TODO: 保持する属性を追加します
    //Class1 のセクションの終了

    private:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation1();

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation2();


};  //クラス Class1 の終了
#endif
Class1.cpp:
#include "Class1.h"
//ファイル Class1.cpp のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.cpp のセクションの終了


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1() 
{
    //TODO 自動生成されたメソッド・スタブ
    return 0;
}


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2() 
{
    //TODO 自動生成されたメソッド・スタブ
    return 0;
}
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//ファイル Class1.h のセクションの開始
#include Class2.h
//ファイル Class1.h のセクションの終了

class Class1:public Class2
{

    //Class1 のセクションの開始
    //TODO: 保持する属性を追加します
    //Class1 のセクションの終了

    private:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation1(int parameter1);

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation2();


};  //クラス Class1 の終了
#endif
Class1.cpp:
#include "Class1.h"
//ファイル Class1.cpp のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.cpp のセクションの終了


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1(int parameter1) 
{
    int j = 1;
    return j;
}


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2() 
{
    int i = 2;
    return i;
}
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//ファイル Class1.h のセクションの開始
#include Class2.h
//ファイル Class1.h のセクションの終了

class Class1:public Class2
{

    //Class1 のセクションの開始
    //TODO: 保持する属性を追加します
    //Class1 のセクションの終了

    private:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation1();

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation2();


};  //クラス Class1 の終了
#endif
Class1.cpp:
#include "Class1.h"
//ファイル Class1.cpp のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.cpp のセクションの終了


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1() 
{
    //TODO 自動生成されたメソッド・スタブ
    return 0;
}


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2() 
{
    int i = 2;
    return I;
}

新規コードの保護

変換では、C++ コードに追加した属性、ネスト・クラス、構造体、共用体、および列挙は、それらの要素に誤って @generated タグが追加されない限り、上書きされません。
注: ソース UML モデルに属性、ネスト・クラス、構造体、共用体、または列挙を追加する場合は、後方変換を実行してください。
また、変換で作成されるユーザー定義セクションにコードを追加することもできます。 変換では、ユーザー定義セクション内に指定されたコードは上書きも削除もされません。 以下の表には、変換で生成されるユーザー定義セクションの場所がリストされ、その使用方法が例示されています。
変換出力 ユーザー定義セクションの場所と使用方法
ヘッダー・ファイルおよびボディ・ファイル 変換により、1 つのユーザー定義セクションがそれぞれのファイルの先頭に追加されます。 このセクションを使用して、以下のタイプのステートメントを指定できます。
  • #include
  • #defines
  • using
クラス、共用体、構造体、列挙 これらのユーザー定義セクションを使用して、UML ではモデル化できない属性、操作、またはその両方を指定できます。 例えば、ユーザー定義セクションには、int myFunction(int* myOtherFunction) 属性などの関数ポインター属性を指定できます。

@generated タグおよびユーザー定義セクションによって柔軟性が提供されますが、発生する可能性のある問題を回避するには、生成されたコードにではなく、ソース UML モデルに対して構造上の変更を行う必要があります。 また、後方変換を実行し、ソース UML モデルに対して新規のメソッドまたは属性を追加することもできます。

ソース・コードへの属性の追加方法の例

以下の表には、次の項目がリストされています。
  • UML モデル要素
  • このモデル要素に対して変換により生成されるコード
  • ユーザー定義セクションではなく、ヘッダー・ファイルに追加される新規属性 attribute2 が含まれたコード
  • ユーザー定義セクションに追加される新規属性 attribute2 が含まれたコード
この例では属性の追加方法について説明していますが、同様の方法で操作およびネストされた要素も追加できます。
UML モデル要素 生成されたコード ユーザー定義セクションの外側に追加される属性 ユーザー定義セクションに追加される属性
このイメージは、属性 と、パラメーターを持たない操作を含む、Class1 という名前の UML クラスを示しています。
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//ファイル Class1.h のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.h のセクションの終了

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Class1 のセクションの開始
    //TODO: 保持する属性を追加します
    //Class1 のセクションの終了

    private:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation1();

};  //クラス Class1 の終了
#endif
Class1.cpp:
#include "Class1.h"
//ファイル Class1.cpp のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.cpp のセクションの終了


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1() 
{
    //TODO 自動生成されたメソッド・スタブ
    return 0;
}	
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//ファイル Class1.h のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.h のセクションの終了

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Class1 のセクションの開始
    //TODO: 保持する属性を追加します
    //Class1 のセクションの終了

    private:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;

	  bool attribute2;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation1();

};  //クラス Class1 の終了

#endif
Class1.cpp:
#include "Class1.h"
//ファイル Class1.cpp のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.cpp のセクションの終了


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1() 
{
    //TODO 自動生成されたメソッド・スタブ
    return 0;
}
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//ファイル Class1.h のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.h のセクションの終了

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Class1 のセクションの開始
        bool attribute2;
    //Class1 のセクションの終了

    private:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;

    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation1();

};  //クラス Class1 の終了

#endif
Class1.cpp:
#include "Class1.h"
//ファイル Class1.cpp のセクションの開始
//TODO: 保持する定義を追加します
//ファイル Class1.cpp のセクションの終了


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1() 
{
    //TODO 自動生成されたメソッド・スタブ
    return 0;
}

フィードバック