クラス図とは
クラス図とは、オブジェクト指向プログラミングの設計において、システムの静的な構造を表現するための最も代表的な図で、クラス同士の関係を表した設計図です。
クラス図を見ると、次のことが一目でわかります。
- どんなクラスがあるか
- 各クラスが何を持っているか(属性・メソッド)
- クラス同士がどう関係しているか
クラス図の基本構成
クラス図では1つのクラスを、通常3つのセクションに分かれた長方形で表現します。
イメージ:
-----------------
| クラス名 |
-----------------
| 属性 |
-----------------
| 操作 |
-----------------
実例:
User
------------------
id: number
name: string
------------------
login(): void
logout(): void
- 上段:クラス名
そのクラスの名前(例:User, Car) - 中段:属性(プロパティ/フィールド)
クラスが持つデータ。
書式:アクセス修飾子 名前: 型 = 初期値 - 下段:操作(メソッド/関数)
クラスが実行する振る舞い。
書式:アクセス修飾子 名前(引数リスト): 戻り値の型
クラス図の表現方法
アクセス修飾子(+ - #)
クラスの外部からアクセスできるかどうかを記号で表します。
+ : public(どこからでもアクセス可能)
- : private(クラス内部のみ)
# : protected(自分と継承先のみ)
~ : package(同じパッケージ内のみ)
クラス同士の関係
クラス同士がどう繋がっているかを線と矢印で表します。
・汎化 (Inheritance)
継承のこと。is-aの関係(AはBの一種である)。
──▷(白抜きの三角矢印)で表す。
class Animal {
eat() {}
}
class Dog extends Animal {
bark() {}
}
・実現 (Realization)
インターフェースの実装。「こういう機能を持つことを約束する」。
- - -▷(白抜きの三角矢印 + 破線)で表す。
interface IUserService {
login(): void
}
class UserService implements IUserService {
login() {}
}
・関連 (Association)
クラス同士が繋がっている状態。
───(実線(矢印をつけることもある))で表す。
class Order {
user: User
}
・集約 (Aggregation)
全体と部分の関係(実務では「関連」で省略されることも多い)。合成と似ているが、集約は部分が単体でも生きられる。◇──(白抜きのひし形)で表す。
class Team {
players: Player[]
}
・合成 (Composition)
強い全体と部分の関係。集約と似ているが、合成は全体が消えたら、部分も消える。◆──(黒塗りのひし形)で表す。
class Order {
items: OrderItem[]
}
・依存 (Dependency)・
一時的にそのクラスを利用する関係。
- - - >(破線の矢印)で表す。
class Service {
execute(logger: Logger) {
logger.log("start")
}
}
多重度
関係を持つ相手がいくつ存在できるかを関連線の端に数値と記号を書くことで表現します。
1 : ちょうど1 必ず1つ
0..1 : 0 または 1
* : 0以上
1..*: 1以上
0..*: 0以上
m..n: m〜n個(範囲指定)
例:
User 1 ───── 0..* Post
class User {
posts: Post[]
}
class Post {
user: User
}
備考
インターフェースと抽象クラス
クラス図ではインターフェースと抽象クラスを、<<abstract>> <<interface>>というプロパティを追記して表現します。
イメージ:
<<abstract>>
-----------------
| クラス名 |
-----------------
| 属性 |
-----------------
| 操作 |
-----------------
ステレオタイプ
UMLの標準的な記号だけでは表現しきれない「意味」を補足するためのラベルです。 « »(ギュメ)で囲んで記述します。上記のインターフェースと抽象クラスの表現方法もその一種です。
例:
«boundary»
OrderPage
------------------
+ showPurchaseButton()
+ inputQuantity()
+ showErrorMessage()
│ 依存
▼
«control»
OrderManager
------------------
+ checkStock()
+ calculateTotal()
+ callPayment()
│ 参照
▼
«entity»
Product
------------------
name
price
stock
«control»
OrderManager
│
│ uses
▼
«interface»
PaymentProcessor
------------------
+ processPayment()
▲ 実現
│
«entity»
CreditCardPayment
------------------
+ processPayment()
«enumeration»
PaymentStatus
------------------
UNPAID
PAID
CANCELLED
静的メンバ
クラス図では、静的メンバを属性名や操作名に下線(アンダーライン)を引くことで表します。
- 静的属性:
_属性名: 型_ - 静的操作:
_メソッド名()_
例:
-------------------------
User
-------------------------
+ name: String
-------------------------
+ getName(): String
+ _createGuest(): User //静的メソッド
-------------------------