
The Rational Edge
UML 2.0のキホン:コンポーネント図の詳細解説
Donald Bell
IBM Global Services,IBM
2005/2/2
Rational Edgeより:本稿ではコンポーネント図と、新しいUML 2.0仕様のストラクチャ図について解説する。
|
本稿はUnified Modeling Language(UML)で絶対不可欠なダイヤグラムに関する連載の続編である。UMLのクラス図に関する前回の記事「UML’s class diagram」(The Rational Edge、2004年9月)では、クラス図の表記がUML 2.0の全ストラクチャ図の基本になっていることを説明した。今回は引き続きストラクチャ図に触れながら、コンポーネント図の詳細を解説する。
◆ ダイヤグラムの目的
- - PR -
コンポーネントベース開発(CBD)では、ソリューションのモデリングを開始するに当たって、コンポーネント図が設計者に自然なフォーマットを提供してくれる。コンポーネント図を使えば、システムに必要な機能がコンポーネントによってインプリメントされているかどうかを設計者が検証できるようになり、完成システムが確実に条件を満たすようにできる。
さらに、コンポーネント図は各グループにとっても便利なコミュニケーションツールとなる。図は、重要なプロジェクトの出資者やインプリメンテーション担当者に見せることができる。コンポーネント図は、一般的にシステムのインプリメンテーションスタッフ向けに考えられたものだが、図があれば構築されるシステムの全体像を早く理解できるようになるため、普通はコンポーネント図の提示が出資者の安心につながる。
コンポーネント図は、これから構築していくシステムをアーキテクチャの観点からハイレベルで描くため、デベロッパにとっては便利なものだ。これにより、デベロッパはインプリメンテーションのロードマップを明確な形にしていくことができ、作業の割り当てや必要なスキルの向上に関する判断も下せるようになる。システム上で動作する論理ソフトウェアコンポーネントを早い段階で把握できるため、コンポーネント図はシステム管理者にとっても便利だ。システム管理者は、マシンや実行イメージの実体をダイヤグラムから特定することはできない。しかし、コンポーネントやコンポーネント間の関係を早い段階で知ることができる(これにより、システム管理者が事前計画を立てられるようになる)。つまり、コンポーネント図がシステム管理者にとって歓迎すべきダイヤグラムであることは明らかだろう。
◆ ノーテーション
コンポーネント図はUML図の中で最も描きやすいものの1つである。図1は、以前のUML 1.4の表記を使った簡単なコンポーネント図を示しており、この例では、Inventory Systemのコンポーネントを利用するOrder Systemのコンポーネントという2つのコンポーネント間の関係を示している。図から分かるように、UML 1.4のコンポーネントは、大きな長方形の左側から2つの小さな長方形が突き出した形で描かれる。
![]() |
図1 この簡単なコンポーネント図は、Order Systemの一般的な依存をUML 1.4表記で示している |
上記のUML 1.4表記はUML 2.0でもサポートしている。しかし、UML 1.4の表記法では大規模なシステムに十分対応することができなかった。このような理由から、UML 2.0では本稿で後述するようにコンポーネント図の表記法を大幅に強化している。UML 2.0の(表記法の)方でスケーリング機能を拡張し、(盛り込める)情報量も増やした。
では、UML 2.0に沿ったコンポーネント図の基本を1つ1つ見ていこう。
◆ コンポーネント図の表記の基本
UML 2.0でコンポーネントを描く作業は クラス図によるクラスの描画にかなり近づいた。実際、UML 2.0ではコンポーネントはクラスの概念が特殊なバージョンになったものにすぎない。つまり、クラスのclassifierに適用される表記ルールは、コンポーネントclassifierにも適用される(読者諸兄がストラクチャ図について書いた筆者の前回の記事をクラス図を中心にだいたい読んで理解していれば、コンポーネント図は順調に理解できると思う)。
UML 2.0ではコンポーネントが長方形で表記され、オプションで縦の区画が付く。UML 2.0のハイレベルで抽象化されたコンポーネントは、コンポーネントの名前とコンポーネントのステレオタイプテキストやアイコンの入った長方形だけでモデリングできる。コンポーネントのステレオタイプテキストは「<<component>>」で、コンポーネントのステレオタイプアイコンは2つの小さい長方形が左側に突き出した長方形となっている(コンポーネントを示すUML 1.4表記の要素)。図2は、UML 2.0仕様で可能な3つの異なるコンポーネントの描き方を示している。
図2 コンポーネント名の区画描画方法(クリックすると拡大) |
図上でコンポーネントを描くときは、コンポーネントステレオタイプテキスト(「コンポーネント」を二重のアングルブラケットで囲んだもの。図2参照)やアイコンを必ず含めることが重要だ。なぜならば、UMLでは、ステレオタイプclassifierのない長方形がクラスエレメントだと解釈されてしまうからだ。コンポーネントのステレオタイプやアイコンはこの長方形をコンポーネントエレメントとして識別する。
● コンポーネントのインターフェイス(実装済み/必須)のモデリング
図2のOrderコンポーネントは、どれも有効な表記エレメントを示している。しかし、典型的なコンポーネント図にはもっと多くの情報が含まれている。コンポーネントエレメントは、名前区画の下をもう1つ別の区画で区切ることができる。前述したように、コンポーネントは自立した単位で、1つ以上の公開インターフェイスを実装している。これらの実装済みインターフェイスは、コンポーネントがその消費者/クライアントに提供する正式なサービス契約を示している。図3は、Orderコンポーネントが提供する必須インターフェイスを示した2番目の区画を持つOrderコンポーネントを示している[2]。
|
[2] コンポーネントは自立した単位だが、ほかのコンポーネントが実装済みのサービスに依存する場合がある。このため、コンポーネントの必須インターフェイスを文書化しておくと便利だ。 |
![]() |
図3 Orderコンポーネントの必須/実装済みインターフェイスを示す別区画 |
図3で例示したOrderコンポーネントでは、コンポーネントがOrderEntryとAccountPayableのインターフェイスを実装する。さらに、このコンポーネントではPersonインターフェイスを実装する別のコンポーネントも必須になる[3]。
|
[3] 図3では、あらゆる状況を含めた形でOrderコンポーネントを示していない。現実のモデルでは、OrderEntry、AccountPayable、およびPersonの各インターフェイスがこのシステムのモデルの中で示される。 |
● インターフェイスをモデリングする際のもう1つのアプローチ
UML 2.0では、コンポーネントの実装済み/必須インターフェイスを示す方法がもう1つ導入されている。この方法では、長方形を基本とし、その中にコンポーネントの名前が示される。そして、UML 2.0仕様で「インターフェイスシンボル」と呼ばれるものが長方形の外側に接している。図4はこの2番目のアプローチを示している。
![]() |
図4 コンポーネントの実装済み/必須インターフェイスをインターフェイスシンボルを使って示す(図3とは)別のアプローチ |
2番目のアプローチでは、先端に丸の付いたインターフェイスシンボルがコンポーネントの実装済みインターフェイスを示している。この「ロリポップ(棒付きキャンディー)」シンボルは、インターフェイスclassifierの実現関係を手っ取り早く示すための手法だ。一方、先端に半円の付いたインターフェイスシンボル(「ソケット」)は、コンポーネントの必須インターフェイスを示す(いずれの場合も、インターフェイスの名前はインターフェイスシンボル自体のそばに記されている)。図4と図3は大きく異なるように見えるが、どちらの図も、OrderコンポーネントがOrderEntryとAccountPayableの2つのインターフェイスを実装し、OrderコンポーネントがPersonインターフェイスを必須とするという同じ情報を提供している。
● コンポーネント間の関係のモデリング
あるコンポーネントと別のコンポーネントとの関係を示すときは、ロリポップとソケットの表記に(クラス図と同様に)依存矢印を含める必要がある。ロリポップやソケットの付いたコンポーネント図では、依存矢印が利用側の(必須)ソケットから出て、その矢じりが図5のように提供する側のロリポップに接続される。
![]() |
図5 Order Systemのコンポーネントとほかのコンポーネントの依存関係を示すコンポーネント図 |
図5は、Order SystemコンポーネントがCustomer RepositoryとInventory Systemの両方のコンポーネントに依存している様子を示している。図5では、「CustomerLookup」と「ProductAccessor」というインターフェイス名が重複している点に注意したい。例では、これが不必要に繰り返されているように見えるが、実際の表記では、インプリメンテーションの違い(1つのコンポーネントが小さい必須インターフェイスのサブクラスとなる1つのインターフェイスを実装するなど)に応じてコンポーネントごとに異なるインターフェイス(そして異なる名前)を使うことができる。
● サブシステム
UML 2.0では、サブシステムclassifierはコンポーネントclassifierの特殊なバージョンになる。このようなことから、サブシステム表記エレメントはコンポーネント表記エレメントから同じルールをすべて継承する。唯一の違いは図6のように、サブシステム表記エレメントには「コンポーネント」の代わりに「サブシステム」というキーワードが付くことだけだ。
![]() |
図6 サブシステムエレメントの例 |
UML 2.0仕様は、サブシステムとコンポーネントの違いに関してかなり漠然としている。この仕様では、コンポーネントやサブシステムをモデリングの観点から全く同様に扱う。UML 1.xと比較すると、このUML 2.0モデリングの多義性は新しい。しかし、それには理由がある。UML 1.xでは、サブシステムはパッケージと見なされ、このパッケージ表記がUMLを扱う現場の多くの人間を混乱させた。このような理由から、UML 2.0ではUML 1.xユーザーの大半が理解しているように、サブシステムと特殊なコンポーネントを同列に扱っている。この変更は状況を不明瞭にしてしまったが、それはUML 2.0仕様が間違っているというより、むしろ現実を反映したものだといえる。
読者諸兄はおそらく、サブシステムエレメントではなくコンポーネントエレメントを使うのがいつか分からず頭をかきむしっていることだろう。率直にいって、筆者にも正しい答えは見当たらない。ただいえるのは、UML 2.0仕様では、サブシステムではなくコンポーネントを使う状況の判断はモデル作成者の方法論による、ということになっている。UMLを方法論に絶対に依存しないようにし、ソフトウェア開発のあらゆる場面で利便性を発揮させることに役立つため、筆者個人としてはこの回答が気に入っている。
◆ コンポーネンと図を理解するための次のステップ
コンポーネント図は図の中でも理解しやすい部類に入るので、基本以外に学ぶべきことはない。しかし、1カ所だけやや高度な部分がある。
● コンポーネントの内部構造の提示
いずれは、コンポーネントの内部構造を表示することが理にかなう場面が出てくる。筆者は、クラス図に関して言及した「UML's class diagram」で、クラスの内部構造をモデリングする方法を示した。今回筆者は、ほかのコンポーネントによって構成されたコンポーネントの内部構造をモデリングする方法に重点を置く。
コンポーネントの内部構造を示すには、そのコンポーネントを通常より大きく描き、包含するコンポーネント名区画の中に内部の部品を置くだけでよい。図7はStoreのコンポーネントの内部構造を示している。
図7 このコンポーネントの内部構造はほかの複数のコンポーネントによって構成されている(クリックすると拡大) |
図7で示されている例では、StoreコンポーネントはOrderEntryインターフェイスを実装し、Accountインターフェイスを必須とする。Storeコンポーネントは、Order、Customer、Productの3つのコンポーネントで構成されている。StoreのOrderEntryおよびAccountの両インターフェイスシンボルにはコンポーネントの端に四角が付いていることに注意したい。この四角はポートと呼ばれる。極めて簡単に説明すると、コンポーネントの実装済み/必須インターフェイスと内部パーツの関連性をモデリングするための手法を提供するのがポートだ[4]。ポートを使うことで、この図はStoreコンポーネントの内部パーツを外部から切り離すことができる。
図7では、OrderEntryポートがOrderコンポーネントのOrderEntryインターフェイスに処理を委譲する。また、内部のCustomerコンポーネントが必須とするAccountインターフェイスは、Storeコンポーネントが必須とするAccountインターフェイスポートに委譲されている。Accountポートに接続することで、Storeコンポーネントの内部パーツ(Customerコンポーネントなど)は、ポートのインターフェイスに実装された未知の外部要素の代理をローカルに立てることができる。必須となるAccountインターフェイスは、Storeコンポーネントの外部コンポーネントによって実装される[5]。
|
[4] 実際のところ、ポートはどのようなタイプのclassifier(クラスや、そのほか自分のモデルが持つ何らかのclassifier)にも当てはまる。本稿では内容を簡略化するため、コンポーネントclassifierをポートとする。 |
|
[5] 通常、ポートとインターフェイス間の依存関係を描くときは、依存する(必須)インターフェイスがすべての処理ロジックを実行時に処理することになる。しかし、このルールにも例外は許される。依存するインターフェイスへ単に処理を委譲するだけでなく、包含するコンポーネント(ここの例ではStoreコンポーネントなど)に独自の処理ロジックを持たせることも全く問題ない。 |
図7では、内部コンポーネント間の相互接続が図5のそれと異なることに気付くだろう。これは、コラボレーションが図のインスタンスや役割を示すため、内部構造の描写が実際にはclassifier(ここではコンポーネント)の中でネスティングされたコラボレーション図になっているためだ。内部コンポーネント間でモデリングされた関係は、UMLで「アセンブリコネクタ」と呼ばれているものによって示されている。アセンブリコネクタは、1つのコンポーネントの実装済みインターフェイスと、別のコンポーネントの必須インターフェイスを結び付ける。アセンブリコネクタはロリポップとソケットのシンボルを並べて描かれる。アセンブリコネクタをこのように描くと、ロリポップとソケットのシンボルがかなり読みやすくなる。
◆
コンポーネント図は、設計者がプロジェクトの初期段階で描くことの多い極めて重要な図だ。だが、コンポーネント図はシステムのライフサイクル全体を通じて役に立つ。コンポーネント図は、システムのアーキテクチャをモデリングして文書化するため、実に貴重な存在だ。コンポーネント図はシステムのアーキテクチャを文書化するため、デベロッパと、これからこのシステムの管理者になろうとする者には、システムの理解を助けるに当たってこの作業が重要になるだろう。
コンポーネント図は、ソフトウェアシステムの導入図に対する入力としても機能するが、このことについては筆者の次回の連載で触れる。
|
本記事は「The Rational Edge」に掲載された「UML basics: The component diagram」をアットマーク・アイティが翻訳したものです。 |
| IT Architect 連載記事一覧 |
The Rational Edge
米ラショナルソフトウェアがWeb上で毎月更新するオブジェクト指向開発のための論文集「The Rational Edge」を@ITが厳選して翻訳
- 第1回 要件仕様の決定に時間を割かない結末は?
- 第2回 先駆者に学ぶ「開発プロセス改善の原則」
- 第3回 あるプロジェクトリーダーの成功ストーリー
- 第4回 ソフト開発の変革というWebサービスの可能性
- 第5回 プロダクト・マネジメントを成功に導くには
- 第6回 分散コンピューティング時代のテスト手法
- 第7回 プロジェクトの特性に合わせた要件定義手法の選択
- 第8回 優秀なテスターの育成と訓練方法
- 第9回 「アジャイル」「RUP」「Rational XDE」の融合
- 第10回 Dr.ユースケースの “ユースケース人生相談”
- 第11回 Webサービスのテスト技法進化論
- 第12回 要件定義の考古学
- 第13回 チェスとソフト開発、その相関関係を探る
- 第14回 開発計画が破たんするには理由がある
- 第15回 要件定義の管理技術(Lv0〜Lv5)
- 第16回 オン・デマンドの波をキャッチしろ
- 第17回 オープンソース時代のテスト手法、そのノウハウ
- 第18回 オープンソース時代のテスト手法、テストのロードマップ
- 第19回 オープンソース時代のテスト手法、テストのまとめ
- 第20回 『オープン』の正体 (前編)
- 第21回 『オープン』の正体 (後編)
- 第22回 サブシステムの「なに?」「なぜ?」「どうやって?」
- 第23回 サブシステムとはモデリング概念である
- 第24回 アスペクト指向プログラミング オーバービュー
- 第25回 「プロジェクト管理」を管理するために
- 第26回 レッスン1:何もせずに取り残されるな
- 第27回 レッスン3:相違に注意を払え
- 第28回 大規模プロジェクトにアジャイルを適用する方法(前編)
- 第29回 大規模プロジェクトにアジャイルを適用する方法(後編)
- 第30回 アジャイル開発:成熟期の到来、その道のり
- 第31回 UML 2.0のキホン:コンポーネント図の詳細解説
- 第32回 コーディングの知恵を要件定義で利用する
- 第33回 隣のテストチームが優秀ないくつかの理由(前編)
- 第34回 隣のテストチームが優秀ないくつかの理由(後編)
- 第35回 中国のソフトウェア開発現場はこんなにスゴイ
- 第36回 ソフトウェア開発の「いま」と「近未来」の話
- 第37回 ルネサンスの巨匠たちに学ぶエンジニアリングの技
- 第38回 オブジェクト指向を超えて
- 第39回 ユーザー要件を引出すテクニック
- 第40回 ITプロジェクトを見える化する
- 第41回 ソフトウェアアーキテクチャって何なの?(前編)
- 第42回 ソフトウェアアーキテクチャって何なの?(後編)
- 第43回 ソフトウェアアーキテクトの役割
- 第44回 ソフトウェアアーキテクティングのプロセス
- 第45回 ソフトウェアアーキテクティングのメリット
- 第46回 ウォーターフォールから反復型への移行手順
- 第47回 トランザクション管理の複雑性を克服する パート1
- 第48回 トランザクション管理の複雑性を克服する パート2
- 第49回 汎用グラフィカルモデリング言語「SysML」 パート1
- 第50回 グラフィカルなモデル言語で製品構造を記述
- 第51回 キミのコードが汚い理由
- 第52回 「設計」や「構築」よりも重宝されるスキル
- 第53回 専門家に聞くモデル駆動開発のメカニズム
- 第54回 プロジェクトのはじめに計画を立てるのは無謀
- 第55回 「この開発プロジェクトは中止!」の基準
- 第56回 なるほど! ビジネスユースケース
- 第57回 そうだったのか! システムユースケース
- 第58回 不完全なコードは推敲フェイズで潰しておきたい
- 第59回 ビルドが全滅する原因
- 第60回 初歩の「Perl」「Python」「Ruby」
- 第61回 開発プロジェクトを「統治」するベストプラクティス
- 第62回 開発プロジェクト「統治」のピンポイント解説
- 第63回 反復開発の「ここはぜひカバーしたいポイント」
- 第64回 開発プロセス導入のアンチパターン
- 第65回 プロセスはチャンスが訪れるたびに改善する
- 第66回 自己管理型チームの利点と弱点
- 第67回 人事評価と開発者のモチベーション
- 第68回 鈍重な開発チームは鈍重なシステムを作る?
- 第69回 ソフトウェアが複雑なのは仕方がない?
- 第70回 ソフトウェアの複雑性を手なずける
- 第71回 見積もりの精度 Accuracy of Estimation
- 第72回 アジャイル開発の広範な普及を目指して
- 第73回 アジャイルとシステムテストの新たな関係(前編)
- 第74回 アジャイルとシステムテストの新たな関係(後編)
ホワイトペーパー(TechTargetジャパン)
|
|








