モデルおよびソース・コードの変更が 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 という 1 つの整数属性、および Operation1 という 1 つの操作がある、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 タグを削除したかどうか。
以下の表は、派生関係を生成する (@generated タグをサポートする各要素のソース・コード・コメントに固有 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 の変更は保持されます。 そのため、Class1.h または Class1.cpp で 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:

//@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;
}

フィードバック