クラスとその関係を表すUMLの構造図。
クラス図とは、クラスとその関係を表すUMLの構造図のことです。UML(Unified Modeling Language=統一モデリング言語、システム設計の図の共通ルール)の中で最もよく使われます。
クラス(=同じ種類のモノの設計図)は、3段の長方形で描きます。上から名前・属性(データ)・操作(できること)の順です。たい焼きの「型」に対して、焼き上がった一つひとつのたい焼きが「オブジェクト」だと考えると分かりやすいです。
上のツールで▶ボタンを押すと、図書館の蔵書管理を題材に、クラスの箱を作り、属性・操作を書き込み、クラスどうしを関連線でつないでいく流れを確認できます。
クラスどうしの関係は、線の先端の形で意味を区別します。主な関連線は次の3つです。
・汎化(白抜き三角の矢印):「〜は〜の一種」という継承(is-a)関係。子から親へ向ける
・集約(白抜きのひし形):「全体と部分」(has-a)の関係。部分は単独でも存在できる
・コンポジション(塗りつぶしのひし形):より強い「全体と部分」。全体が消えると部分も消える
身近な例で考えると、集約はバンドとメンバー(バンドが解散してもメンバーは生きている)、コンポジションは人と心臓(人が死ねば心臓も働けない)です。ひし形は必ず「全体」の側に付ける、と覚えておきましょう。
クラス図は、プログラムを書く前にシステムの構造を整理・共有する設計図として使います。オブジェクト指向設計の中心となる図です。
具体的な使い道は次のとおりです。
・設計の共有:チームでクラスの役割と関係を共通認識にする
・コードへの橋渡し:クラス名・属性・操作がそのままプログラムの雛形になる
・既存システムの理解:他人が作ったプログラムの構造を読み解く地図になる
クラス図は「時間とともに変化しない、システムの骨組み」を表します。これに対し、動きの流れを表すのがシーケンス図やアクティビティ図です。静的な構造はクラス図、動的な振る舞いは別の図、と役割分担を意識すると、UMLの図の使い分けが分かりやすくなります。
関連線の両端に書かれる数字を多重度(=いくつと関係しているかを表す数)といいます。「1対多」「多対多」といった関係の個数を示します。
よく使われる多重度の表記は次のとおりです。
・1:必ずちょうど1つ(例:貸出は必ず1冊の書籍に対応する)
・0..*(または *):0個以上(何個でもよい、例:1人の利用者が貸出を0回以上持てる)
・1..*:1個以上(少なくとも1つ必要)
・0..1:0か1(あってもなくてもよいが2つ以上はない)
上の図の例では、「1人の利用者は0回以上の貸出を持てる(借りていない人もいる)」「1件の貸出は必ず1冊の書籍に対応する」という意味になります。多重度を書くことで、「どれくらいの数がつながるか」という重要な制約を図の中に表現できます。
クラス図で迷いやすいのが「汎化(継承)を使うか、集約を使うか」です。判断の基準は2つの問いかけに集約されます。
・「〜は〜の一種(is-a関係)」→ 汎化(白抜き三角の矢印)を使う
例:「犬は動物の一種」「書籍は貸出物の一種」
・「〜は〜を持つ(has-a関係)」→ 集約(ひし形)を使う
例:「車はエンジンを持つ」「図書館は書籍を持つ」
なぜ区別するのか。継承(汎化)は「親の機能をそのまま使える・拡張できる」という強い関係で、設計の骨格になります。集約は「部品として持っている」だけなので、より緩い結びつきです。「これは一種か?それとも部品として持つだけか?」と自問すると判断しやすくなります。間違えると設計が崩れるため、2つの違いをしっかり区別することが重要です。