UMLとは?
UML(Unified Modeling Language)は、システムの設計や要件をビジュアルに表現するための統一モデリング言語です。クラス図、シーケンス図などの構造図・振る舞い図を用いて、複雑なシステムを理解しやすく整理できます。
UML図の分類
構造図(Structure Diagrams)
- ● クラス図(Class Diagram)
- ● オブジェクト図(Object Diagram)
- ● コンポーネント図(Component Diagram)
- ● 配置図(Deployment Diagram)
- ● パッケージ図(Package Diagram)
- ● 複合構造図(Composite Structure Diagram)
振る舞い図(Behavior Diagrams)
- ● ユースケース図(Use Case Diagram)
- ● シーケンス図(Sequence Diagram)
- ● アクティビティ図(Activity Diagram)
- ● ステートマシン図(State Machine Diagram)
- ● コミュニケーション図(Communication Diagram)
- ● タイミング図(Timing Diagram)
クラス図
クラスの構造と関係を表現。最も頻繁に使われる図式
┌─────────────────┐
│ クラス名 │
├─────────────────┤
│ - 属性1: 型 │
│ + 属性2: 型 │
├─────────────────┤
│ + メソッド1() │
│ - メソッド2() │
└─────────────────┘
● + public
● - private
● # protected
● ~ package
クラス間の関連
関連(Association)
クラスA ──── クラスB
依存(Dependency)
クラスA - - - - > クラスB
集約(Aggregation)
クラスA ◇──── クラスB
コンポジション(Composition)
クラスA ◆──── クラスB
汎化(Generalization/継承)
子クラス ────▷ 親クラス
実現(Realization)
実装クラス - - - - ▷ インターフェース
シーケンス図
オブジェクト間のメッセージのやりとりを時系列で表現
オブジェクトA オブジェクトB
│ │
│──メッセージ──→│
│ │
│←───戻り値───│
│ │
● 実線矢印(同期メッセージ)
● 破線矢印(戻り値/非同期)
● 縦線はライフライン
ユースケース図
システムの機能をユーザー視点で表現
┌──────────────┐
アクター│ │
├────┤ ユースケース │
│ │ │
│ └──────────────┘
│
👤
● アクター: システムの外部実体
● ユースケース: システムの機能
● 実線で接続(関連)
アクティビティ図
処理の流れ(フロー)を表現。フローチャートの進化版
● ●(黒丸): 開始ノード
● ◉(二重円): 終了ノード
● ◇(ひし形): 分岐・合流
● 角丸矩形: アクション
● 縦棒: 並行処理の分岐/合流
ステートマシン図
オブジェクトの状態遷移を表現
●(初期状態)
│
↓ イベント
┌────────┐
│ 状態A │
└────────┘
│
↓ イベント[条件]
┌────────┐
│ 状態B │
└────────┘
● 角丸矩形: 状態
● 矢印: 状態遷移(イベント・条件)
● ●: 初期状態、◉: 終了状態
よく使う記法まとめ
多重度(Multiplicity)
1 1つのみ
0..1 0または1
* 0以上
1..* 1以上
n..m n個以上m個以下
抽象クラス・IF
<<abstract>>
抽象クラス(斜体で表記)
<<interface>>
インターフェース
※ステレオタイプで表現
ノート(注釈)
┌─────────────┐
│ 注釈メモ │
│ │
└─────────────┘
│
│(破線で接続)
↓
┌───────┐
│ 要素 │
└───────┘
実務で役立つTips
設計の出発点
まずユースケース図で要件を整理し、その後クラス図・シーケンス図で詳細設計を進めるのが定石
適度な抽象度
すべての詳細を書き込む必要はない。目的に応じて必要な情報だけを記載すること
ツールの活用
PlantUML、Mermaid、Draw.io、Lucidchart などのツールを活用すると効率的に作図可能
コードと同期
リバースエンジニアリングツールでコードから図を生成したり、図からコードを生成する手法も有用
PlantUMLコードサンプル
クラス図(PlantUML)
@startuml
class クラスA {
- 属性1: String
+ メソッド1()
}
class クラスB {
- 属性2: int
+ メソッド2()
}
クラスA "1" -- "*" クラスB
@enduml
シーケンス図(PlantUML)
@startuml
actor ユーザー
participant システムA
participant システムB
ユーザー -> システムA: リクエスト
activate システムA
システムA -> システムB: 処理依頼
activate システムB
システムB --> システムA: 結果
deactivate システムB
システムA --> ユーザー: レスポンス
deactivate システムA
@enduml