第5回 分類と分解をUMLで表現する
河合昭男
(有)オブジェクトデザイン研究所
2003/2/22
「第4回 オブジェクトをUMLで表現する」はUMLの第一歩として、クラス図の基本である関連、多重度、関連名、ロール名についてオブジェクト図で具体例を示しながら説明しました。今回はクラスの汎化関係、集約関係を中心にもう少し複雑なクラス図について説明します
汎化関係 |
【汎化と特化】
「第3回 複雑なものを単純に〜分類と分解〜」で説明したクラスの階層をUMLで表現すると、汎化関係という特殊な関係になります。図1は、UMLで表現した汎化のイメージです。スーパークラス側を白抜き三角にして、線でサブクラスとつなぐという決まった表記があります。
サブクラスからスーパークラスに、より一般化することを汎化(generalization)、逆にスーパークラスからサブクラスに、より特殊化することを特化(specialization)と呼びます。スーパークラスを親、サブクラスを子、3階層以上の場合はそれぞれ祖先、子孫と呼ぶこともあります。
第3回の図1「クラス階層−乗り物の分類」をUMLで表すと図2のようになります。汎化は何階層でも描くことができます。
図1 汎化関係
|
図2 上が第3回の図1「クラス階層−乗り物の分類」、下がUMLで表現した「乗り物」の汎化関係
|
【弁別子】
ところで、あるスーパークラスに2つのサブクラスがあったとします。このとき図3のように2つの描き方ができますが、これらの意味の違いはどこにあると思いますか?
図3 特化の記法
|
クラスをサブクラスに分類する方法は何通りも考えることができます。例えば「人」というクラスは性別により男性/女性、年齢により大人/子ども、あるいは職業により分類することができます。この分類の基準あるいは特化の条件を弁別子と呼びます。
次の2つの図(図4)を比べてください。クラス「人」の3つのサブクラスはすべて特化の基準が異なっています。このような場合は左のように汎化関係を別々にします。右のような描き方は通常しません。
図4 特化の基準の相違
|
【完全/不完全】
弁別子で分類したとき、すべてのサブクラスが挙げられている場合は「完全」、すべてでない場合は「不完全」と呼びます。『世界がもし100人の村だったら』(池田 香代子再話 C.ダグラス・ラミス対訳、マガジンハウス)という本に従うと、人を性別という弁別子で分類すると女性52人、男性48人で52+48=100なので「男性」と「女性」で完全です。住んでいる地域で分類するとアジア61人+アフリカ13人=74人なのでこれら2つのサブクラスだけでは不完全です(図5)。
図5 『世界がもし100人の村だったら』(マガジンハウス):参考
|
これをUMLで表現すると図6のようになります。
図6 弁別子と完全/不完全
|
【継承】
汎化関係によりサブクラスはスーパークラスの属性、操作、関連を継承します。親から子だけでなく、その子孫すべてに継承できるのです。例えば図7のようにPCをデスクトップ型とノート型に分類します。
図7 継承
|
■属性の継承
「ノートPC」はバッテリ容量のほか、メーカー、価格を属性として持つ。そのサブクラス「A4サイズPC」「B5サイズPC」の属性は「ノートPC」と同じ。「デスクトップPC」の属性はメーカー、価格、スロット数の3つ。そのサブクラス「家庭用PC」「ビジネス用PC」の属性は「デスクトップPC」と同じ。
■操作の継承
「PC」の操作「価格取得()」は、PCのサブクラスとさらにそのサブクラスに継承される。
■関連の継承
「ディスク」はPCのほか、PCのサブクラスとさらにそのサブクラスと関連する。
【多重継承】
分類というのは意外と難しいものです。例えば名刺を整理して管理するために、仕事関係、友人関係、コミュニティ関係……とグループに分類します。友人のAさんと仕事関係ができたとき、関係者の名刺はまとめておきたいので仕事関係に移します。今度は友人に連絡しようとして友人の名刺の箱を見たとき、Aさんの名刺を移動したことを失念してしまう可能性があります。「友人かつ仕事関係」というグループを追加しなければなりません。これが多重継承の考え方です。仕事関係、友人関係、コミュニティ関係……といったグループは完全に分かれている(disjoint)のではなく、重なり合っている(overlapping)ということです。
例えば「FAX」というクラスと「プリンタ」というクラスを作ると「FAXプリンタ」というオブジェクトはどちらのクラスのインスタンスと考えればよいでしょうか。クラスを集合と考えると「FAX」という集合と「プリンタ」という集合は重なり合っています(図8)。
図8 「FAX」という集合と「プリンタ」という集合は重なり合っている
|
クラス図で表現すると、「FAXプリンタ」というクラスは「FAX」クラスと「プリンタ」クラスの両方から多重継承することになります(図9)。
意味的には多重継承が考えられるのですが、モデルが複雑になり混乱をまねくことがあります。また実装言語ではサポートされていないものが多いようで、特に必要のない限り使用しない方が安全です。実際、電器店でも「FAXプリンタ」はFAX売り場かプリンタ売り場のどちらに並べるか迷うでしょう。
図9 多重継承
|
集約 |
【集約】
第3回で説明した複合オブジェクトは、UMLでは集約関係で表現します。集約は全体と部分の関係を示します。UMLでは全体側を白抜きのひし形で表現します。
図10 集約
|
第3回の「図3 車を構成する部品」をUMLで表すと図11のようになります。集約の階層は何階層でも描くことができます。
図11 上が第3回の「図3 車を構成する部品」、下はUMLで「車」と集約を表現した
|
【コンポジション】
UMLでは強い集約関係をコンポジションと呼び、全体側を黒塗りのひし形で表現します。部分側のインスタンスの存在は全体側に依存し、部分側のみで存在することはできません(図12)。
図12 コンポジション
|
【集約とコンポジション】
PCは本体、ディスプレイとキーボードから成ります。xx社製xxモデルというデスクトップPCを購入すると、これらの3つの部品で1つのセットになっています。これら3つの部品はそれぞれ独立してほかのPCに流用することができます。本体が壊れてもディスプレイを取り外して使用できます。
ノートPCは本体、ディスプレイとキーボードが一体構造となっていて、このようなことはできません。本体が壊れたからといってディスプレイを取り外して使用することは通常できません。このような強い集約関係がコンポジションです(図13)。
図13 デスクトップPCは「集約」、ノートPCは「コンポジション」で表現できる
|
【問題】
電気スタンドには電球式と蛍光灯式があります。汎化と集約関係を用いて以下の条件を満たすクラス図を作成してください。
電球式と蛍光灯式 |
電球式は電球を、蛍光灯式は蛍光灯を持つ |
蛍光灯式にはインバータ型とグロー型 |
グロー型はグローを持つ |
電気スタンドはスイッチを持つ |
今回はUMLの第2回として、汎化関係、集約関係について具体例を示しながら説明しました。
クラス図はUMLの基本モデルである静的モデルを表現するダイアグラムです。次回はUMLの動的モデルについて説明します。UMLにはオブジェクトの協調動作を表す相互作用図とオブジェクトのライフサイクルを表すステートチャート図があります。相互作用図はシーケンス図とコラボレーション図からなります。
IT Architect 連載記事一覧 |
【参考文献】
『まるごと図解 最新 オブジェクト指向がわかる』、河合昭男、技術評論社
『まるごと図解 最新UMLがわかる』、河合昭男、技術評論社【2002/12新刊】
『ゼロからわかるオブジェクト指向の世界』、岩田裕道+手島歩三、日刊工業新聞社
『Object-Oriented Methods:A Foundation』、James Martin+James Odell、Prentice Hall
プロフィール |
河合昭男(かわいあきお) 大阪大学理学部数学科卒業、日本ユニシス株式会社にてメインフレームのOS保守、性能評価の後、PCのGUI系基本ソフト開発、クライアント/サーバシステム開発を通してオブジェクト指向分析・設計に携わる。 オブジェクト指向の本質を追究すべく1998年に独立後、有限会社オブジェクトデザイン研究所設立、理論と実践を目指し現在に至る。 事業模型倶楽部、日本XPユーザ会、パターン言語のコミュニティなどソフトウェア新技術の学習と普及を行うコミュニティ活動に参画。著書『まるごと図解 最新オブジェクト指向がわかる』(技術評論社)、『まるごと図解 最新UMLがわかる』(技術評論社)。『UML Press』(技術評論社)、『ソリューションIT』(リックテレコム)ほかの専門誌に多数執筆。ホームページ「オブジェクト指向と哲学」。 |