Yuta Kimura·木村祐太
researchmap

UML Guide

クラス図・シーケンス図 作成ガイド

クラス図・シーケンス図の作成課題に取り組むための資料です。課題の進め方、UML記法のポイント(可視性・多重度・関連の種類・メッセージの種類など)、そしてMermaidを使った具体的な作図例を、手順とあわせて紹介します。

この教材は日本語のみで提供しています。 This learning material is available in Japanese only.

進め方の全体像Overview

5ステップで、要求からシーケンス図まで

対象システムの説明を読み、クラス図で静的な構造を、シーケンス図で動的な振る舞いを描く。最後に2つの図の整合性を確認し、見直してから提出する。基本はクラス図からシーケンス図の順だが、行き来しながら洗練させてよい。

要求を読むクラス図シーケンス図整合性確認見直し・提出
01

要求を読む

対象システムの説明・ユースケースから、登場する「モノ」と「動き」を洗い出す。

02

クラス図

「モノ」=クラスとその属性・操作・関連を整理し、静的構造を描く。

03

シーケンス図

「動き」=ある操作が実行される際のオブジェクト間メッセージを時系列で描く。

04

整合性確認

2つの図の登場オブジェクト・メソッド名が一致しているか相互チェックする。

05

見直し・提出

記法・粒度・可読性をチェックリストで確認して提出する。

位置づけWhere they fit

UMLと2種類の図の位置づけ

UML(統一モデリング言語)は、ソフトウェアの構造や振る舞いを図で表す共通の記法です。本課題で扱うのは、代表的な次の2つの図です。

構造モデル・静的

クラス図(Class Diagram)

「システムは何でできているか」を表す。

  • クラス(モノ・概念)とその属性・操作
  • クラス間の関連・継承・多重度
  • 時間の概念は持たない(スナップショット)
  • 例:会員・注文・商品の関係を表す
振る舞いモデル・動的

シーケンス図(Sequence Diagram)

「処理がどう進むか」を時系列で表す。

  • オブジェクト(ライフライン)間のやりとり
  • メッセージ(メソッド呼び出し)の順序
  • 上から下へ時間が流れる
  • 例:ログイン処理の手順を表す

Part 1

クラス図:システムの静的な構造を表す図

クラスの読み方(名前・属性・操作・可視性)、関連・多重度・集約・コンポジション・継承、作成手順とよくある間違い、Mermaidでの作図例までを順に見ていきます。

基本の構成

クラス図は「クラス(箱)」と「クラス間の線(関連)」で構成されます。1つのクラスは、上からクラス名・属性・操作の3つの区画を持ちます。

User -id : int -name : String +login() : bool Order -orderId : int -date : Date +total() : int places 1 *

1人のUserは0個以上のOrderを持つ(多重度 1 対 *)。区画は上から順にクラス名・属性・操作。

  • クラス名:そのクラスが表すモノ・概念(名詞)。先頭は大文字、単数形が基本(例:Order, BankAccount)
  • 属性(attributes):クラスが持つデータ。書式は「可視性 名前 : 型」(例:-balance : int)
  • 操作(operations):クラスができる振る舞い。書式は「可視性 名前(引数) : 戻り値」(例:+deposit(a:int) : void)

記法ポイント:可視性(visibility)

属性・操作の先頭につける記号で、外部からのアクセス範囲を表します。情報隠蔽の観点から、属性は原則 private(-)にします。

記号名称アクセスできる範囲目安
+publicどのクラスからでも公開する操作
-private同じクラス内のみほぼ全ての属性
#protected同じクラス+サブクラス継承で使う要素
~package同じパッケージ内限定的に使用
覚え方:「+」はプラス=開放(public)、「-」はマイナス=閉じる(private)、「#」は階段=継承(protected)。原則、属性は「-」、操作は必要なものだけ「+」にする。Mermaidでは + - # ~ をメンバー名の前に書くだけで反映される。

記法ポイント:関連と多重度

クラス同士のつながりを「関連(線)」で、対応する個数を「多重度」で表します。

多重度意味
1ちょうど1
0..10または1(任意)
* / 0..*0以上(何個でも)
1..*1以上
2..52〜5個

読み方の例:User 側の多重度が 1、Order 側の多重度が * の関連は、「1人の会員は0個以上の注文を持ち、1つの注文は1人の会員に属する」ことを表す(会員・注文・商品の関連と多重度は、この後の作図例で使用)。

記法ポイント:関連の種類(線の使い分け)

つながりの強さ・意味によって、線と矢印を使い分けます。迷ったら「関連」で十分です。

A B 関連(association) Mermaid: A -- B / 最も基本のつながり A B 依存(dependency) Mermaid: A ..> B / 一時的な利用(引数・戻り値) A B 集約(aggregation) Mermaid: A o-- B / 全体と部分、部分は単独でも存在できる A B コンポジション(composition) Mermaid: A *-- B / 強い全体と部分、全体が消えると部分も消える A B 継承/汎化(generalization) Mermaid: A <|-- B / is-a、子は親の一種(中空三角)

左のA・Bはクラスを表す模式図。線の実線・破線と端の記号(ひし形・三角)で関連の種類が変わる。

種類意味Mermaid記法例
関連(association)2つのクラスに構造的なつながりがある。最も基本--会員と注文
依存(dependency)一時的に利用する(引数・戻り値など)..>注文と日付
集約(aggregation)全体と部分。部分は単独でも存在できるo--チームと社員
コンポジション(composition)強い全体と部分。全体が消えると部分も消える*--注文と明細
継承/汎化(generalization)is-a。子は親の一種(中空三角)<|--会員と利用者

クラス図の作成手順(6ステップ)

STEP 1

名詞を抜き出す

要求文・ユースケースから登場する「モノ・概念」(名詞)を洗い出す。これがクラス候補になる。

STEP 2

クラスを選ぶ

候補から重要なものをクラスにする。単なる属性で済むもの(氏名・金額など)は除外する。

STEP 3

属性・操作を入れる

各クラスが「持つデータ」と「できること」を書く。可視性(- + #)も忘れずに付ける。

STEP 4

関連を引く

関係するクラスを線でつなぐ。動詞(〜が〜を持つ/使う)が関連のヒントになる。

STEP 5

多重度を付ける

関連の両端に個数(1, *, 0..1 など)を書く。線の種類(集約・継承)も判断する。

STEP 6

見直す

孤立クラスがないか、命名は統一されているか、粒度は適切かを確認する。

よくある間違い(Bad → Good)

✕属性に可視性を付けていない(名前だけ)
◎-name : String のように可視性+型を明記する
✕クラス名が動詞・複数形(例:「注文する」「Orders」)
◎クラス名は名詞・単数形にする(Order, Customer)
✕氏名や金額など、ただの値を独立クラスにしている
◎値は属性にする。独立して扱う概念だけクラス化する
✕多重度を書かず、関連の意味が読み取れない
◎両端に 1 / * などの多重度を必ず付ける
✕なんでもコンポジション(◆)でつないでいる
◎強い包含だけ◆にし、基本は関連(線のみ)か集約(◇)にする

Mermaidで描く①:基本(classDiagram)

Mermaidはテキストで図を書ける記法。先頭に classDiagram と書き、class でクラスを定義する。

order.mmd
classDiagram
    class User {
        -id : int
        -name : String
        +login() bool
    }
    class Order {
        -orderId : int
        -date : Date
        +total() int
    }
    %% 関連 + 多重度 + ラベル
    User "1" --> "*" Order : places

上のコードが描画されると、区画つきのUserクラス・Orderクラスと、多重度付きの関連(本節冒頭の図)になる。

Mermaidで描く②:関連・継承の記号

クラス間の記号を覚えれば、関連の種類を簡単に書き分けられる。

relations.mmd
classDiagram
    User <|-- Member
    %% 継承(汎化):中空三角
    Order "1" *-- "*" OrderItem
    %% コンポジション:黒ひし形
    OrderItem "*" --> "1" Product
    %% 関連 + 多重度
    Order ..> Coupon
    %% 依存:破線矢印
記号関連の種類
<|--継承(汎化)
*--コンポジション
o--集約
-->関連(矢印あり)
..>依存
<|..実現(インタフェース実装)

Part 2

シーケンス図:オブジェクト間のやりとりを時系列で表す図

ライフライン・実行仕様(アクティベーション)・メッセージ、同期/非同期/返信メッセージの書き分け、alt・opt・loopによる条件分岐と繰り返し、作成手順とMermaidでの作図例までを見ていきます。

基本の構成

上部に並ぶオブジェクト(ライフライン)の間で、メッセージが上から下へ時間順にやりとりされる様子を表します。

User UI Controller Database 1: click Search 2: search(keyword) 3: query(keyword) 4: result rows 5: view model 6: show results

ライフライン=オブジェクト+点線。細い矩形=実行仕様(アクティベーション、処理中)。実線+塗り矢じり=呼び出し、破線+線矢じり=戻り(返信)。番号順に時間が上から下へ流れる。

記法ポイント:メッセージの種類

種類意味Mermaid記法
同期メッセージ相手の処理完了を待つ呼び出し。通常のメソッド呼び出し(実線+塗り矢じり)->>
返信メッセージ呼び出し元へ結果を返す。省略されることもある(破線)-->>
非同期メッセージ完了を待たずに次へ進む。並行処理など(実線+線矢じり)-)
自己メッセージ同じオブジェクト内のメソッド呼び出し同じ相手を指定

矢じりの形と線(実線/破線)で意味が変わる。まずは「同期(->>)+返信(-->>)」を押さえればよい。

記法ポイント:制御構造(alt / opt / loop)

複数のメッセージを枠(フラグメント)で囲み、条件分岐や繰り返しを表現します。

制御構造意味例
alt(分岐)条件で処理が分かれる(if / else)。枠を区切り条件を併記する[valid] / [invalid]
opt(任意)条件を満たすときだけ実行する(elseなし)。省略可能な処理に使う[在庫あり]
loop(繰り返し)条件の間、処理を繰り返す。枠に繰り返し条件を書く[全明細について]
User LoginUI AuthService submit(id, pw) verify(id, pw) result alt [valid] go to home else [invalid] show message

まず verify(id, pw) を呼んで結果(result)を受け取り、その結果で分岐する。alt枠の左上タブに条件(valid)、区切り線の下にelseの条件(invalid)を書く。Mermaidでは alt ... else ... end で囲む。

Mermaidでは alt / opt / loop ... end で囲む。altの分岐はelseで区切る。枠は入れ子(ネスト)にもできるが、使いすぎると読みにくいので主要な流れに絞る。

シーケンス図の作成手順(6ステップ)

STEP 1

ユースケースを1つ選ぶ

「ログインする」「商品を検索する」など、1つの代表的な処理シナリオを決める。

STEP 2

登場オブジェクトを並べる

関わるアクター・画面・制御・データなどを上部に左から並べる(クラス図のクラスと対応)。

STEP 3

開始メッセージを描く

アクターの操作を起点に、最初の矢印を引く(例:User → UI)。

STEP 4

やりとりを順に追う

処理の流れに沿って、呼び出し→戻りのメッセージを上から順に描く。

STEP 5

条件・繰り返しを囲む

分岐や繰り返しがあれば alt / opt / loop の枠で囲む。

STEP 6

整合性を確認

メッセージ名がクラス図の操作名と一致しているかを確認する。

よくある間違い(Bad → Good)

✕1枚に全シナリオを詰め込み、矢印が大量で読めない
◎1図=1ユースケース。主要な流れに絞る
✕戻りの矢印(破線)が無く、結果が返るのか不明
◎呼び出し(実線)と戻り(破線)をセットで描く
✕メッセージ名が日本語の文章(「データを調べる」)
◎メソッド名で書く(search(keyword))
✕クラス図に無いオブジェクトが突然登場する
◎登場オブジェクトはクラス図のクラスと対応させる
✕時間の流れ(上→下)が守られていない
◎上から下へ時系列。番号で順序を明示する

Mermaidで描く①:基本(sequenceDiagram)

先頭に sequenceDiagram。participant で登場人物、矢印でメッセージを書く。->>は呼び出し、-->>は戻り。

search.mmd
sequenceDiagram
    actor User
    participant UI
    participant Controller
    participant Database
    User->>UI: click Search
    UI->>Controller: search(keyword)
    Controller->>Database: query(keyword)
    Database-->>Controller: result rows
    Controller-->>UI: view model
    UI-->>User: show results

上のコードを描画すると、本節冒頭の検索処理のシーケンス図になる。

Mermaidで描く②:alt / loop

alt ... else ... end で分岐、loop ... end で繰り返しを囲む。分岐の条件を決める呼び出し(verify)は alt の前に置く。

login.mmd
sequenceDiagram
    actor User
    participant LoginUI
    participant AuthService
    User->>LoginUI: submit(id, pw)
    LoginUI->>AuthService: verify(id, pw)
    AuthService-->>LoginUI: result
    alt valid
        LoginUI-->>User: go to home
    else invalid
        LoginUI-->>User: show message
    end

上のコードを描画すると、本節のalt枠を使ったログイン処理の図になる。

2図の関係

クラス図とシーケンス図の関係

2つの図は別物ではなく、同じシステムを別の側面から見たものです。互いに整合している必要があります。

  • クラス図 → シーケンス図:クラス図の「クラス」=シーケンス図の「オブジェクト」になる。クラス図の「操作(メソッド)」=シーケンス図の「メッセージ」になる
  • シーケンス図 → クラス図:シーケンス図で必要になったメッセージ=クラスに必要な操作。やりとりに登場したのに対応クラスが無ければ追加を検討する
相互チェックの例:シーケンス図に「UI -> Controller : search(keyword)」があるなら、クラス図のControllerクラスに「+search(keyword)」という操作があるはず。無ければ、どちらかの図が不完全なので、両方を見比べて補う。

提出前

提出前チェックリスト

提出する前に、クラス図・シーケンス図それぞれで次の項目を確認する。

クラス図

5項目

  • クラス名は名詞・単数形になっているか
  • 属性・操作に可視性(+ - #)を付けたか
  • 関連の両端に多重度を書いたか
  • 線の種類(関連/集約/継承)は適切か
  • 孤立した(線のない)クラスは無いか
シーケンス図

5項目

  • 1図=1ユースケースに絞れているか
  • 呼び出し(実線)と戻り(破線)が揃っているか
  • メッセージ名はメソッド名で書いたか
  • 登場オブジェクトはクラス図と対応するか
  • alt/opt/loopの条件を書いたか

最後に

参考ツールと作図のコツ・まとめ

作図ツール

01

Mermaid

テキストで記述する。Markdown/GitHubで表示でき、修正・履歴管理が容易。Mermaid Live Editor(ブラウザ)で即プレビューできる。

02

draw.io / diagrams.net

ドラッグ操作で直感的に作図できるツール。

03

PlantUML

テキスト記述で作図する、より詳細なUMLに対応したツール。

作図のコツ

  • いきなり清書せず、紙やホワイトボードで下書きする
  • 最初から完璧を目指さず、描いては直すを繰り返す
  • 要素を詰め込みすぎない(重要なものに絞る)
  • 命名はクラス図・シーケンス図で統一する
まとめ:クラス図=静的な構造、シーケンス図=動的な振る舞い。役割を意識して描き分ける。記法(可視性・多重度・関連・メッセージ)を正しく使い、2つの図の整合性を保つ。まずは手を動かす。Mermaidなら少ない記述で素早く試行錯誤できる。困ったらこの資料に戻ろう。