UML から C++ への変換出力におけるモデルおよびソース・コードの変更の影響

ソース・モデルまたは生成済みソース・コードに対する変更は、UML から C++ への変換の再実行時に、変換出力に影響を及ぼす可能性があります。 モデル要素と生成済みソース・コードの間の派生関係を作成するように変換を構成するかどうか、 または、生成済みソース・コードで要素の @generated タグを削除するかどうかによって、変換出力は異なります。

ソース・モデル要素間の派生関係を作成するように変換を構成すると、 変換によって生成されたソース・コードでは、変換された各要素に固有 ID が追加されます。

以下の表には、変換を再実行したときに、ソース・モデルへの変更が、 以前に生成されたコードにどのように影響するかを示しています。 この表では、モデル要素と生成されたソース・コードの間の派生関係を作成するように、変換が構成されているものとします。
注: コード変更を保持するには、ヘッダー・ファイルまたはボディ・ファイルで 要素の @generated タグを削除します。
モデル要素 変更点 変換を再実行する場合の、前に生成されたコードへの影響
属性 名前変更または移動 属性の @generated タグを削除すると、属性は変更されません。 生成された場合、その getter メソッドおよび setter メソッドも変更されません。
属性の @generated タグを削除しないと、次のアクションが発生します。
  • 属性は名前変更されるか、新規ロケーションに移動されます。生成された場合、デフォルト getter メソッドおよび setter メソッドは、名前変更または移動されます。
  • 作成した getter メソッドおよび setter メソッドは、保持されます。
  • 属性またはその getter メソッドおよび setter メソッドを参照するコード変更は、リファクタリングされません。
クラスまたはインターフェース 名前変更 クラスまたはインターフェースの @generated タグを削除すると、クラスのファイル名は変更されません。
@generated タグを削除しないと、次のアクションが発生します。
  • 生成される場合、コンストラクターおよびデコンストラクター、およびコード内のクラス名のインスタンス の名前が変更されます。
  • マッピング・モデルで異なるファイル名にマップされないトップレベルのクラスの場合、 ヘッダー・ファイル名およびボディ・ファイル名が変更されます。
  • このクラスに追加したコード (属性、メソッド、ベース・クラス、コメント、およびクラス階層など) は、 保持されます。
  • 追加したコードで、名前変更されたクラスを参照しているコードは、リファクタリングされません。
  • 生成されたコードで、名前変更されたクラスを参照しているコード (名前変更されたクラスと同じタイプの属性、 パラメーター、または戻り値など) は、リファクタリングされます。
  • トップレベルのクラスでは、変換構成で廃止ファイルの削除オプションを選択した場合や、 他のトップレベル・クラスが含まれるファイルにオリジナルの UML クラスをマップしない場合は、 前に生成されたファイルは削除されます。 それ以外の場合には、前に生成されたファイルは変更されません。
トップレベルのクラスまたはインターフェース 移動 トップレベルのクラスまたはインターフェースの @generated タグを削除した場合、クラスのファイルは変更されません。
@generated タグを削除しないと、次のアクションが発生します。
  • 新規ソース・コード・ファイルが、UML クラスの新規ロケーションに対応するロケーションに生成されます。 マッピング・モデルが存在しない場合、次のアクションが発生します。
    • ネスト UML クラスはネストなしになり、新規ソース・コード・ファイルが生成されます。
    • ネストなしの UML クラスはネストされ、新規ソース・コード・ファイルは生成されません。
  • マッピング・モデルが存在する場合、マッピング・モデルのマッピングに従って、変換によりソース・コード・ファイルが生成されます。
  • ソース・コードに行った変更 (属性、メソッド、ベース・クラス、コメント、およびクラス階層の追加など) は、 新規ソース・コード・ファイルで保持されます。 これは、ネストなしのクラス (ネストされる) にも、 ネストされたクラス (ネストなしになる) にも適用されます。
  • オリジナルのクラスを参照するコード変更は、リファクタリングされません。
  • 変換構成で廃止ファイルの削除オプションを選択している場合は、廃止ファイルが削除されます。
操作 戻り値の型またはシグニチャーの名前変更、移動、または変更 操作の @generated タグを削除すると、操作は変更されません。
@generated タグを削除しないと、次のアクションが発生します。
  • 操作ソース・コードに対し、同じ変更が行われます。
  • 操作の本体への変更は保持されます。
  • 操作を参照しているコードへの変更は、リファクタリングされません。
パッケージ 名前変更または移動 オリジナルの生成済みフォルダーのファイルは、新規フォルダーに移動されます。

変換構成で廃止ファイルの削除オプションを選択している場合は、
廃止フォルダーおよびファイルが削除されます。

«cpp_namespace» が適用されているパッケージ NamespaceName プロパティーの名前変更 すべての生成ソース・ファイルで、名前空間の名前が変更されます。 オリジナルの名前空間を参照するコード変更は、リファクタリングされません。
パッケージの名前変更 コードはリファクタリングされ、名前変更されたパッケージに移動されます (パッケージが固有 ID を持たないため)。

変換を再実行したときに生成されるコードの例

次の例は、変換を再実行したときに、 固有 ID および @generated タグが存在するかどうかによって異なる、コードへの変更を表しています。

この例の UML ソース・モデルには、次のクラスが含まれるものとします。

このイメージは、整数属性 attribute1、および操作 Operation1 がある、Class1 という名前の UML クラスを表しています。
この例では、Operation1 にシグニチャー Operation1 ([in] Parameter1 : Integer) があり、値がゼロの整数を返すとします。

次の表は、変換によって生成されるコードを 示しています。
Class1.h Class1.cpp
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@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)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation1(int Parameter1);

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


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1(int Parameter1) 
{
    //TODO 自動生成されたメソッド・スタブ
    return 0;
}
ユーザーが次の変更を行ったとします。
  • 生成されたコードで、Operation1 を実装します。
    int Class1::Operation1(int Parameter1) 
    {
        return Parameter1;
    }
  • ソース・モデルで、Operation1 を Operation2 に名前変更します。
この変換に よって生成されるコードは、次のイベントによって異なります。
  • トレース関係を生成するように変換を構成するかどうか。 このように構成すると、@generated タグをサポートする要素ごとに固有 ID が生成されます。 トレース関係を作成するように変換を構成した場合に変換により生成されるコードは、 固有 ID を持つコードの表を参照してください。 トレース関係を作成するように変換を構成しない場合に変換により生成されるコードは、 固有 ID なしのコードの表を参照してください。
  • 生成済みソース・コードで @generated タグを削除するかどうか。
以下の表は、@generate タグをサポートする各要素のソース・コード・コメントへ固有 ID を追加する派生関係を生成するように構成された 変換を再実行したときに、変換によって生成されるコードを示しています。
固有 ID を持つコード
@generated タグを削除しない場合
このコードは次の変更を表しています。
  • 変換により Operation1 を Operation2 に名前変更します。
  • Operation1 に指定した実装は、Operation2 に現れます。

Class1.h:

//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@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)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation2(int Parameter1);

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


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2(int Parameter1) 
{
    return Parameter1;
}
Class1.h または Class1.cpp から @generated タグを削除した場合
変換では固有 ID を使用して、Operation1 がモデルにおいて Operation2 に名前変更 されたかどうかを判別しますが、メソッドの @generated タグを削除したため、変換は Operation1 への変更を保持します。そのため、Operation1 は Class1.h または Class1.cpp で変更されず、変換によって、Operation2 というメソッドは生成されません。
Class1.h:
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@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)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation1(int Parameter1);

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


int Class1::Operation1(int Parameter1) 
{
    return Parameter1;
}

以下の表は 派生関係を生成するように構成されていない変換を再実行したときに、変換によって生成されるコードを示しています。 固有 ID がない場合、変換では完全修飾名およびメソッド・シグニチャーを使用して、モデル要素をソース・コード要素にリンクします。 また、リファクタリングはサポートされません。

固有 ID を持たないコード
@generated タグを削除しない場合
このコードは次の変更を表しています。
  • 変換により Operation1 を Operation2 に名前変更します。
  • 固有 ID がなく、新規メソッド名をオリジナルのメソッドにリンクできないため、変換では、 Operation1 のユーザー実装がデフォルト実装で上書きされます。 この上書きは、@generated タグが削除されなかったために発生します。
通常は、変換では 関数本体への変更が保持されますが、この例では、名前変更されたメソッドを変換で検出できなかったために 変更は保持されません。
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 Operation2(int Parameter1);

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


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2(int Parameter1) 
{
    //TODO 自動生成されたメソッド・スタブ
    return 0;
}
Class1.h または Class1.cpp から @generated タグを削除した場合
固有 ID がないので、変換は、 Operation2 が新規メソッドであると判別します。
このコードは次の変更を表しています。
  • 変換により、Operation2 にデフォルトのメソッド本文が生成されます。
  • 変換では Operation1 の変換を保持します。@generated タグが削除されたので、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:

        int Operation1(int Parameter1);

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

};  //クラス Class1 の終了

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


int Class1::Operation1(int Parameter1) 
{
	return Parameter1;
}

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

フィードバック