UML クラス図
今回は UML のクラス図についてです。
UML は統一モデリング言語という、システムの仕様や設計を図法 (ダイアグラム) で表記する為の記法が統一された言語の総称です。UML にはデータ構造を表すものや処理の流れを表すもの等の13種類のダイアグラムと記法があり、クラス図もその中のデータ構造を表す構造図の一種になります。
クラス図とは
クラス図はシステムを構成するクラス同士の関係性を表すダイアグラムで、各クラスの属性 (プロパティ) や操作 (メソッド) も記述することができます。
クラス図は下記のようなダイアグラムです。
上記ではクラス Article とクラス Category があります。
1つの四角形はクラスを表しています。クラスは3段に分けられ、1段目にクラス名、2段目にクラスが持つ属性、3段名にクラスが持つ操作を記述します。クラス Article の場合はクラス名はArticle、属性はIDタイトルカテゴリーID、操作はID 取得タイトル取得カテゴリー ID 取得です。
なお、クラス名は必須ですが属性と操作は省略可能です。
属性、操作は名前の前に+-等の記号を記述します。この記号は各属性や操作へのアクセス範囲を表しており、可視性といいます。
| 表記 | 説明 | |
|---|---|---|
| + | public | 全てのクラスからアクセス可能 |
| - | private | 自分自身のクラスからアクセス可能 |
| # | protected | 自分自身及び継承クラスからアクセス可能 |
| ~ | package | 同一パッケージ内の全てのクラスからアクセス可能 |
上記のクラス図を PHP のコードで表すと下記のようになります。
<?php
class Article
{
private int $id;
private string $title;
private int $categoryId;
public function getId(): int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function getCategoryId(): int
{
return $this->categoryId;
}
}
class Category
{
private int $id;
private string $name;
public function getId(): int
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
}
なお、クラス図がクラス同士の関係性を表す図であるのに対し、クラスが実体化された具体的なオブジェクト同士の関係性を表す図をオブジェクト図といいます。記法はオブジェクト図も同じです。
クラスの関係性
クラス図はクラス同士の関係性も表します。関連するクラスを線で結び、記号を加えることでその関係性を明示します。
| 表記 | 関係 | 説明 |
|---|---|---|
|
| 関連 | クラス A とクラス B の何らかの関連を表します。 |
|
| 集約 | クラス B はクラス A の一部でクラス A とクラス B は独立しています。 |
|
| コンポジション | クラス B はクラス A の一部でクラス A とクラス B は一体化しています。 |
|
| 依存 | クラス B はクラス A に依存し、クラス A の変更の影響を受けます。 |
|
| 汎化 | クラス B はクラス A の一種でクラス A を継承しています。 |
|
| 実現 | クラス B は抽象的なクラス A を具体化しています。 |
集約とコンポジションはどちらもクラス B がクラス A の一部ですが、クラス A (全体) とクラス B (一部) が独立しているか一体化しているかという点が異なります。
集約は両クラスが独立しています。独立とはクラス A が存在しなくてもクラス B が存在できる状態です。例えば会社 (クラス A) と社員 (クラス B) の関係を考えた時、会社が消滅しても社員まで消滅するわけではなく残り、別の会社に結びつくことも可能です。この関係が集約です。
一方でコンポジションは両クラスが一体化しています。一体化とはクラス A が存在しなければクラス B も存在しない状態です。例えば注文 (クラス A) と 注文明細 (クラス B) の関係を考えた時、注文が消滅した時に注文明細が単体で残ることはありません。クラス A とクラス B の存在期間が同じ関係をコンポジションといいます。
クラスの関係性には多重度というものもあります。多重度はクラスから生成されたインスタンスが相手クラスのインスタンスにいくつつながるかという数を表しています。記法はクラスを結ぶ線の両端に相手クラスに対する多重度を記述します。
| 表記 | 説明 |
|---|---|
| 1 | 1のみ |
| 0..* | 0以上 |
| 1..* | 1以上 |
| 1..3 | 2から3まで |
| 1, 3 | 1か3 |
上記のクラス図ではクラス Article の多重度は0..*、クラス Category の多重度は1です。これは複数の記事が1つのカテゴリーだけに関連することを表しています。
Article から見た場合、それぞれの記事は1つだけのカテゴリーに属します。一方 Category から見た場合、それぞれのカテゴリーには0個を含む複数の記事が属されます。その為、上記のような0..*1の多重度になります。
クラス図は UML の中でも基本となるダイアグラムなので、まずはクラス図をしっかりと覚えましょう。