次の方法で共有


UML コンポーネント図: ガイドライン

Visual Studio Ultimate では、コンポーネント図を描画して、ソフトウェア システムの構造を示すことができます。ビデオ デモについては、「UML with VS 2010 Part 6: Designing a Project's Physical Structure (VS 2010 での UML パート 6: コンポーネント図を使用した物理構造の設計)」を参照してください。

UML コンポーネント図を生成するには、[アーキテクチャ] メニューの [新しい図] をクリックします。

コンポーネントとは、環境内で置き換えることのできるモジュール式のユニットのことです。コンポーネントの内部は非表示ですが、コンポーネントは 1 つ以上の正しく定義された提供インターフェイスを持ち、コンポーネントの機能にはこれを介してアクセスできます。コンポーネントは、要求インターフェイスを持つこともできます。要求インターフェイスは、他のコンポーネントに対して要求する機能またはサービスを定義します。複数のコンポーネントの提供インターフェイスと要求インターフェイスを接続することで、より大規模なコンポーネントを構築できます。完全なソフトウェア システムを 1 つのコンポーネントとして見なすことができます。

コンポーネント図を描画することには、次のような利点があります。

  • 設計を主要なブロックの観点から考察することは、開発チームが既存の設計を理解したり、新しい設計を生成したりするのに役立ちます。

  • 正しく定義された提供インターフェイスおよび要求インターフェイスを持つコンポーネントのコレクションとしてシステムを見なすことで、それぞれのコンポーネントをより明確に分離して取り扱うことができます。その結果、理解しやすい設計を実現でき、要求が変更されたときに容易に変更を加えることができるようになります。

コンポーネント図を使用すると、設計で使用されている、または将来使用される予定の言語またはプラットフォームに関係なく、設計を表すことができます。

このトピックの内容

他の図との関係

コンポーネント図を描画するための基本的な手順

コンポーネントの内部パートの表示

コンポーネントの設計

[!メモ]

コンポーネント図の要素に関するリファレンス情報については、「UML コンポーネント図: リファレンス」を参照してください。

他の図との関係

コンポーネント図は他の図と共に使用できます。

図の種類

確認できる設計の側面

UML シーケンス図

  • システムのコンポーネント間の相互作用。

  • コンポーネント内のパート間の相互作用。

詳細については、「UML シーケンス図: ガイドライン」を参照してください。

UML クラス図

  • コンポーネントのインターフェイス、およびコンポーネントのパートを構成するクラス。

  • パラメーターを使用してコンポーネントのインターフェイス間で送信されるデータ。

詳細については、「UML クラス図: ガイドライン」を参照してください。

アクティビティ図

  • 受信メッセージに対する応答としてコンポーネントによって実行される内部処理。

詳細については、「UML アクティビティ図: ガイドライン」を参照してください。

レイヤー図

  • コンポーネントの論理アーキテクチャ層。

詳細については、「レイヤー図: リファレンス」を参照してください。

コンポーネント図を描画するための基本的な手順

コンポーネント図の要素に関するリファレンス情報については、「UML コンポーネント図: リファレンス」を参照してください。

コンポーネント図を設計プロセスで使用する方法の詳細については、「ソフトウェア システムのアーキテクチャのモデリング」を参照してください。

[!メモ]

モデル図を生成するための詳細な手順については、「方法: UML モデルおよび UML 図を編集する」を参照してください。

コンポーネント図を生成するには

  1. [アーキテクチャ] メニューの [新しいダイアグラム] をクリックします。

  2. [テンプレート][UML コンポーネント図] をクリックします。

  3. 図に名前を付けます。

  4. [モデリング プロジェクトへの追加] で、ソリューション内の既存のモデリング プロジェクトを選択するか、[新しいモデリング プロジェクトを作成します] を選択し、[OK] をクリックします。

    新しいコンポーネント図が、[UML コンポーネント図] ツールボックスと共に表示されます。ツールボックスには、必要な要素および関係が含まれています。

Dd409393.collapse_all(ja-jp,VS.110).gifコンポーネントの描画

インターフェイスを含むコンポーネント

システムまたはアプリケーションの主要な機能ユニットごとにコンポーネント (1) を生成します。

たとえば、アプリケーション、ハードウェア デバイス、Web サービス、.NET アセンブリ、プログラム クラス、クラス グループ、プログラムの分離可能なセグメントなどがこれに該当します。

コンポーネントを生成するには

  1. ツールボックスの [コンポーネント] をクリックし、図の空白部分をクリックします。

    または

    既存のコンポーネントをコピーし、貼り付けます。

    1. 図または UML モデル エクスプローラー内の既存のコンポーネントを見つけます。

    2. コンポーネントを右クリックし、[コピー] をクリックします。

    3. コピーしたコンポーネントを貼り付ける図を開きます。

    4. 図の空白部分を右クリックし、[貼り付け] をクリックします。

      新しい名前が付けられたコンポーネントが表示されます。

  2. コンポーネントの名前をクリックし、変更します。

  3. コンポーネントのヘッダーのみを表示するには、シェブロン (5) をクリックします。

Dd409393.collapse_all(ja-jp,VS.110).gifコンポーネントのポートの表示

ポート (2、3) は、コンポーネントを出入りするメッセージまたは操作呼び出しのグループを表します。このグループは、ポートの型を定義するインターフェイスによって記述されます。ポートは、インターフェイスを提供するか、またはインターフェイスを要求することができます。

提供インターフェイス (2) を持つポートは、そのコンポーネントによって実装され、他のコンポーネントによって使用できる操作を提供します。

たとえば、ユーザー インターフェイス、Web サービス、.NET インターフェイス、任意のプログラミング言語の関数のコレクションなどがこれに該当します。

要求インターフェイス (3) を持つポートは、他のコンポーネントまたは外部システムによって提供される操作またはサービスのグループに対するコンポーネントの要求を表します。

たとえば、Web ブラウザーの場合は Web サーバーが求められ、アプリケーション アドインの場合はアプリケーションからのサービスが求められます。

1 つのコンポーネントは任意の数のポートを持つことができます。

ポートをコンポーネントに追加するには

  1. ツールボックスの [提供インターフェイス] または [要求インターフェイス] をクリックします。

  2. ポートを追加するコンポーネントをクリックします。

    コンポーネントの境界上にポートが表示されます。

    新しいインターフェイスがポートの型として生成されます。このインターフェイスは、UML モデル エクスプローラーに表示されます。

  3. コンポーネント境界上でポートをドラッグして、目的の位置に配置します。

  4. ポートのラベルをドラッグしてその位置を調整します。

  5. ラベルをクリックし、変更します。ラベルは、インターフェイスの名前を示します。ラベルを変更することは、インターフェイスの名前を変更することになります。

Dd409393.collapse_all(ja-jp,VS.110).gifコンポーネント間のリンクの設定

依存関係 (4) は、あるコンポーネントの要求を他のコンポーネントによって提供される操作またはサービスで満たすことができることを示すために使用します。

提供インターフェイスが要求インターフェイスの要求を満たすことを示すには

  1. ツールボックスの [依存関係] をクリックします。

  2. 最初に操作またはサービスを要求するコンポーネント上の要求インターフェイスを持つポートをクリックし、次に操作またはサービスを提供するコンポーネントの提供インターフェイスを持つポートをクリックします。

グループ内のすべてのコンポーネントが他のすべてのコンポーネントに依存するような依存関係ループを設計しないように注意してください。

既存のインターフェイスのポートをコンポーネントに追加するには

  • UML モデル エクスプローラー内でインターフェイスを見つけ、コンポーネント上にドラッグします。

    または

  • インターフェイスへの参照を図からコピーし、貼り付けます。

    1. クラス図またはコンポーネント図上で、インターフェイスを右クリックし、[コピー] をクリックします。

    2. コンポーネント図上で、コンポーネントを右クリックし、[参照の貼り付け] をクリックします。

      提供インターフェイスがコンポーネント上に表示されます。隣にアクション タグが表示されます。

      [!メモ]

      [参照の貼り付け] の代わりに [貼り付け] を使用した場合、新しい名前の新しいインターフェイスが生成されます。

    3. 要求インターフェイスを生成する場合は、アクション タグをクリックし、[要求インターフェイスに変換] をクリックします。

コンポーネントの内部パートの表示

内部パートを示すコンポーネント ダイアグラム

コンポーネントが相互に対話するより小規模なコンポーネントから構成されることを示すために、パート (3) をコンポーネント (1) 内に配置できます。

この例の図は、Dinner Now Web Service 型のすべてのインスタンスに、Customer Server の 1 つのインスタンスと Kitchen Server の 1 つのインスタンスが含まれていることを示しています。

パートは、通常のクラスに属する属性に似た、親コンポーネントのプロパティです。パートは、独自の型を持ちます。通常はこれもコンポーネントです。パートのラベルは、通常の属性と同じ形式を持ちます。

+ partName : TypeName

親コンポーネント内の各パートは、その型 (4、5) に対して定義されている提供インターフェイスおよび要求インターフェイスを示します。あるパートで必要とされる操作またはサービスを別のパートが提供できます。[パート アセンブリ] のコネクタを使用して、パート間の接続状況を示すことができます (6)。

また、親コンポーネントのインターフェイスがそのいずれかのパートによって実際に提供または要求されることを示すこともできます。[委譲] の関係 (9) を使用すると、親のポートを内部パートのポートに接続できます。2 つのポートは同じ種類 (提供ポートまたは要求ポート) である必要があり、インターフェイス型に互換性がある必要があります。

新しい型または既存の型の新しいパートを生成できます。

パートをコンポーネントに追加するには

  1. 親コンポーネントの構成要素と考える主要な機能ユニットごとにパートを生成します。

    1. ツールボックスの [コンポーネント] をクリックし、親コンポーネント (1) の内側をクリックします。

      親コンポーネントの内側に新しいパート (3) が表示されます。

      新しいコンポーネントが UML モデル エクスプローラー内に生成されます。これが、新しいパートの型です。

      または

      既存のコンポーネントを UML モデル エクスプローラーから親コンポーネント上にドラッグします。

      親コンポーネントの内側に新しいパート (3) が表示されます。その型は、UML モデル エクスプローラーからドラッグしたコンポーネントです。

      または

      図または UML モデル エクスプローラー内でコンポーネントを右クリックし、[コピー] をクリックします。

      親コンポーネント上で右クリックし、[参照の貼り付け] をクリックします。

      親コンポーネントの内側に新しいパート (3) が表示されます。その型は、コピーしたコンポーネントです。

    2. 新しいパートの名前をクリックし、変更します。型を変更することはできません。

    3. 提供インターフェイスと要求インターフェイス (4、5) を新しいパートに追加できます。[提供インターフェイス] ツールまたは [要求インターフェイス] ツールをクリックし、パート内をクリックします。

      または

      既存のインターフェイスを UML モデル エクスプローラーからパート上にドラッグします。

      インターフェイスがパートの型に追加され、パート上に表示されます。必要に応じて、親コンポーネントのサイズが調整されます。

  2. パートを相互に接続します。

    • 複数の異なるパート (6) のポートを接続するには、[依存関係] ツールを使用します。
  3. パートを親コンポーネントのポートに接続します。

    1. 親コンポーネント上に 1 つ以上のポート (7) を生成します。ツールボックスの [要求インターフェイス] または [提供インターフェイス] をクリックし、親コンポーネントをクリックします。

    2. ポートを 1 つ以上のパートに委譲 (9) します。[委譲] ツールをクリックし、親コンポーネントのポートをクリックしてから、パートのポートをクリックします。同じ方法で、インターフェイスを提供または要求するポートを接続できます。

Dd409393.collapse_all(ja-jp,VS.110).gifパートの内部パートの表示

コンポーネントをパートに分解した後、各パート型をそれに固有の内部パートに分解できます。

各層の分解を別々のコンポーネント図で行うと作業が簡単です。最初に、パートの型を見つける必要があります。たとえば、この図の 1 つのパートは DNCustomerServer という名前を持ち、その型は CustomerServer という名前のコンポーネントです。この型を UML モデル エクスプローラー内で見つけ、別の図に配置することができます。これにより、それに固有の内部パートを生成できます。

パートの型を図に配置するには

  1. パートの型の完全修飾名を確認します。

    パートを右クリックし、[プロパティ] をクリックします。

    型名がプロパティ ウィンドウの [型] フィールドに表示されます。

  2. UML モデル エクスプローラー内でパートの型を見つけます。

    [表示][その他のウィンドウ] をポイントし、[UML モデル エクスプローラー] をクリックします。

    プロジェクトを展開し、必要に応じて型が属しているパッケージを展開します。

    型が [コンポーネント] として表示されます。

    必要に応じて、ここで名前を変更できます。

  3. 別のコンポーネント図を開くかまたは生成します。

  4. UML モデル エクスプローラーから図上に型をドラッグします。

    型のビューが、図内でコンポーネントとして表示されます。

    これは、パートに対して定義したのと同じインターフェイスを持ちます。

    この段階で、その内部にパートを追加できます。

コンポーネントの設計

Dd409393.collapse_all(ja-jp,VS.110).gifパートのコラボレーションの記述

シーケンス図を描画して、親コンポーネントが受信するメッセージに対する応答においてパートがどのように連携して動作するかを示すことができます。

これらの図は、既存のコンポーネントを説明するため、および新しいコンポーネントを設計するために使用できます。

コンポーネントを設計している途中であれば、配置するパートを決定する前にシーケンス図を描画できます。シーケンス図を使用して、さまざまなパート、要求インターフェイス、およびメッセージ シーケンスを試すことができます。最も頻繁に発生する最も重要な受信メッセージを対象に、シーケンス図を描画します。これにより、決定した生存線に対応するパートをコンポーネント内に生成できます。

シーケンス図を使用して、どのようにシステムの処理を複数の異なるコンポーネントに配分するかを評価します。

  • 1 つのパートが担当する処理があまりに多い場合、処理を均等に配分した場合に比べて、アプリケーションの更新が困難になります。

  • 処理を少しずつ多数の相互作用に配分した場合、システムのパフォーマンスが低下し、システムを理解するのが困難になります。

コラボレーション パーツを示すシーケンス ダイアグラム

パート間のコラボレーションを示すシーケンス図を描画するには

  1. 新しいシーケンス図を生成します。

    詳細については、「UML シーケンス図: ガイドライン」を参照してください。

  2. このコンポーネントにメッセージを送信する外部コンポーネント、ユーザー、デバイス、またはその他のアクター (1) の生存線を生成します。

    この生存線の Actor プロパティを true に設定すると、それは対象のコンポーネントに対して外部であることを示すことができます。生存線の上にスティック図形が表示されます。

  3. 選択したアクターからメッセージが送信されるこのコンポーネントの提供インターフェイス (2) の生存線を生成します。

  4. コンポーネントの各パート (3) の生存線を生成します。

  5. コンポーネントの要求インターフェイス (4) の生存線を生成します。

  6. 外部アクター (5) からのメッセージを描画します。メッセージがどのようにパートに渡されるか、およびパートがどのように連携してメッセージに応答するかを示します。

  7. 必要に応じて、要求インターフェイス (6) に送信されるメッセージを示します。メッセージの実行の詳細は省略してください。

Dd409393.collapse_all(ja-jp,VS.110).gifコンポーネントとそのパートの役割の重要性の相違

場合によっては、コンポーネントはパートのコレクションに与えられた名前にすぎません。すべての処理はパートによって実行され、実行時にはコンポーネントを表すコードまたはその他の成果物はありません。

コンポーネントの Is Indirectly Instantiated プロパティを設定することで、これをモデルに示すことができます。この場合、すべてのコンポーネントのインターフェイスがポート上にあり、内部パートへの委譲が設定されている必要があります。

Dd409393.collapse_all(ja-jp,VS.110).gif各パート内のプロセスの記述

アクティビティ図を使用すると、コンポーネントがそれぞれの受信メッセージをどのように処理するかを示すことができます。詳細については、「UML アクティビティ図: ガイドライン」を参照してください。

データ バッファーを含むアクティビティ ダイアグラム

イベント受理アクション (1) を使用して、受信メッセージによって新しいスレッドが開始されることを示します。

オブジェクト ノードおよび入出力ピンを使用して、情報の流れと、情報が格納される場所を示します。この例のオブジェクト ノード (2) は、スレッド間でバッファリングされる項目を示します。

Dd409393.collapse_all(ja-jp,VS.110).gifデータおよびクラスの定義

UML クラス図を使用することで、次の項目の詳細な内容を記述できます。

  • コンポーネントのインターフェイス。

  • インターフェイスの操作のパラメーターで渡されるデータ。

  • アクティビティ図のオブジェクト フローに示されるようなコンポーネントに格納されているデータ。

Dd409393.collapse_all(ja-jp,VS.110).gifコンポーネント間の一般的な依存関係

コンポーネント図を使用して、設計の主要な構成要素とその相互依存関係のみを示すことができます。

コンポーネント間の依存関係

[依存関係] ツールを使用して、依存関係を描画します。これは、あるコンポーネントの設計が他のコンポーネントに依存することを示します。

依存関係の代表的な例を次に示します。

  • あるコンポーネントが、他のコンポーネント内のコードを呼び出す。

  • あるコンポーネントが、他のクラス内で定義されているクラスをインスタンス化する。

  • あるコンポーネントが、他のコンポーネントによって生成された情報を使用する。

依存関係矢印の名前を使用して、特定の用途を表すことができます。名前を設定するには、矢印を右クリックし、[プロパティ] をクリックします、次に、プロパティ ウィンドウで [名前] フィールドを設定します。

参照

関連項目

UML シーケンス図: リファレンス

概念

方法: UML モデルおよび UML 図を編集する

UML コンポーネント図: リファレンス

UML ユース ケース図: リファレンス

UML クラス図: リファレンス

UML コンポーネント図: リファレンス

その他の技術情報

Video: Designing the Physical Structure by using Component Diagrams (ビデオ: コンポーネント図を使用した物理構造の設計)