方法: UML クラス図からコードを生成する
Visual Studio Ultimate で [コードの生成] のコマンドを使用して、UML クラス図からコードを生成できます。既定では、コマンドは選択する各 UML 型の、C の型を生成します。コードを生成するテキスト テンプレートを変更またはコピーすることで、この動作を変更および拡張できます。モデルの異なるパッケージに含まれる型に対して、異なる動作を指定することもできます。
[コードの生成] コマンドは、ユーザーが選択した要素からコードを生成する場合、および各 UML クラスまたは他の要素に対して 1 つのファイルを生成する場合に特に適しています。たとえば、次のスクリーンショットには、2 つの UML クラスから生成された 2 つの C# ファイルが示されています。
または、生成されるファイルが UML 要素と 1:1 の関係を持たないコードを生成する場合は、[すべてのテンプレートの変換] で呼び出されるテキスト テンプレートを作成することもできます。この方法の詳細については、「方法: UML モデルからファイルを生成する」を参照してください。
Visual Studio Ultimate での UML クラス図の詳細については、次のトピックを参照してください。
[コードの生成] コマンドの使用
次の手順では、[コードの生成] コマンドの既定の動作について説明します。
要素ごとに異なるファイルを生成するには
クラスを含む UML モデルを作成します。モデル要素にはステレオタイプを適用できます。
詳細については、「[コードの生成] での既定の変換」を参照してください。
クラス図または UML モデル エクスプローラーで、コードを生成する要素を選択します。次のいずれかを選択できます。
要素の特定のセット。
パッケージまたはモデル。その内容からコードを生成します。
図。図のすべての要素を選択します。
選択された要素のショートカット メニューを開き、[コードの生成] を選択します。
特定のモデルで [コードの生成] を初めて使用するときは、ダイアログ ボックスが表示されます。このダイアログ ボックスでは、モデルのコード生成パラメーターを編集できます。
これらのパラメーターを変更することがわかっていない場合 [OK] を選択します。
後でこのダイアログ ボックスに戻るには、図のショートカット メニューを開き、[既定のコード生成設定の構成] を選択します。詳細については、「[コードの生成] コマンドのカスタマイズ」を参照してください。
C# コードが含まれるファイルが生成されます。既定の設定では、C# クラス ライブラリ プロジェクトに、型ごとのファイルが生成されます。ただし、この動作はカスタマイズできます。詳細については、「[コードの生成] コマンドのカスタマイズ」を参照してください。
いくつかの検証テストがモデルに適用されて、C# に変換できることが確認されます。テストが失敗した場合は、エラー メッセージが表示され、コードの生成は実行されません。検証メニュー コマンドを作成してある場合は、検証コマンドが失敗した要素に対してはコードが生成されません。詳細については、「方法: UML モデルの検証制約を定義する」を参照してください。
[コードの生成] での既定の変換
ここでは、カスタマイズされていない [コードの生成] コマンドで生成される結果をまとめます。詳細については、「[コードの生成] コマンドのカスタマイズ」を参照してください。
UML モデルで選択した型ごとに 1 つの C# 型が生成されます。各型は、GeneratedCode フォルダーの個別のコード ファイルに格納されます。
UML の型がパッケージに含まれる場合、生成される C# 型は名前空間の内部に格納され、ファイルは名前空間と同じ名前のフォルダーに生成されます。
UML クラスの Attribute ごとに、C# のプロパティが生成されます。
UML 型の各 Operation に対して、C# のメソッドが生成されます。
クラスが参加している誘導可能な関連付けごとに、C# のフィールドが生成されます。
各 UML 型にステレオタイプを追加することで、生成される C# 型の他のプロパティを制御できます。
作成する C# 型 |
作成する UML 型 |
適用するステレオタイプ |
---|---|---|
Class |
Class |
<none> または C# class |
インターフェイス |
インターフェイス |
<none> または C# interface |
列挙型 |
列挙型 |
<none> または C# enum |
Delegate |
Class |
C# delegate |
構造体 |
Class |
C# struct |
型または他の要素にステレオタイプを設定するには
図または [UML モデル エクスプローラー] の要素のショートカット メニューを開き、[プロパティ] を選択します。
[プロパティ] のペインで、[ステレオタイプ] のプロパティのドロップダウン矢印をクリックし、追加するステレオタイプのチェック ボックスをオンにします。
ヒント C# のステレオタイプが表示されない場合は、対象のモデル要素が含まれるモデルまたはパッケージの C# プロファイルを有効にします。UML モデル エクスプローラーで、パッケージまたはモデルのルートを選択します。次の [プロパティ] ウィンドウで、[プロファイル] を選択し、次に、C のプロファイリングを有効にします。
[ステレオタイプ] プロパティを展開し、設定できる追加プロパティを表示します。
型、属性、操作、および関連の [説明] プロパティは、生成されるコードの <summary> コメントに書き込まれます。型にリンクされているコメント要素は、<remarks> コメントに書き込まれます。
生成されたコードの変更
生成されるコードは、各型、属性、または操作のプロパティによって異なります。たとえば、クラスの Is Abstract プロパティを true に設定すると、abstract キーワードが生成されるクラスに追加されます。属性の Multiplicity を 0..* に設定すると、生成されるプロパティには IEnumerable<> 型が追加されます。
さらに、それぞれのステレオタイプでは、設定できる追加のプロパティが提供されます。これらの値は、C# コードでは適切なキーワードに変換されます。たとえば、クラスで Is Static プロパティを設定した場合、C# クラスは static になります。
これらの追加プロパティを設定するには、図でクラスまたは他の要素を選択します。[プロパティ] ウィンドウで、[ステレオタイプ] を展開し、[C# Class] などの C# ステレオタイプを展開します。クラスの場合、次のような追加プロパティがあります。
CLR 属性
Is Partial
Is Static
Is Unsafe
パッケージの可視性
各属性と操作にも、設定できるステレオタイプ プロパティがあります。新しい属性でプロパティが表示されない場合は、[コードの生成] を実行します。
[コードの生成] コマンドのカスタマイズ
[コードの生成] コマンドは、テキスト テンプレートの設定を使用してモデル要素を変換することによって動作します。テキスト テンプレートの詳細については、「コード生成と T4 テキスト テンプレート」を参照してください。
テンプレートは、一連のテキスト テンプレート バインディングで指定されます。テキスト テンプレート バインディングでは、適用するテンプレート、生成された出力を格納する場所、および [コードの生成] コマンドの他のパラメーターを指定します。
特定のモデルに対して [コードの生成] コマンドを初めて実行すると、コマンドはテンプレート バインディングの既定のセットをモデルのルートにアタッチします。これらのバインディングは、モデルのすべての要素に適用されます。
ただし、パッケージ、クラス、または他の要素に独自のバインディングをアタッチすることで、既定のバインディングをオーバーライドし、既定のバインディングに追加できます。バインディングは、アタッチされている要素に含まれるすべての要素に適用されます。たとえば、特定のパッケージに含まれるすべての型を、異なるテンプレートのセットで変換する場合、または異なるフォルダーに出力する場合は、パッケージにテンプレート バインディングをアタッチできます。
モデル要素にアタッチされているテンプレート バインディングを調べるには、[プロパティ]ウィンドウの [テキスト テンプレート バインディング] のプロパティの省略記号 [...] を選択します。
[コードの生成] コマンドでは、選択した各モデル要素にテンプレートが適用されます。各要素に対して適用されるテンプレートのセットは、モデルのルートに至るまで (ルートを含む) の上位コンテナーにアタッチされているテンプレートの組み合わせです。
このセットに同じ名前のテンプレート バインディングがある場合は、小さいコンテナーのバインディングによって大きいコンテナーのバインディングがオーバーライドされます。たとえば、モデルのルートに Class Template という名前のバインディングがあるものとします。独自のテンプレートを特定のパッケージの内容に適用するには、Class Template という名前で独自のテンプレート バインディングを定義します。
1 つのモデル要素に複数のテンプレートを適用できます。各モデル要素から複数のファイルを生成できます。
[!メモ]
モデルのルートにアタッチされているバインディングは、そのモデルのすべての要素に対する既定値になります。これらの既定のバインディングを表示するには、図のサーフェイスのショートカット メニューを開き、[既定のコード生成設定の構成] を選択します。または、UML モデル エクスプローラーでモデルのルートを選択し、[テキスト テンプレート バインディング] のプロパティの […] を選択します。[コードの生成] コマンドを初めて使用するまで、バインディングは表示されません。テンプレート バインディングを図にアタッチすることはできません。
テキスト テンプレート バインディングをパッケージまたは他のモデル要素にアタッチするには
[UML モデル エクスプローラー] では、モデル要素のショートカット メニューを開き、[プロパティ] を選択します。通常は、パッケージまたはモデルのルートに対してテキスト テンプレート バインディングをアタッチします。
[プロパティ] のペインで、[テキスト テンプレート バインディング] のプロパティの省略記号ボタン ([…]) を選択します。
[Text Template Bindings] (テキスト テンプレート バインディング) ダイアログ ボックスが表示されます。
新しいテキスト テンプレート バインディングを作成するには [追加] を選択します。
または
それを編集する既存のバインディングを選択します。
各テンプレート バインディングでは、指定したテンプレートを選択したモデル要素に適用する方法、および含まれる他のモデル要素が定義されています。
ダイアログ ボックスで、テキスト テンプレート バインディングのプロパティを設定します。
プロパティ
説明
名前
このバインディングの名前。上位のパッケージまたはモデルから継承されたバインディングをオーバーライドするには、オーバーライド対象のバインディングと同じ名前を使用します。
上書き
true の場合、既存のコードを上書きします。
ターゲット名
生成されるファイルの名前。
この文字列には、{Name} や {Owner.Name} などの式を挿入できます。たとえば、{Owner.Name}_{Name} などと記述できます。式は、モデル要素に対して評価されます。要素のプロパティは使用できますが、メソッドのプロパティは使用できません。使用できるプロパティを調べるには、Microsoft.VisualStudio.Uml.* で型のプロパティを参照してください。
重要{Name} または {Owner.Name} は、[ターゲット名] プロパティでのみ使用できます。生成されるクラスの名前を変更するには、テンプレートを変更する必要があります。詳細については、「テキスト テンプレートの作成」を参照してください。プロジェクト パス
変換の出力ファイルを格納する Visual Studio プロジェクトへのパスを指定します。新しいプロジェクトを作成するには、型指定された値を使用します。既存のプロジェクトを選択するか、省略記号ボタン ([…]) を選択します。
存在しない場合は、新しいプロジェクトが作成されます。作成されるプロジェクトは、C# クラス ライブラリ プロジェクトになります。
そのためには、プロジェクト ディレクトリを入力する必要があります。%ProgramFiles% や %LocalAppData% などの環境変数マクロを使用できます。
ターゲット ディレクトリ
ターゲット ファイルが生成されるフォルダー。このパスはプロジェクト フォルダーが基準になります。
{PackageStructure} 式を使用して、上位のパッケージの名前に対応するパスを挿入できます。既定値 \GeneratedCode\{PackageStructure} です。%TEMP% や %HomePath% などの環境変数を使用することもできます。
重要{PackageStructure} は [ターゲット ディレクトリ] プロパティでのみ使用できます。テンプレート ファイルのパス
変換を実行するテンプレート。
提供されているテンプレートを使用することも、独自に作成することもできます。次の位置の指定されたテンプレートを検索する場合:
… \Program の Files\Microsoft の Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\Extensibility\Templates\Text\
必要なだけいくつでもバインディングを要素にアタッチできます。
テキスト テンプレートの作成
独自のテキスト テンプレートを作成できます。テキスト テンプレートでは、プログラム コードまたは他の任意の種類のテキスト ファイルを生成できます。
標準テンプレートのコピーを変更することをお勧めします。テンプレートは次の場所からコピーできます。
… \Program の Files\Microsoft の Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Architecture Tools\Extensibility\Templates\Text\
テキスト テンプレートの詳細については、次のトピックを参照してください。
テキスト テンプレートは生成されるファイルのプロトタイプであり、生成されるテキストと、モデルを読み取るプログラム コードの両方が含まれます。詳細については、「コード生成と T4 テキスト テンプレート」を参照してください。
プログラム コードで UML モデル内を移動するには、UML API を使用する必要があります。詳細については、「方法: UML モデル内を移動する」および「UML モデリング機能拡張の API リファレンス」を参照してください。
[コードの生成] コマンドでテンプレートを使用するには、Modeling ディレクティブを含める必要があります。次に例を示します。
<#@ Modeling ElementType="Microsoft.VisualStudio.Uml.Classes.IClass" Processor="ModelingProcessor" #>
ElementType 属性では、このテンプレートを適用する UML 要素の種類を定義します。
テンプレートでは、this は次のプロパティを持つ一時クラスに属します。
Element = テンプレートが適用されている UML の IElement。
Errors: CompilerErrorCollection
ModelBus: ModelBus.詳細については、「方法: UML モデルを他のモデルおよびツールと統合する」を参照してください。
ProfileName = "C#Profile"
ServiceProvider: IServiceProvider
Session: TextTemplatingSession.
Store: Store.これは、UML ModelStore が実装されている Visualization and Modeling SDK ストアです。UML の IModelStore を取得するには、this.Element.GetModelStore() を使用します。
テキスト テンプレートを作成するときは、以下のことが役に立つ場合があります。詳細については、「コード生成と T4 テキスト テンプレート」を参照してください。
生成されるファイル名の拡張子は、Output ディレクティブで設定できます。すべてのテキスト テンプレートに Output ディレクティブが 1 つ必要です。
一部のアセンブリはテンプレートで自動的に参照されます。このようなアセンブリの例としては、System.dll や Microsoft.VisualStudio.Uml.Interfaces.dll などがあります。
生成用のプログラム コードで他のアセンブリを使用するには、Assembly ディレクティブを使用します。次に例を示します。
<#@ Assembly Name="%ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.ArchitectureTools.Extensibility.dll" #>
System などの一部の名前空間は、プログラム コードに自動的にインポートされます。他の名前空間については、Import ディレクティブを using ステートメントと同じ方法で使用できます。次に例を示します。
<#@ Import Namespace="Microsoft.VisualStudio.Uml.Classes" #>
<#@ Import Namespace="Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml" #>
別のファイルのテキストを参照するには、Include ディレクティブを使用します。
かっこ <# ... #> で囲まれているテンプレートの部分は、[コードの生成] コマンドによって実行されます。かっこの外側にあるテンプレートの部分は、生成されるファイルにコピーされます。生成するコードと生成されるテキストを区別することが重要です。生成されるテキストには任意の言語を使用できます。
<#= Expressions #> は評価されて、文字列に変換されます。