C++ から UML への変換によるソース・コードの変換処理

この変換によって生成される UML 要素は、変換のソースとして指定される C++ コードの特性によって決定されます。 C++ から UML への変換を実行すると、生成されるモデルに C++ 変換プロファイルが適用されます。また、生成される UML 要素にはこのプロファイルのステレオタイプが適用されます。

デフォルトでは、変換によって、ソース C++ 要素と同じ名前と可視性を持つ UML 要素が生成されます。 変換によって C++ 要素が変換できない場合、その要素は無視されます。 下表に、C++ コード要素を UML モデル要素に変換する場合に、 変換によって生成される出力をリストします。

C++ 要素 UML 要素
クラス
  • ソース C++ クラスと同じ名前と可視性を持つクラス
  • UML パッケージ階層は、ソース C++ プロジェクトのソース・フォルダー階層と同じです。
  • C++ クラスがスーパークラスを拡張する場合、変換によってクラスおよびスーパークラス間の汎化関係が生成されます。
列挙
  • ソース C++ パッケージと同じ名前のパッケージ内で、同じ名前と可視性を持つ列挙
  • 匿名列挙では、変換により«cpp_enum» が適用された UML 列挙が生成され、ステレオタイプの isAnonymousEnum プロパティーが true に設定されます。
名前空間
  • «cpp_namespace» ステレオタイプが適用されたパッケージ
  • ステレオタイプの NameSpaceName 属性は、C++ 名前空間の値と同じです。
ネスト・クラス、構造体、または共用体
  • ネスト・クラス、構造体、または共用体
  • 変換では、最上位のクラス、構造体、または共用体と同じ特性を持つネスト・クラス、構造体、または共用体を生成します。
構造体
  • ソース C++ 構造体と同じ名前および可視性を持つ、«cpp_struct» ステレオタイプが適用されたクラス
  • パッケージ階層は、ソース C++ プロジェクトのソース・フォルダー階層と同じです。
  • C++ 構造体がスーパークラスを拡張する場合、変換ではクラスおよびスーパークラス間の汎化関係が生成されます。
型定義
  • «cpp_typedef» が適用されたクラス。 ステレオタイプの ImplementationType 属性は、型定義指定子の値と同じです。
  • 例えば、変換では、型定義宣言 typedef int MyInt を、«cpp_typedef» が適用されたクラスに変換し、ステレオタイプの ImplementationType 属性を int に設定します。
共用体
  • ソース C++ 共用体と同じ名前および可視性を持つ、«cpp_union» ステレオタイプが適用されたクラス
  • パッケージ階層は、ソース C++ プロジェクトのソース・フォルダー階層と同じです。
  • C++ 共用体がスーパークラスを拡張する場合、変換によってクラスおよびスーパークラス間の汎化関係が生成されます。

グローバル変数およびグローバル関数

変換により、グローバル変数は、次の特性を持つ属性に変換されます。
  • «cpp_type» ステレオタイプが適用されている
  • isGlobal プロパティーが true に設定されている
  • 生成された属性を含む UML クラスが、グローバル変数を含む C++ ソース・ファイルと同じ名前を持つ
変換により、グローバル関数は、次の特性を持つ操作に変換されます。
  • «cpp_operation» ステレオタイプが適用されている
  • isGlobal プロパティーが true に設定されている
  • 生成された操作を含む UML クラスが、グローバル関数を含む C++ ソース・ファイルと同じ名前を持つ

プリプロセッサー・ディレクティブ

変換によって、C++ コード内のプリプロセッサー・ディレクティブは変換されません。 これは、これらの C++ 要素が UML では表示できないためです。C++ ソース・ファイル内のユーザー定義セクションに、 ユーザー定義プリプロセッサー・ディレクティブを指定する必要があります。

C++ テンプレート・クラス

ソース C/C++ 開発ツール (CDT) プロジェクトに、ソース CDT プロジェクトに存在しないクラスをインスタンス化するテンプレート・インスタンス化が含まれている場合、変換によって、テンプレートのインスタンス化は UML 基本タイプに変換されます。 変換では、テンプレートのインスタンス化への参照を、ターゲット・モデル内の UML 基本タイプへの該当する参照に変換します。

下表に、テンプレートのインスタンス化でソース・プロジェクト内のクラスをインスタンス化する場合、C++ から UML への変換において、テンプレート・クラスがどのように変換されるかをリストします。
C++ テンプレート・クラス UML 要素
テンプレート・クラス定義
  • テンプレート・パラメーターが Class タイプの場合のパラメーター化クラス
  • 変換では、他のすべてのテンプレート・パラメーターを無視し、 一部のテンプレート・クラスも無視します。
  • 次の例は、変換によって、UML パラメーター化クラスにテンプレート・クラス定義を変換する方法を示しています。
    template <class T=""> class stack {
       public:
    	void push(T ob);
    	T pop();
    };
  • 変換により、次の UML パラメーター化クラスが生成されます。
    stack という名前の UML パラメーター化クラス。push および pop という名前の操作が含まれています。
型定義に定義されているテンプレート・クラスのインスタンス化
  • 型定義宣言と同じ名前を持つクラス
  • 変換では、テンプレート・クラス・インスタンス化から UML パラメーター化クラスを指すバインド関係を生成します。
  • 例えば、変換により型定義宣言 typedef stack<A> myStackA; が、myStackA という名前の以下の UML クラスに変換され、stack クラスへのバインド関係が作成されます。
    テンプレート・クラス・インスタンス化と UML パラメーター化クラスとの間のバインド関係を持つクラス図
型定義に定義されていないテンプレート・クラスのインスタンス化
  • ターゲット UML モデルのテンプレート・インスタンス化フォルダー内のクラス
  • 変換では、テンプレート・クラス・インスタンス化から UML パラメーター化クラスを指すバインド関係を生成します。
  • 変換によってテンプレートのインスタンス化フォルダー内に生成される UML クラスは、 以下のダイアグラムに示されている命名体系を持ち、ソース C++ ファイル内のテンプレートのインスタンス化に対応しています。
  • 次の例は、変換によって、型定義に定義されていないテンプレート・クラスのインスタンス化を変換する方法を示しています。
    class B {
    	stack<A> stackA;
    };
  • 変換により、stack_A という名前の次の UML クラスが生成され、stack クラスへのバインド関係が生成されます。
    クラス B から stack_A へのダイレクト関連関係、および stack_A と stack との間のバインド関係

クラス、構造体、または共用体の C++ メンバー変数

変換によって、クラス、構造体、または共用体内の C++ メンバー変数を、以下の特性を持つ UML プロパティーに変換します。
  • 生成されたプロパティーは、C++ メンバー変数と同じ名前と可視性を持っています。
  • 変換では、C++ メンバー変数の対応するタイプが C++ 基本タイプの場合、type プロパティーを既存の C++ 基本タイプに設定します。 以下のコードを参照してください。
    class Class1{
        int x;
    } 
    変換によって、Class1 という名前の UML クラス内のプロパティー x の型、および int C++ 基本タイプ間のマッピングが作成されます。C++ タイプ・ライブラリーには、int 基本タイプが含まれています。

    下表に、C++ メンバー変数の型がユーザー定義の型の場合に、変換によって type プロパティーを設定する方法をリストします。

C++ メンバー変数の型がユーザー定義の型の場合、変換では、UML type プロパティーを、 ターゲットの UML モデル内のユーザー定義の型に対応する UML 要素の値に設定します。 変換によって、ユーザー定義の型に対応するモデル内の UML 要素を判別できない場合、UML 要素と同じ名前を持つ UML 基本タイプが作成され、新規 UML 基本タイプの名前と同等の UML プロパティーの Type を設定します。

下表の例には、変換において、UML type プロパティーの値がどのように設定されるかがリストされています。
C++ コード・サンプル type プロパティーの値
class Class2{
};

class Class3{
Class2 x1;
};
変換では、UML クラス Class3 内の x1 という名前のプロパティーの Type を Class2 に設定します。これは、変換によって、ターゲット UML モデル内に作成されます。

下表の例には、C++ メンバー変数の型が、別の C/C++ 開発ツール (CDT) プロジェクトに定義されている型を参照している場合に、 変換において、UML type プロパティーの値がどのように設定されるかがリストされています。

C++ コード・サンプル type プロパティーの値
CDTProject1 プロジェクトには、Class1 という名前のクラスが含まれています。

CDTProject2 プロジェクト には、Class2 という名前の以下のようなクラスが含まれています。

#include "CDTProject1/Class1"
class Class2{
	Class1 x;
};
変換によって、UML プロパティー x の型、および CDTProject1 という名前の C++ ソース・プロジェクト内の Class1 という名前のクラスに対応する可視要素間にマッピングが作成されます。

下表に、変換によって特定のメンバー変数に対して生成される追加情報をリストします。

C++ メンバー変数 変換出力の追加特性
const isStatic プロパティーは true です。
mutable 変換では、«cpp_type» ステレオタイプをプロパティーに適用します。 ステレオタイプの isMutable プロパティーは、true に設定されます。
static isStatic プロパティーは true です。
volatile 変換では、«cpp_type» ステレオタイプをプロパティーに適用します。 ステレオタイプの isVolatile プロパティーは、true に設定されます。

クラス、構造体、または共用体の C++ メンバー関数

変換では、クラス、構造体、または共用体内の C++ メンバー関数を、対応する UML クラスの UML 操作に変換します。 変換によって生成される UML 操作は、C++ メンバー関数と同じ名前と可視性を持っています。 下表に、変換によって特定の関数パラメーターに対して生成される追加情報をリストします。

C++ メンバー関数 変換出力の追加特性
Assignment 変換では、«cpp_assignment» ステレオタイプを適用します。 生成される操作は、= 代入演算子と同じ名前および可視性を持ちます
Const 変換では、isQuery プロパティーを true に設定します
Constructor 変換は、«cpp_constructor» ステレオタイプを適用します。 C++ コードのコンストラクター・メソッドが過負荷になった場合、変換により、コードの各コンストラクター・メソッドに対し、対応するコンストラクター・メソッドがターゲット・モデル内に生成されます。

変換では、コード内に重複するコンストラクター・メソッドが存在する場合、最初に処理されるコンストラクター・メソッドが生成されます。

CopyConstructor 変換は、«cpp_copy_constructor» ステレオタイプを適用します。 C++ コードのコピー・コンストラクター・メソッドが過負荷になった場合、変換により、コードの各コピー・コンストラクター・メソッドに対し、対応するコピー・コンストラクター・メソッドがターゲット・モデル内に生成されます。

変換では、コード内に重複するコピー・コンストラクター・メソッドが存在する場合、最初に処理されるコピー・コンストラクター・メソッドが生成されます。

Destructor 変換は、«cpp_destructor» ステレオタイプを適用します。 C++ コードのデストラクター・メソッドが過負荷になった場合、変換により、コードの各デストラクター・メソッドに対し、対応するデストラクター・メソッドがターゲット・モデル内に生成されます。

変換では、コード内に重複するデストラクター・メソッドが存在する場合、最初に処理されるデストラクター・メソッドが生成されます。

Friend 変換では、«cpp_operation» ステレオタイプを適用し、isFriend プロパティーを true に設定します。
Inline 変換では、«cpp_operation» ステレオタイプを適用し、isInline プロパティーを true に設定します。
Pure virtual 変換では、isAbstract プロパティーを true に設定します
Static 変換では、isStatic プロパティーを true に設定します
Virtual 変換では、«cpp_operation» ステレオタイプを適用し、isVirtual プロパティーを true に設定します。

C++ 関数パラメーター

変換では、C++ 関数パラメーターを、以下の特性を持つ UML パラメーターに変換します。
  • 生成されたパラメーターの名前は、C++ パラメーターと同じです。C++ パラメーターが戻りパラメーターの場合、変換によって、パラメーター・タイプ名を持つパラメーターが生成されます。
  • 変換では、パラメーターの Type プロパティーを基本タイプに設定するか、 またはモデル内の既存 UML 要素に設定します。
  • 変換では、UML パラメーターのデフォルト値を C++ パラメーターの値と同等の値に設定します。 以下の C++ コードを参照してください。
    class one{
        int op(int  x=5);
    }
    変換では、操作 op で生成された UML パラメーター x のデフォルト値を 5 に設定します。
下表に、変換によって特定の関数パラメーターに対して生成される追加情報をリストします。
C++ 関数パラメーター 変換出力
Reference 変換によって、Direction プロパティーが inout に設定されます。
Return 変換によって、Direction プロパティーが return に設定されます。
Regular (参照または戻りパラメーターではありません) 変換によって、Direction プロパティーが in に設定されます。

型修飾子

C++ メンバー変数、メンバー関数、およびパラメーターは、 型へのポインター、参照型、および配列型などの型修飾子を指定する場合があります。 これらの型修飾子は、UML では表示できません。 下表に、変換においてどのように型修飾子が変換されるかをリストします。

型修飾子 変換出力
C++ タイプへのポインター 変換では、«cpp_type» ステレオタイプを、生成する UML パラメーターまたはプロパティーに適用し、 修飾子属性をポインター演算子に設定します。 以下の C++ コードを参照してください。
class MyClass {
	private: char* name;
};

変換によって、以下のプロパティーを持つ名前付き変数を含んでいる MyClass という名前の UML クラスが生成されます。

このイメージは、修飾子プロパティーがポインター演算子に設定されることを示しています。ポインター演算子はアスタリスクで表されています。
C++ タイプへの参照 変換によって、修飾子属性が参照演算子に設定されます。

ソース・コード内の複数の参照型を変換する場合にのみ、変換によって «cpp_type» ステレオタイプが適用されます。

参照型の C++ パラメーターを変換する場合、UML パラメーターの方向属性が inout に設定されます。

以下の C++ コードを参照してください。

class MyClassClone {
	private:
	MyClassClone clone(MyClassClone& copy);
};

変換によって、以下のプロパティーを持つ戻りパラメーターを含む MyClassClone という名前の UML クラスが生成されます。

このイメージは、修飾子プロパティーが参照演算子に設定されることを示しています。参照演算子はアンパーサンドで表されています。
配列

1 次元配列の場合、 変換によって、UML パラメーターまたはプロパティーの多重度が 1 次元の値と同等の値に設定されます。

ソース・コード内の多次元配列を変換する場合にのみ、変換によって «cpp_type» ステレオタイプが適用されます。

次の例は、 変換による int x[10] タイプの属性に対する多重度の設定方法を示しています。

このイメージは、「プロパティー」ビューの「一般」ページを示しています。x というプロパティーの多重度は、10 に設定されています。

変換によって、multiplicity プロパティーの下限および上限は、その属性の 1 次元の値に設定されます。


フィードバック