UML クラス図: ガイドライン
Visual Studio Ultimate では、UML クラス図を使用して、データ型とその関係を実装とは別個に表現できます。 図は、実装ではなく、クラスの論理的な側面に注目するために使用されます。
UML クラス図を生成するには、[アーキテクチャ] メニューの [新しい図] をクリックします。
注意
このトピックでは、UML クラス図について説明します。このほか、プログラム コードを作成して視覚化するために使用されるクラス図もあります。「クラスと型のデザインおよび表示」を参照してください。
UML クラス図の使用
クラス図を描画するための基本的な手順
クラス、インターフェイス、および列挙の使用
属性と操作
関連の描画と使用
継承
テンプレート型
パッケージでの名前空間の定義
UML クラス図からのコードの生成
UML クラス図は、さまざまな用途に使用できます。
システムで使用され、コンポーネント間で受け渡される型の、実装に依存しない説明を提供する。
たとえば、ビジネス層の .NET コード、コンポーネント間のインターフェイスの XML、データベースの SQL、およびユーザー インターフェイスの HTML で、Meal Order 型が実装されているとします。 これらの実装は細部が異なりますが、Meal Order と他の型 (Menu や Payment) の間の関係は常に同じです。 UML クラス図を使用することにより、これらの関係について、実装を考慮することなく話し合うことができます。
アプリケーションとそのユーザーの間の通信、およびユーザーのニーズの記述において使用される用語を明確にする。 「ユーザー要求のモデリング」を参照してください。
たとえば、レストラン用アプリケーションのユーザー ストーリー、ユース ケース、またはその他の要求の記述について考えてみましょう。 通常、このような記述には、"メニュー"、"注文"、"料理"、"価格"、"支払い" などの用語が使用されます。 UML クラス図を使用すると、これらの用語の間の関係を定義できます。 これにより、要求の記述、ユーザー インターフェイス、およびヘルプ ドキュメントに不整合が発生する可能性を抑えることができます。
通常、UML クラス図は、使用する型の記述を提供するために、他のモデル図と共に描画します。 それぞれの場合において、型の物理的表現はいずれの図においても暗示されません。
描画済みの図 |
UML クラス図を使って記述する内容 |
---|---|
アクティビティ図 |
オブジェクト ノードを通過するデータの型。 入力ピン、出力ピン、およびアクティビティ パラメーター ノードの種類。 「UML アクティビティ図: ガイドライン」を参照してください。 |
シーケンス図 |
パラメーターの型およびメッセージの戻り値。 生存線の種類。 生存線のクラスには、受信できるすべてのメッセージの操作が含まれている必要があります。 「UML シーケンス図: ガイドライン」を参照してください。 |
コンポーネント図 |
コンポーネントのインターフェイスとその操作。 「UML コンポーネント図: ガイドライン」を参照してください。 |
ユース ケース図 |
ユース ケースの目標と手順の説明で言及されている型。 「UML ユース ケース図: ガイドライン」を参照してください。 |
UML クラス図の要素に関するリファレンス情報については、「UML クラス図: リファレンス」を参照してください。
注意
モデル図を生成するための詳細な手順については、「UML モデルとダイアグラムの編集」を参照してください。
[アーキテクチャ] メニューの [新しいダイアグラム] をクリックします。
[テンプレート] の [UML クラス図] をクリックします。
図に名前を付けます。
[モデリング プロジェクトへの追加] で、ソリューション内の既存のモデリング プロジェクトを選択します。または、[新しいモデリング プロジェクトを作成します] を選択し、[OK] をクリックします。
新しいクラス図が、UML クラス ダイアグラム ツールボックスと共に表示されます。 ツールボックスには、必要な要素および関係が含まれています。
型を生成するには、ツールボックスの [クラス]、[インターフェイス]、または [列挙] ツールをクリックし、図の空白部分をクリックします。 (ツールボックスが表示されない場合は、Ctrl + Alt + X を押します。)
また、コード内の型に基づいて型を作成できます。 型は、ソリューション エクスプローラー、アーキテクチャ エクスプローラー、または依存関係グラフから図にドラッグできます。 「コードから UML クラス ダイアグラムを作成する」を参照してください。
型に属性または操作を追加する場合、または列挙にリテラルを追加する場合は、型の [属性]、[操作]、または [リテラル] 見出しをクリックし、Enter キーを押します。
f(x:Boolean):Integer のようなシグニチャを記述できます。 「属性と操作」を参照してください。
複数の項目をすばやく追加するには、各項目の末尾で Enter キーを 2 回押します。 方向キーを使用して、リスト内を上下に移動できます。
型を展開する、または折りたたむには、左上隅のシェブロン アイコンをクリックします。 クラスまたはインターフェイスの [属性] および [操作] セクションを展開したり折りたたんだりすることができます。
型間の関連、継承、または依存関係リンクを描画するには、適切なツールをクリックし、ソース型をクリックしてから、ターゲット型をクリックします。
パッケージ内に型を生成するには、パッケージ ツールを使用してパッケージを生成してから、パッケージ内に新しい型とパッケージを生成します。 また、コピー コマンドを使用して型をコピーし、パッケージに貼り付けることもできます。
すべての図は、同じプロジェクト内の他の図との間で共有されるモデル上のビューです。 完全なモデルのツリー ビューを表示するには、[表示]、[その他のウィンドウ]、[UML モデル エクスプローラー] をクリックします。
ツールボックスには、3 種類の標準的な分類子が用意されています。 このドキュメントでは、これらを型と呼びます。
クラス (1) は、多くの場合、データまたはオブジェクトの型を表すために使用します。
インターフェイス (2) は、純粋なインターフェイスと内部実装を持つ具象クラスを差別化する必要があるコンテキストで使用します。 この差別化は、図の目的がソフトウェア実装を記述することである場合に便利です。 しかし、受動的なデータをモデリングする場合、またはユーザー要求を記述するための概念を定義する場合には、それほど効果的ではありません。
列挙 (3) は、Stop や Go のように、リテラル値の数が限られている型を表すために使用します。
リテラル値を列挙に追加します。 それぞれに別個の名前を指定します。
必要に応じて、それぞれのリテラル値に数値を指定することもできます。 列挙内のリテラルのショートカット メニューを開き、[プロパティ] をクリックします。次に、プロパティ ウィンドウで [値] フィールドに数値を入力します。
それぞれの型に一意な名前を付けます。
他の図にある型を自分の UML クラス図に表示できます。
型が含まれている他の図 |
他の図から型を取得する方法 |
---|---|
UML クラス図 |
1 つのクラスを複数の UML クラス図に表示できます。 1 つの図でクラスを生成した後、UML モデル エクスプローラーからそのクラスを他の図にドラッグします。 この機能は、それぞれの図で特定の関係のグループに重点を置いて作業する場合に便利です。 たとえば、"料理の注文" とレストランの "メニュー" の間の関連を 1 つの図に示し、"隆理の注文" と "支払い" の間の関連を別の図に示すことができます。 |
コンポーネント図 |
コンポーネント図でコンポーネント上のインターフェイスを定義している場合は、UML モデル エクスプローラーからクラス図にインターフェイスをドラッグできます。 クラス図で、インターフェイスに含まれるメソッドを定義できます。 「UML コンポーネント図: ガイドライン」を参照してください。 |
UML シーケンス図 |
シーケンス図の生存線からクラスおよびインターフェイスを生成した後、UML モデル エクスプローラーから UML クラス図にクラスをドラッグできます。 シーケンス図における各生存線は、オブジェクト、コンポーネント、またはアクターのインスタンスを表します。 生存線からクラスを生成するには、生存線のショートカット メニューを開き、[クラスの生成] または [インターフェイスの生成] をクリックします。 「UML シーケンス図: ガイドライン」を参照してください。 |
プログラム コード |
モデル内のコードから型を表すことができます。 アーキテクチャ エクスプローラーまたは依存関係グラフから UML クラス図にクラス、インターフェイス、または列挙体をドラッグします。 ドラッグした型は図に表示されます。 依存タイプもモデルに追加されます。 この方法で UML 型が作成されている場合は、UML 型をダブルクリックしてソース コードを開くことができます。 「コードから UML クラス ダイアグラムを作成する」を参照してください。 注意 コードとモデルでは同期が維持されません。図を更新し、コードに影響を及ぼすことなく変更提案を検討できます。再び型を図にドラッグしない限り、それ以降のコードの変更は、図に自動的には反映されません。 |
属性 (4) は、型のすべてのインスタンスが持つことができる名前付きの値です。 属性にアクセスしても、インスタンスの状態は変更されません。
操作 (5) は、型のインスタンスが実行できるメソッドまたは関数です。 操作は、値を返すことができます。 isQuery プロパティが true の場合、インスタンスの状態を変更することはできません。
属性または操作を型に追加するには、型のショートカット メニューを開き、[追加] をクリックして、[属性] または [操作] をクリックします。
プロパティを表示するには、属性または操作のショートカット メニューを開き、[プロパティ] をクリックします。 プロパティがプロパティ ウィンドウに表示されます。
操作のパラメーターのプロパティを表示するには、Parameters プロパティの [...] をクリックします。 新しいプロパティ ダイアログ ボックスが表示されます。
設定できるすべてのプロパティの詳細については、次のトピックを参照してください。
属性または操作のそれぞれの型と、それぞれのパラメーター型には、次のいずれかの値を使用できます。
(なし): 先頭のコロン (:) を省略することで、シグニチャでの型の指定を省略できます。
標準の基本型の 1 つ: Boolean、Integer、String。
モデルで定義されている型。
テンプレート タイプのパラメーター化された値で、Template<Parameter> と記述します。 「テンプレート型」を参照してください。
モデルでまだ定義していない型の名前を書くこともできます。 名前は、UML モデル エクスプローラーの [未指定の型] に一覧表示されます。
注意
その後、モデル内でその名前のクラス、またはインターフェイスを定義すると、以前の属性と操作は引き続き未指定型の要素を参照します。新規クラスを参照するように変更するには、それぞれの属性や操作について、ドロップダウン メニューから新規クラスを選択し、型を 1 つずつリセットする必要があります。
任意の属性、操作、またはパラメーター型の多重度を設定できます。
許可値は次のとおりです。
多重度 |
属性、パラメーター、または戻り値に含まれる値 |
---|---|
[1] |
指定された型の 1 つの値。 既定値です。 |
[0..1] |
Null、または指定された型の値。 |
[*] |
任意の数の指定された型のインスタンスが含まれるコレクション。 |
[1..*] |
1 つ以上の指定された型のインスタンスが含まれるコレクション。 |
[n..m] |
n ~ m 個の指定された型のインスタンスが含まれるコレクション。 |
多重度が 1 を超える場合は、以下のプロパティも設定できます。
IsOrdered: true の場合、コレクションの順序が定義されています。
IsUnique: true の場合、コレクション内に重複する値は存在しません。
可視性は、クラス定義の外部から属性または操作にアクセスできるかどうかを示します。 許可値は次のとおりです。
名前 |
省略形 |
説明 |
---|---|---|
Public |
+ |
他のすべての型からアクセスできます。 |
Private |
- |
この型の内部定義からのみアクセスできます。 |
Package |
~ |
この型を含むパッケージ内、および明示的に型をインポートするすべてのパッケージ内でアクセスできます。 「名前空間およびパッケージの定義」を参照してください。 |
Protected |
# |
この型、およびこの型を継承する型からのみアクセスできます。 「継承」を参照してください。 |
属性または操作のシグニチャは、可視性、名前、(操作の) パラメーター、および型を含むプロパティのコレクションです。
シグニチャは、図に直接記述できます。 属性または操作をクリックして選択し、もう一度クリックします。
シグニチャは、次の形式で記述します。
visibility attribute-name : Type
または
visibility operation-name (parameter1 : Type1, ...) : Type
次に例を示します。
+ AddItem (item : MenuItem, quantity : Integer) : Boolean
可視性については省略形を使用します。 既定値は + (public) です。
それぞれの型には、モデルで定義した型、Integer や String などの標準型、またはまだ定義していない新しい型の名前を使用できます。
注意
パラメーター リストに名前のみを記述して型を省略した場合、その名前は、パラメーターの型ではなく名前と見なされます。この例では、MenuItem と Integer は、型が指定されていない 2 つのパラメーターの名前になります。
AddItem(MenuItem, Integer) /* parameter names, not types! */
シグニチャで型の多重度を設定するには、次の例に示すように、型の名前に続けて多重度を角かっこで囲んで指定します。
+ AddItems (items : MenuItem [1..*])
+ MenuContent : MenuItem [*]
属性または操作が静的な場合、その名前はシグニチャ内で下線付きで表示されます。 属性または操作が抽象型の場合、その名前は斜体で表示されます。
Is Static プロパティと Is Abstract プロパティは、プロパティ ウィンドウでのみ設定できます。
属性または操作のシグニチャを編集するときに、行の末尾および各パラメーターの後に追加のプロパティが表示されることがあります。 これらのプロパティは、中かっこ {...} で囲まれて表示されます。 これらのプロパティは、編集または追加できます。 次に例を示します。
+ AddItems (items: MenuItem [1..*] {unique, ordered})
+ GetItems (filter: String) : MenuItem [*] {ordered, query}
選択できるプロパティは次のとおりです。
シグニチャ内 |
プロパティ |
説明 |
---|---|---|
unique |
テンプレートは、保存されたときと、ソリューション エクスプローラーのツール バーの [すべてのテンプレートの変換] をクリックしたときに実行されます。 |
コレクション内に重複する値は存在しません。 多重度が 1 を超える型に適用されます。 |
ordered |
Is Ordered |
コレクションは順序付けられています。 false の場合、1 番目の項目は確定されません。 多重度が 1 を超える型に適用されます。 |
query |
Is Query |
操作によってインスタンスの状態が変更されることはありません。 操作にのみ適用されます。 |
/ |
Is Derived |
属性は、他の属性または関連の値から計算されます。 "/" は、属性の名前の前に表示されます。 次に例を示します。
|
通常、完全なシグニチャは、編集中の図にのみ表示されます。 編集が完了すると、追加のプロパティは非表示になります。 完全なシグニチャを常に表示するには、型のショートカット メニューを開き、[完全署名の表示] をクリックします。
関連は、ソフトウェアでリンクがどのように実装されるかに関係なく、2 つの要素間のあらゆる種類のリンクを表すために使用します。 たとえば、関連を使用して、C# のポインター、データベースにおけるリレーションシップ、または XML ファイルのある部分から別の部分への相互参照を表すことができます。 関連を使用することで、地球と太陽のような、現実世界のオブジェクト間の関連を表すことができます。 関連は、リンクがどのように表されているかを示すものではなく、その情報が存在することのみを示します。
関連を生成したら、次にそのプロパティを設定します。 関連のショートカット メニューを開き、[プロパティ] をクリックします。
関連の全体的なプロパティに加え、各ロール (関連の各端部) は独自のプロパティを持ちます。 このようなプロパティを表示するには、[1 番目のロール] プロパティと [2 番目のロール] プロパティを展開します。
各ロールのいくつかのプロパティは、図に直接表示されます。 それらは次のとおりです。
ロールの名前。 図内の関連の適切な端部に表示されます。 このプロパティは、図内またはプロパティ ウィンドウで設定できます。
多重度。既定値は 1 です。 図内の関連の適切な端部にも表示されます。
集約。 コネクタの一方の端部に菱形で表されます。 集約ロール側のインスタンスがもう一方の側のインスタンスを所有または包含していることを示すために使用します。
誘導可能。 1 つのロールに対してのみ true の場合、誘導可能な方向に矢印が表示されます。 これを使用して、ソフトウェアのリンクの誘導可能性とデータベースのリレーションシップを示すことができます。
これらのプロパティおよびその他のプロパティの詳細については、「UML クラス図の関連のプロパティ」を参照してください。
関連を描画すると、関連を移動できる方向を示す矢印が片方の末尾に付きます。 これは、クラス図がソフトウェア クラスを表し、関連がポインターまたは参照を表す場合に役立ちます。 ただし、クラス図を使用してエンティティと関係またはビジネス概念を表す場合は、誘導可能性との関連性は小さくなります。 この場合は、矢印を使用しないで関連を描画することをお勧めします。 その場合は、関連の両端で Is Navigable プロパティを True に設定します。 これを容易にするために、コード サンプル「UML ドメイン モデリング」をダウンロードできます。
関連は、属性を視覚的に示す方法の 1 つです。 たとえば、Menu 型の属性を持つ Restaurant クラスを生成する代わりに、Restaurant から Menu への関連を描画できます。
それぞれの属性名はロール名となります。 属性名は、関連の所有している型から反対側の端部に表示されます。 図の myMenu に注目してください。
通常は、基本型のような図中に描画しない型に関してのみ、属性を使用することをお勧めします。
[継承] ツールは、次の関係を生成するために使用します。
特化された型と一般的な型の間の汎化関係。
または
クラスとそれによって実装されるインターフェイスとの間の実現関係。
継承関係内にループを生成することはできません。
汎化とは、一般的な型または基本型の属性、操作、および関連を特化型または派生型が継承することを表します。
一般的な型は、関係の矢じり付きの端部に表示されます。
通常、継承された操作および属性は、特化型には表示されません。 ただし、継承された操作を特化型の操作リストに追加することができます。 この機能は、操作の特定のプロパティを特化型内でオーバーライドする場合、または実装コードでそのような操作を行う必要があることを示す場合に便利です。
汎化関係をクリックします。
関係が強調表示され、アクション タグがその近くに表示されます。
アクション タグをクリックし、[操作のオーバーライド] をクリックします。
[操作のオーバーライド] ダイアログ ボックスが表示されます。
特化型に表示する操作を選択し、[OK] をクリックします。
選択した操作が特化型に表示されます。
実現とは、インターフェイスによって指定された属性および操作をクラスで実装することを表します。 インターフェイスは、コネクタの矢印端に示されます。
実現コネクタを生成すると、インターフェイスの操作が自動的に実現クラスに複製されます。 インターフェイスに新しい操作を追加すると、その操作はその実現クラスに複製されます。
実現関係を生成した後、それをロリポップ表記に変換できます。 関係を右クリックし、[ロリポップとして表示] をクリックします。
これにより、実現リンクでクラス図が煩雑になることもなく、クラスで実装するインターフェイスを表示できます。 また、インターフェイスとそれを実現するクラスを別個の図に表示することもできます。
他の型または値でパラメーター化できるジェネリック型またはテンプレート型を定義できます。
たとえば、キー型と値型でパラメーター化されたジェネリックな Dictionary を生成できます。
クラスまたはインターフェイスを生成します。 これがテンプレート型になります。 適切な名前 (たとえば、Dictionary) を付けます。
新しい型のショートカット メニューを開き、[プロパティ] をクリックします。
プロパティ ウィンドウで、[テンプレート パラメーター] フィールドの [...] をクリックします。
[テンプレート パラメーター コレクション エディター] ダイアログ ボックスが表示されます。
[追加] をクリックします。
名前プロパティをテンプレート型のパラメーター名 (たとえば、Key) に設定します。
[パラメーターの種類] を設定します。 既定値は [クラス] です。
パラメーターが特定の基底クラスの派生クラスのみを受け取るようにするには、[制約がある値] を目的の基底クラスに設定します。
必要な数のパラメーターを追加し、[OK] をクリックします。
他のクラスの場合と同様に、属性と操作をテンプレート型に追加します。
種類が [クラス]、[インターフェイス]、または [列挙] のパラメーターを、属性および操作の定義で使用できます。 たとえば、Key と Value のパラメーター クラスを使用して、この操作を Dictionary で定義できます。
Get(k : Key) : Value
種類が [整数] のパラメーターは、多重度の境界として使用できます。 たとえば、パラメーター整数 max を使用して、属性の多重度を [0..max] として定義できます。
テンプレート型を生成した後は、これを使用してテンプレート バインディングを定義できます。
新しい型 (たとえば、AddressTable) を生成します。
新しい型のショートカット メニューを開き、[プロパティ] をクリックします。
[テンプレート バインディング] プロパティで、ドロップダウン リストからテンプレート型 (たとえば、Dictionary) を選択します。
[テンプレート バインディング] プロパティを展開します。
テンプレート型のそれぞれのパラメーターに対して行が表示されます。
それぞれのパラメーターを適切な値に設定します。 たとえば、Key パラメーターを Name クラスに設定します。
UML クラス図では、パッケージを表示できます。 パッケージは、他のモデル要素のコンテナーです。 パッケージ内には任意の要素を生成できます。 図において、パッケージを移動すると、パッケージ内の要素も移動されます。
展開/折りたたみコントロールを使用して、パッケージの内容の表示/非表示を切り替えることができます。
「パッケージと名前空間の定義」を参照してください。
UML クラス図でクラスの実装を開始するには、C# コードを生成するか、またはコード生成用テンプレートをカスタマイズすることができます。 用意された C のテンプレートを使用してコードの生成を開始する場合:
図または要素のショートカット メニューを開き、[コードの生成] をクリックして、必要なプロパティを設定します。
これらのプロパティを設定し、用意されたテンプレートをカスタマイズする方法の詳細については、「UML クラス ダイアグラムからコードを生成する」を参照してください。